顺序表和链表
顺序表和链表的比较
逻辑结构方面:
都属于线性表,都属于线性结构,各个元素之间属于一对一关系
存储结构方面:
顺序表:
1、采取顺序存储的方法,每个元素大小都相等,因此我们只需知到起始地址,就能找到第i个元素存放的位置,
2、具有随机存取的特性,
3、 存储密度高
4、顺序表建立需要申请一整片的连续空间,较为死板,容易造成浪费
5、两者的malloc申请也有区别,顺序表的malloc申请是指定多大的空间然后进行申请,链表的malloc申请是在while循环中建立一个元素申请一个内存空间,
链表:
1、 链表是按照链式存储结构
2、 链表中包含一些地址信息,所以存储密度较小
3、 不可随机存取,必须遍历查询
4、 更改容量方便,一些操作也比较容易,只需更改地址就行
基本操作:
顺序表:
建立:预先分配连续空间,对内存利用率不高,虽然可以通过malloc进行动态申请,但是成本过高需要移动大量的元素因为申请之后需要将元素信息复制到新区域中
销毁:设置顺序表:length=0 这样使得顺序表为一个空表,但是顺序表原本的内存空间还是存在,这里内存空间的销毁一种是系统自动回收,数组有自己的生存时间,超过时间自动回收,还有一种是malloc动态申请的需要自己手动free,因为申请的数组为栈空间存储,系统会自动收回,但是malloc申请的在堆空间中,必须自己手动free
增删:主要操作为移位,时间复杂度最大为o(n)主要是移动元素
查找:按位查找时间复杂度为o(1),按值查找时间复杂度为o(n)但是如果为有序顺序表可以通过一些方法使得时间复杂度为o(log2n)
链表:
建立:只需分配一个头结点或者不带头结点的头指针,malloc动态申请也比较简单
销毁:通过一个while循环依次将每个元素free
增删:主要操作为更改指针,时间复杂度最大为o(n)主要是遍历查找想要操作的位置
查找:无论按值还是按位时间复杂度都是o(n)
ps:头指针就是头结点的地址,有头节点就相当于多了一个零元素,没有头结点就相当于头指针的地址就是第一个元素的地址
易错点:带有尾指针的单循环链表删除最后一个元素时,需要将其前驱的next域置NULL,所以需要查找,时间复杂度为o(n)
带有头指针的单循环链表删除第一个元素时,需要将最后一个结点的next域置成新的第一个元素,所以也需要遍历到最后一个结点,时间复杂度为o(n)

浙公网安备 33010602011771号