顺序表 compares 链表
顺序表一般表现为数组,使用一组地址连续的存储单元依次存储数据元素。
它具有如下特点:
①长度固定,必须在分配内存之前确定数组的长度
②存储空间连续,存储密度大
③要访问特定元素,可以使用索引访问,时间复杂度为 O(1)
④要想在顺序表中插入或删除一个元素,都涉及到之后所有元素的移动,因此时间复杂度为 O(n)
链表,实际就是通过指针连接的多个结构体,表中的每个结点都保存有指向下一个结点的指针,所有结点串成一条链,并不需要使用连续的存储空间。
它具有以下特点
①长度不固定,可以任意增删
①存储空间不连续,存储密度小(占用额外的空间以存储指针)
①要访问特定元素,只能从链表头开始,循环遍历到该元素,时间复杂度为 O(n)
①在特定的数据元素之后插入或删除元素,不涉及到其他元素的移动,因此时间复杂度为 O(1)
其中:
①单链表是只包含指向下一个结点的指针,只能单向遍历
①双链表包含指向下一个结点的指针,也包含指向前一个结点的指针,因此可双向遍历
①循环链表则是将尾结点与首结点链接起来,形成一个环状结构,在某些情况下会适用
顺序表和链表相比
②对于顺序表而言,如果一直使用比较复杂的数据,我们肯定会感到很反感,因为需要预先对数组大小进行定义,并且还要让其空间足够大,这样才能满足我们的要求,如果分配的太多,难免又会浪费内存,这样一来,它的存储空间在数据处理过程中显得极为不方便,因为谁也不想对将要处理的数据做一个空间的预算,这是程序员都很忌讳的。而链表支持动态分配内存空间,可以任意为一些数据进行空间的分配,根据需要进行内存单元的开辟
③顺序表的空间利用率高,查找、存取效率高,插入和删除比较慢,不可以增长长度,有空间限制和浪费。链表的空间利用率低下(占用额外的空间以存储指针,malloc开辟,空间碎片多),查找、存取效率低,插入和删除速度快没有空间限制,存储元素的个数无上限,基本只与内存空间大小有关
* 频繁的查找却很少的插入和删除操作可以用顺序表存储,如堆排序,二分查找
* 如果频繁的插入和删除操作,而很少的查询就可以使用链表存储
* 顺序表适宜于做查找这样的静态操作;链表适宜于做插入、删除这样的动态操作