本文为个人笔记总结
一、 定义和特点
线性表是具有相同特性的数据元素的一个有限序列
- 有且仅有一个开始和一个终端结点,并且所有结点最多只有一个直接前驱和一个直接后继。
- 同一线性表中的元素必然具有相同特性
由n(n>=0)个数据元素(结点)a1,a2,…..an组成的有限序列。
- 其中数据元素的个数n定义为表的长度
- 当n=0时称为空表
- 将非空的线性表(n>0)记作:(a1、a2… an)
二、线性表-顺序表示
线性表的顺序表示又称做顺序存储结构或顺序映像。
顺序存储定义:
把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。
换句话说,逻辑上相邻,物理上也相邻。
顺序表的特点:
以物理位置相邻表示逻辑关系
任一元素均可随机存取
线性表:(a1,a2,….,ai-1, ai , ai+1 ,…. an)
- 线性表的第一个数据元素a1的存储位置,称作线性表的起始位置或基地址。
- 依次存储,地址连续-中间没有空出存储单元。
- 可以根据起始位置和数据元素的长度快速找到要查找的位置
每一个数据元素的存储位置都和线性表的起始位置相差一个和数据元素在线性表中的位序成正比的常数。
由此,只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。
顺序存储结构的优点
- 存储密度大
- 可以随机存储表中任一元素
顺序存储结构的缺点
- 插入、删除某一元素,需要移动大量元素
- 浪费存储空间
- 属于静态存储形式,数据元素的个数不能自由扩充
三、线性表-链式表示
线性表的链式表示又称为非顺序映像或链式映像。
链式存储结构的特点
(1)结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻 (2)整个链表的存取必须从头指针开始进行,并通过每个结点的指针域依次向后顺序扫描其余结点,所以寻找第一个结点和最后一个结点所花费的时间不等。这种存取元素的方法被称为 顺序存取法。
链式存储结构的定义
- 用一组任意的存储单元存储线性表的数据元素。
- 这组存储单元可以是连续的,也可以是不连续的。
- 链表中元素的逻辑次序和物理次序不一定相同。
相关术语:
结点:数据元素的存储映像。由数据域和指针域组成。
链表:n个结点由指针链组成一个链表。它是线性表的链式存储映像,称为链式存储结构。
单链表、双链表、循环链表:
- 结点只有一个指针域的链表,称为单链表或线性链表。
- 结点有两个指针域的链表,称为双链表。
- 首尾相接的链表称为循环链表。
头指针、头结点和首元结点:
- 头指针:是指向链表中第一个结点的指针
- 首元结点:是指链表中存储第一个数据元素a1的结点
- 头结点:是在链表的首元结点之前附设的一个结点;
单链表、循环链表、双向链表的时间效率比较
| 链表类型 | 查找表头结点 (首元结点) | 查找表尾结点 | 查找结点 *P 的前驱结点 |
|---|---|---|---|
| 带头结点的单链表 L | L->next 时间复杂度 O(1) | 从 L->next 依次向后遍历 时间复杂度 O(n) | 通过 p->next 无法找到其前驱 |
| 带头结点仅设头指针 L 的循环单链表 | L->next 时间复杂度 O(1) | 从 L->next 依次向后遍历 时间复杂度 O(n) | 通过 p->next 可以找到其前驱 时间复杂度 O(n) |
| 带头结点仅设尾指针 R 的循环单链表 | R->next 时间复杂度 O(1) | R 时间复杂度 O(1) | 通过 p->next 可以找到其前驱 时间复杂度 O(n) |
| 带头结点的双向循环链表 L | L->next 时间复杂度 O(1) | L->prior 时间复杂度 O(1) | p->prior 时间复杂度 O(1) |
四、优缺点对比
| 比较项目 | 顺序表 | 链表 | |
|---|---|---|---|
| 空间 | 存储空间 | 预先分配,会导致空间闲置或溢出现象 | 动态分配,不会出现存储空间闲置或溢出现象 |
| 存储密度 | 不用为表示结点间的逻辑关系而增加额外 的存储开销,存储密度等于1 | 需要借助指针来体现元素间的逻辑关系,存储密度小于1 | |
| 时间 | 存取元素 | 随机存取,按位置访问元素的时间复杂度为 O(1) | 顺序存取,按位置访问元素时间复杂度为 O(n) |
| 插入、删除 | 平均移动约表中一半元素,时间复杂度为 O(n) | 不需移动元素,确定插入、删除位置后,时间复杂度为 O(1) | |
| 适用情况 | ① 表长变化不大,且能事先确定变化的范围 ② 很少进行插入或删除操作,经常按元素位置序号访问数据元素 | ① 长度变化较大 ② 频繁进行插入或删除操作 |