脚踏实地《数据结构第二章》第七节:顺序表和链表的比较

一:逻辑结构(对比)

都属于线性表,都是线性结构

二:物理结构/存储结构(对比)

2.1 顺序表

在这里插入图片描述

存储结构:顺序存储

  1. 拥有随机存储的特性
  2. 其各个结点只需要存储数据元素本身,不需要存储其他的冗余信息,存储密度高
  3. 顺序存储的这个结构要求系统给其分配一整片连续的存储空间,所以大片连续空间分配不方便,改变容量不方便

2.2 链表

在这里插入图片描述

存储结构:链式存储

  1. 各个结点可以离散存储在不同的空间当中,且存储空间不要求连续,所以离散的小空间分配方便(malloc函数),改变容量方便
  2. 当我们想要知道第i个结点时,我们只能从第一个结点(表头)依次往后寻找,此外还需要花费一定的空间存储指针,所以不可随机存取,存储密度低

三:数据的运算/基本操作(对比)

考研重点是:创建、增、删、查,销毁和改考的比较少

3.1 创建(初始化)

在这里插入图片描述

3.1.1 顺序表

需要预分配大片连续空间

  1. 若分配空间过小,则之后不方便拓展容量;
  2. 若分配空间过大,则浪费内存资源

如果采用静态分配的方式实现的话,顺序表的容量是不可更改

如果采用动态分配的方式实现的话,容量可改变,但需要移动大量元素,时间代价高

3.1.2 链表

只需分配一个头结点(也可以不要头结点,只声明一个头指针),之后方便拓展(弹性和灵活性比顺序表更胜一筹)

每次需要扩展的时候,只需要申请一小片新的空间,如何通过指针的方式将其连接到头节点(头指针)上就可以了

3.2 销毁

在这里插入图片描述

3.2.1 顺序表

就其length的值修改为0,但是顺序表占用的空间回收分为下面的两种情况

  1. 静态分配实现的顺序表:当定义的静态数组的生命周期结束之后,系统会自动的回收空间
  2. 动态分配实现的顺序表:需要手动free(malloc和free必须是成对出现的

3.2.2 链表

链表的销毁就是将链表的结点依次消除(free函数)

3.3 增删

在这里插入图片描述

3.3.1 顺序表

顺序存储的存储结构要求数据元素在内存里是相邻的、有序的;所以插入/删除元素要将后续元素都后移/前移

时间复杂度O(n);时间开销主要来自移动元素

若数据元素很大,则移动的时间代价很高

3.3.2 链表

插入/删除元素只需修改指针即可

时间复杂度O(n);时间开销主要来自查找目标元素

查找元素的时间代价更低

在这里插入图片描述

3.4 查

3.4.1 顺序表

按位查找:时间复杂度为O(1)

按值查找:时间复杂度为O(n);若表内元素有序,可在O(log2n)时间内找到

3.3.2 链表

按位查找(只能从第一个元素依次往后查找):时间复杂度为O(n)

按值查找:时间复杂度为O(n);无论是否有序都是O(n)

四:如何选择

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

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

五:知识回顾与重要考点

开放式问题答题思路:(如下例)

实现线性表时,用顺序表还是链表好?(6分)

  1. 顺序表和链表的逻辑结构都是线性结构,都属于线性表。
  2. 但是二者的存储结构不同,顺序表采用顺序存储…(特点,带来的优点缺点);链表采用链式存储… (特点、导致的优缺点)。
  3. 由于采用不同的存储方式实现,因此基本操作的实现效率也不同。当初始化.时…;当插入一个数据元素时…;当删除一个数据元素时…;当查找一个数据元素时…
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

?abc!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值