首页 > 代码库 > 各种线性表的比较

各种线性表的比较

<style>a { text-decoration: none; font-size: 12px; color: red } .buryit { display: none } .diggit { border: 3px dotted red } .diggit:hover { border: 3px dotted orange } .diggit:active { border: 3px dotted green } .postTitle2 { font-size: 30px; color: pink }</style>

顺序表  [代码]

优点

1)存取速度快:随机存取结构,存取第i个元素所花的时间与i无关,与表长无关,即时间复杂度为O(1)

(2)存储密度高:存储空间的利用率高,顺序表的空间几乎全用来存储数据,只有一小点存储长度值。

 

缺点

1)插入删除慢:高密度的存储方式导致插入删除需要移动大量的元素,时间复杂度为O(n)。

(2)易产生碎片:如果经常进行插入和删除操作,会导致空间产生碎片。从而降低了性能。

(3)不可动态扩容:需要在声明表的时候将空间大小提前分配好。

 

 

单链表  [代码]

优点:

1)插入删除快:插入和删除操作不需要移动任何元素,与表长无关,时间复杂度为O(1)

(2)可动态扩容:不需要像顺序表那样需要在一开始先分配好长度,空间分配比较自由。

 

缺点:

1)查找读取慢:读取必须从头结点开始沿着链扫描,才能获取元素,时间复杂度为O(n)

(2)存储利用低:每个节点的存储结构都需要分配额外的空间来指明下一个节点的位置。

 

 

循环链表  [代码]

与单链表的性质是一样的,只不过将单链表最后一个节点的指针 "指向NULL" 改为 "指向头节点"

形成一个环状,优缺点基本和单链表一致。

不同点:单链表只能访问某个节点的后继节点,而无法访问该节点之前节点,循环链表可以实现从

任意一个节点出发访问其他节点。

 

 

双向链表  [代码]

虽然单循环链表可以通过一个节点访问表中所有节点,但是要找到直接前驱却要遍历整个表

因此为了加快寻找某个节点的前驱,可以在每个节点的结构体上添加一个直接访问前驱的指

针域来快速定位前驱节点。

 

 

静态链表  [代码]

缺点:

1)不可动态扩容,静态链表是静态的,需要一开始分配好链表的长度。

(2)没有数组随机存取的特性,即下标所表示的顺序不是链表逻辑的顺序。

(3)总体上没有静态链表灵活,操作起来也是比麻烦和复杂的

 

说明

与单链表性质是一样的,只是是在数组上建立的静态链表,优缺点基本和单链表相同。

静态链表最好用单链表替代,因为静态链表的缺点多,优点和单链表一样。

而静态链表的存在是因为在C语言之前的一些语言没有指针,如Basic Fotran等语言

而为了实现单链表的功能所以在数组上创建了静态链表,虽然不推荐使用,

但静态链表的思路还是值得学习和了解一下的。

 

欢迎各位转载,但请指明出处:http://www.cnblogs.com/demonxian3/p/7125697.html

                                                                                                    如果你觉得本文不错,请点击这里↓↓

各种线性表的比较