脚踏实地《数据结构第二章》第七节:顺序表和链表的比较
作者:互联网
一:逻辑结构(对比)
都属于线性表,都是线性结构
二:物理结构/存储结构(对比)
2.1 顺序表
存储结构:顺序存储
- 拥有
随机存储
的特性 - 其各个结点只需要存储数据元素本身,不需要存储其他的冗余信息,
存储密度高
- 顺序存储的这个结构要求系统给其分配一整片连续的存储空间,所以
大片连续空间分配不方便,改变容量不方便
2.2 链表
存储结构:链式存储
- 各个结点可以离散存储在不同的空间当中,且存储空间不要求连续,所以
离散的小空间分配方便(malloc函数),改变容量方便
- 当我们想要知道第i个结点时,我们只能从第一个结点(表头)依次往后寻找,此外还需要花费一定的空间存储指针,所以
不可随机存取,存储密度低
三:数据的运算/基本操作(对比)
考研重点是:创建、增、删、查
,销毁和改考的比较少
3.1 创建(初始化)
3.1.1 顺序表
需要预分配大片连续空间:
- 若分配空间
过小
,则之后不方便拓展容量
; - 若分配空间
过大
,则浪费内存资源
如果采用静态分配的方式实现的话,顺序表的容量是不可更改的
如果采用动态分配的方式实现的话,容量可改变,但需要移动大量元素,时间代价高
3.1.2 链表
只需分配一个头结点(也可以不要头结点,只声明一个头指针),之后方便拓展(弹性和灵活性比顺序表更胜一筹)
每次需要扩展的时候,只需要申请一小片新的空间,如何通过指针的方式将其连接到头节点(头指针)上就可以了
3.2 销毁
3.2.1 顺序表
就其length的值修改为0,但是顺序表占用的空间回收分为下面的两种情况
- 静态分配实现的顺序表:当定义的静态数组的生命周期结束之后,系统会自动的回收空间
- 动态分配实现的顺序表:需要手动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分)
- 顺序表和链表的逻辑结构都是线性结构,都属于线性表。
- 但是二者的存储结构不同,顺序表采用顺序存储…(特点,带来的优点缺点);链表采用链式存储… (特点、导致的优缺点)。
- 由于采用不同的存储方式实现,因此基本操作的实现效率也不同。当初始化.时…;当插入一个数据元素时…;当删除一个数据元素时…;当查找一个数据元素时…
标签:存储,顺序,元素,结点,链表,查找,第七节,数据结构 来源: https://blog.csdn.net/yyuggjggg/article/details/122589310