线性结构
概念
二元组
B
=
(
K
,
R
)
B=(K,R)
B=(K,R)
K
=
a
0
,
a
1
,
.
.
.
,
a
n
−
1
K={a_0,a_1,...,a_{n-1}}
K=a0,a1,...,an−1 (
R
=
r
R={r}
R=r)
- 有一个唯一的开始结点,它没有前驱,有一个唯一的直接后继
- 一个唯一的终止结点,它有一个唯一的直接前驱,而没有后继
- 其它的结点皆称为内部结点,每一个内部结点都有且仅有一个唯一的直接有前驱,也有一个唯一的直接有后继
- < a i , a i + 1 > < a_i , a_{i+1}> <ai,ai+1> a i a_i ai 是 a i + 1 a_{i+1} ai+1 的前驱, a i + 1 a_{i+1} ai+1 是 a i a_i ai 的后继
- 前驱/后继关系 r r r,具有反对称性和传递性
特点:
- 均匀性: 虽然不同线性表的数据元素可以是各种各样的,但对于同一线性表的各数据元素必定具有相同的数据类型和长度
- 有序性: 各数据元素在线性表中都有自己的位置,且数据元素之间的相对位置是线性的
分类:
-
按复杂程度划分
- 简单的: 线性表、栈、队列、散列表
- 高级的: 广义表、多维数组、文件…
-
按访问方式划分
- 直接访问型(direct access)
- 顺序访问型(sequential access)
- 目录索引型(directory access)
-
按操作划分 - 线性表 - 所有表目都是同一类型结点的线性表
- 不限制操作形式
- 不限制操作形式
-
根据存储的不同分为:
-
顺序表,链表
-
栈(LIFO, Last In First Out)
-
- 插入和删除操作都限制在表的同一端进行(后进先出)
- 插入和删除操作都限制在表的同一端进行(后进先出)
-
队列(FIFO, First In First Out)
- 插入操作在表的一端,删除操作在另一端(先进先出)
-
三个方面
线性表的逻辑结构
-
主要属性
- 线性表的长度
- 表头(head)
- 表尾(tail)
- 当前位置(current position)
线性表的存储结构
-
顺序表
- 按索引值从小到大存放在一片相邻的连续区域
- 紧凑结构,存储密度为 1
-
链表
-
单链表
-
双链表
-
循环链表
-
线性表运算
- 建立线性表
- 清除线性表
- 插入一个新元素
- 删除某个元素
- 修改某个元素
- 排序
- 检索
线性表类模板
template <class T> class List {
void clear();// 置空线性表
bool isEmpty();// 线性表为空时,返回 true
bool append(const T value);
// 在表尾添加一个元素 value, 表的长度增 1
bool insert(const int p, const T value);
// 在位置 p 上插入一个元素 value, 表的长度增 1
bool delete(const int p);
// 删除位置 p 上的元素, 表的长度减 1
bool getPos(int& p, const T value);
// 查找值为 value 的元素并返回其位置
bool getValue(const int p, T& value);
// 把位置 p 元素值返回到变量 value
bool setValue(const int p, const T value);
// 用 value 修改位置 p 的元素值
};