顺序表和链表的区别(通俗易懂)

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(log{_{2}}^{n}

链表:都是从头结点开始遍历查找

按位查找:O(n)

按值查找:O(n)


总结:

表长难以预估,经常要增加/删除元素        --链表

表长可预估,查询(搜索)操作较多         --顺序表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值