您的位置:首页 > 其它

比较总结线性表的几种主要存储结果

2017-10-09 14:59 295 查看
线性表是一种最基本、简单的数据结构,数据元素之间仅具有单一的前驱和后继关系,是具有相同类型的数据元素的有限序列。在刚接触数据结构时候,学习了线性表的六种存储结构,分别是顺序表、单链表、循环链表、双链表、静态链表和间接寻址。下面就一一总结一下吧。

顺序表

顺序表是用一段地址连续的存储单元依次存储线性表的数据元素。类型相同和连续的存储单位,这些都是数组的特点,所以通常使用一维数组来实现顺序表。

优点:

(1)存储密度高;

(2)可以随机存取结点。

缺点:

(1)长度为定值,中途无法扩充;

(2)插入删除需要移动结点,效率低。

(3)数组要求占用连续的存储空间,会造成存储空间的“碎片”。

单链表

单链表是用一组任意的存储单元存放线性表的元素,这组存储单元可以连续也可以不连续,甚至可以零散分布在内存的任意位置。在实现的过程中,每个存储单元在存储数据元素的同时,还必须存储其后继元素所在的地址信息,这个地址信息称为指针。

优点:

(1)插入删除不需要移动结点,效率高;

(2)动态申请内存,充分利用内存,不会造成存储空间的“碎片”。

缺点:

(1)查找和存取元素需要多次操作指针来遍历和连接链表,效率低。

循环链表

在单链表中,将终端结点的指针域由空指针改为指向头结点,使整个单链表形成一个环,这种头尾相接的单链表称为循环链表。

优点:

(1)从循环链表中任意结点出发。课扫描到其他结点,增加了链表操作的灵活性。

缺点:

(1)循环链表中没有明显的尾端,可能会使循环链表的处理操作进入死循环,需要格外注意循环条件。

双链表

在单链表的每个结点中再设置一个指向其前驱结点的指针域,这样就形成了双链表。实际应用中常采用带头结点的循环双链表。

优点:

(1)相比单链表,可以直接访问前一个结点。

缺点:

(1)相比单链表,多了一个前驱指针域,在操作上变复杂了。

(2)相比单链表,多了一个前驱指针域,加大了在结构上的内存开销。

静态链表

静态链表是用数组来表示单链表,用数组元素的下标来模拟单链表的指针。

优点:

(1)插入和删除元素时,不需要移动元素,效率高。

缺点:

(1)没有解决连续存储分配带来的表长难以确定的问题。

间接寻址

间接寻址是将数组和指针结合起来的一种方法,它将数组中存储数据元素的单元改为存储指向该元素的指针。

优点:

(1)保持了顺序表随机存取的优点;

(2)改进了插入和删除操作的时间性能。

缺点:

(1)没有解决连续存储分配带来的表长难以确定的问题。

总结:

六种存储结构各有各的优势,也各有各的劣势。

利用指针动态申请内存的(如单链表、循环链表、双链表),可以充分利用内存空间,也不需要去考虑表长的确定问题(表长最大就是所有能用的内存了),但是在存取数据操作比较多,相比而言循环链表和双链表在存取方面比单链表要灵活,但是它们的结构在内存上的开支比单链表要大。就是牺牲了结构的开支,提高了一下遍历的性能。

利用到数组来实现的(如顺序表、静态链表、间接寻址),在存取方面上十分方便快捷,但是依旧没有解决连续存储分配带来的表长难以确定的问题,会造成存储空间的“碎片”。静态链表和间接寻址,两者都是综合了数组和指针的概念的方法。

静态链表在插入和删除元素时候,模拟了链表的解决方法,不需要移动元素。这比顺序表的效率高了不少,但静态链表在结构上多了一个模拟指针的元素,在结构上内存的开支大了。有许多编程语言没有指针,这可能就是静态链表存在的其中一个原因吧。

间接寻址在插入和删除操作的时候和顺序表貌似差不多,与其不同的是,间接寻址移动的不是元素而是指向元素的指针。虽然该算法的时间复杂度仍为O(n),但当元素占用的空间较大时,间接寻址比顺序表的插入删除的移动操作快得多。

一轮的分析过后,在实际操作中应该按照实际来确定使用那种结构来存储。比如在查询操作使用的比较频繁时,使用顺序表会好一些;在插入、删除操作使用的比较频繁时,使用单链表会好一些。总的来说就是要尽可能的发挥出每一种线性表的优点,这样写出来的程序性能就会有所提升了吧。

不难发现,大部分的线性表都是根据顺序表和单链表改良的,所以顺序表和单链表必须多加练习了。

这里总结的篇幅不多,有错漏,请大家在评论留言一下,共同进步。(‾^‾)ง⁼³₌₃

新世界的大门 (๑•̀ㅂ•́)و✧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: