文章目录
顺序表
顺序存储定义
把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。
简言之,逻辑上相邻,物理上也相邻
顺序存储方法
用一组地址连续的存储单元依次存储线性表的元素,可通过数组V[n]来实现。
图解
复杂度
查找、插入、删除算法的平均时间复杂度O(n)
空间复杂度S(n)=O(1) 没有占用辅助空间
顺序表的特点
- 利用数据元素的存储位置表示线性表中相邻数据元素之间的前后关系,即线性表的逻辑结构与存储结构一致。
- 在访问线性表时,可以快速地计算出任何一个数据元素的存储地址。因此可以粗略地认为,访问每个元素所花时间相等。
这种存取元素的方法被称为随机存取法
顺序表的优点
- 存储密度大(结点本身所占存储量/结点结构所占存储量)
- 可以随机存取表中任一元素
顺序表的缺点
- 在插入、删除某一元素时,需要移动大量元素
- 浪费存储空间
- 属于静态存储形式,数据元素的个数不能自由扩充
链表
链式存储结构
结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻
线性表的链式表示又称为非顺序映像或链式映像。
链式的实现
通过指针来实现
|数据|指针|
各结点由两个域组成:
数据域:存储元素数值数据
指针域:存储直接后继结点的存储位置
链式存储有关的术语
1.结点
数据元素的存储映像。由数据域和指针域两部分组成
2.链表
n 个结点由指针链组成一个链表。它是线性表的链式存储映像,称为线性表的链式存储结构
3.单链表、双链表、循环链表
结点只有一个指针域的链表,称为单链表或线性链表
有两个指针域的链表,称为双链表
首尾相接的链表称为循环链表
循环链表示意图:
4.头指针、头结点和首元结点
头指针是指向链表中第一个结点的指针
首元结点是指链表中存储第一个数据元素a1的结点
头结点是在链表的首元结点之前附设的一个结点;数据域内只放空表标志和表长等信息
链表的逻辑结构示意图
讨论
1.如何表示空表?
有头结点时,当头结点的指针域为空时表示空表
2.在链表中设置头结点有什么好处?
- 首元结点的地址保存在头结点的指针域中,所以在链表的第一个位置上的操作和其它位置一致,无须进行特殊处理
- 便于空表和非空表的统一处理。无论链表是否为空,头指针都是指向头结点的非空指针,因此空表和非空表的处理也就统一了。
3.头结点的数据域内装的是什么
头结点的数据域可以为空,也可存放线性表长度等附加信息,但此结点不能计入链表长度值。
链表的特点
- 结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻
- 访问时只能通过头指针进入链表,并通过每个结点的指针域向后扫描其余结点,所以寻找第一个结点和最后一个结点所花费的时间不等
这种存取元素的方法被称为顺序存取法
链表的优点
- 数据元素的个数可以自由扩充
- 插入、删除等操作不必移动数据,只需修改链接指针,修改效率较高
链表的缺点
- 存储密度小
- 存取效率不高,必须采用顺序存取,即存取数据元素时,只能按链表的顺序进行访问(顺藤摸瓜)