C#数据结构线性表(顺序表链表IList数组)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#数据结构线性表(顺序表链表IList数组)线性表
线性表是最简单、最基本、最常⽤的数据结构。
数据元素 1 对 1的关系,这种关系是位置关系。
特点
(1)第⼀个元素和最后⼀个元素前后是没有数据元素,线性表中剩下的元素是近邻的,前后都有元素。
(2)线性表中的元素是有限的(List),线性表中的数据类型⼀致。
(3)线性表表⽰⽅法 L={a1,a2,a3,a4…….an},L=(D,R)
(4)每⼀个元素都有前驱和后继,第⼀个元素只有后继,最后⼀个元素只有前驱。
实例
例如:1~100的整数是⼀个线性表
{“zhangsan”, “lisi”, “wangwu”}
……
A.顺序表
所有的操作都是根据建⽴在线性结构的基础之上进⾏的,线性表接⼝表⽰如下:
public interface IListDS<T>
{
int GetLength(); //求长度
void Clear();//清空线性表
bool IsEmpty();//判断是否为空
void Append(T item);//追加元素
void Insert(T item,int i);//插⼊元素
T Delete(int i);//删除元素
T GetElem(int i);//获取元素
int Locate(T value);//查找元素
void Reverse();//倒置
}
操作
1.插⼊操作:
30在插⼊之前数据表没有什么变化,当30数据出⼊到第i个位置后,后⾯的数据需要向后移动,那么插⼊的
数据越靠前,所需要移动的次数越多,如果i=0 那么需要向后移动 n 个位置,如果插⼊到最后⼀个,那么
顺序表就不需要移动,如果插⼊的数据的位置i的概率为Pi,那么需要移动的位置次数为n/2,在顺序表中移动
其中⼀半的数据,那么插⼊操作的时间复杂度为0(n)。
2.删除操作:顺序表删除操作和插⼊操作⼀致,时间都是浪费在移动数据上,时间复杂度也为0(n)
3.读取操作:直接读取到顺序表中的数值⽐如 IListDS[i]元素,那么时间复杂度为 0(1) 只需要取⼀次即可。
4.查找操作:查找需要找到数据位置i,然后判断数值是否⼀致,这个类似于插⼊和删除,时间复杂度:0(n)
5.倒置操作:倒置操作只需要把前后对⽐把第i个元素和第n-i个元素交换即可,时间复杂度也为:0(n)
B.单链表
对⽐顺序表,逻辑相同的数据在物理地址上也相同,在顺序表上查找⼀个位置上的数据⾮常⽅便,这是顺序表的优势所在,那么问题来了,在顺序表插⼊或者删除⼀个数据时候往往需要移动剩下的数据,那么这样会影响效率,接下来学习⼀下线性表的另外⼀个存储结构----链式存储(Linked Strorage),这样的线性表叫做(Linked List),对单链表的操作也不需要移动其他数据元素,但也失去顺序表可随机存储的优点。
从两张图我们可以看到单链表的结构和顺序表的⼀个差异
单链表实现的⽅法:
pulic class LinkedList<T>:IListDS<T>
{
Pulic Node<T> Head;//属性
pulic LinkedList();//构造器
pulic GetLength();//获取长度
pulic Clear();//清空
pulic bool IsEmpty();//判断是否为空
pulic void Append(T item);//追加
pulic void Insert(T item,int i);//i位置插⼊
pulic void Delete(T item);//删除元素
pulic T GetElem(int i);//获取单链表第i个元素
pulic int i Location(T item);//查找位置
pulic void Reserver();//倒置
}
操作
1.获取长度
单链表和顺序表的长度过去⽅法不⼀致,因为单链表是连续的顺序空间,⽽单链表
从头引⽤头开始,⼀个节点⼀个节点的便利,直到表的末尾。
那么问题来了:刚刚介绍单链表物理空间不也是连续的吗?这个笔者个⼈理解,初始化数据是物理连续,⽽新插⼊的数据不会按照物理地址排列,所以所单链表还是要便利整个内容来计算长度,时间复杂度为 0(n)。
2.清空操作
清空操作是指将单链表所有的节点使得单链表为空,此时头引⽤head为null.清空单链表的算法实现如下:
pulic void Clear()
{
head=null;
}
需要注意的是,单链表清空后,原来节点所占⽤的空间不会⼀直保留,⽽由垃圾回收器进⾏回收和顺序表不⼀样的是,顺序表是连续的空间,数组分配的空间仍然保留。
3.附加操作
附加操作,是要便利单链表中所有的元素,然后在链表的尾部添加元素,时间复杂度为:0(n);
线性表的顺序存储和链式存储各有优缺点,线性表如何存储取决于使⽤的场合。
如果不需要经常在线性表中进⾏
插⼊和删除,只是进⾏查找,那么,线性表应该顺序存储;如果线性表需要经常插⼊和删除,⽽不经常进⾏查找
,则线性表应该链式存储。
C 结合单向链表,肯定也有有双向链表,双向链表也是有上⾯的基本操作,然后思考相关的问题:时间复杂度问题。
D 循环列表:循环链表是在单链表和双向链表的基础上头尾相连Last.Next=>Header.Head
C#中的线性表
说道C# 线性表那就是List,在1.1中提供了⾮泛型接⼝ IList,接⼝中的项是object,⾮泛型IList是从ICollection
接⼝继承⽽来,是所有线性表的接⼝,⽤了这么长时间的List才发现IList是线性结构,IList分为三类:只读的,⼤
⼩不可变,⼤⼩可变的。
只读的IList:不能被修改,插⼊或者删除。
⼤⼩不变的IList:不能在表中插⼊或删除,但是可以修改表中的项。
⼤⼩可变的ILIST: 可以操作,可以插⼊或者删除
⾮泛型的IList接⼝声明如下:
interface IList:ICollenciton,IEnumberable
{
//共有属性
bool IsFiexedSize{get;} //只读,如果IList有固定⼤⼩
bool IsReadOnly{get;} //只读,如果ILIST是只读的
object this[T index] {get;set;} //索引器得到某个类型
int add(object value);
void clear();
int indexof(object value);
bool contains(ojbject value);
void insert(index,object value);
void remove();
void removeat();
}
.NET 框架中⼀些集合实现了IList接⼝,如ArrayList,ListDictionary,StringCollection,String Dictionary. .NET 线性表中顺序存储采⽤的是数组,⽽链式的存储⽅式则是:IList接⼝。
未完待续…….。