1.存储密度
顺序表的存储密度高
链表中的结点除了存储数据,还要存储指向下一结点的指针
2.存取方式
顺序表可以随机存取,因为顺序表是连续存储的,并且每个元素的大小相同,只要知道第一个元素的地址,就能知道第i个元素的地址
链表要寻找第i个结点时,必须从头结点开始依次往后寻找,不可以随机存取。
3.分配空间
顺序表中的元素是在一片连续的空间存储的,所以给顺序表分配空间与改变顺序表容量大小较麻烦
链表各个结点是离散存放在不同的空间中,所以每次添加结点只需要用malloc申请空间即可
4.初始化表
顺序表在初始化时需要预分配大片连续空间,若分配空间过小,则之后不方便拓展容量;若分配空间过大,则浪费内存资源。
链表只需要分配一个头结点(或者不分配头结点,只是声明头结点)
5.删除表
链表的删除可以通过循环将各个结点依次遍历删除(free(p))
顺序表占用空间的回收分两种情况
静态分配是声明一个静态数组,请求系统分配,删除表时系统会自动回收
动态分配是声明一个动态数组(malloc),malloc函数申请的空间是属于内存的堆区,堆区的内存空间不会由系统自动回收,删除表时,就需要用(free(p)),所以malloc和free是成对出现的
6.插入和删除表
顺序表插入和删除表都要对i后续的元素进行整体后移或前移
时间复杂度O(n)开销主要来自于移动元素
链表的插入和删除只需要修改指针的指向就可以了
时间复杂度O(n)开销主要来自于遍历查找目标元素
7.查找元素
顺序表
按位查找 O(1)
按值查找
若顺序表中的元素无序,就要从第一个元素开始查找,时间复杂度是O(n)
若是有序的,就可以利用折半查找等方法,将时间复杂度降为O()
链表:都是从头结点开始遍历查找
按位查找:O(n)
按值查找:O(n)
总结:
表长难以预估,经常要增加/删除元素 --链表
表长可预估,查询(搜索)操作较多 --顺序表