第二章 线性结构
(线性表、栈、队列:存储结构+逻辑结构+操作)
2.1 线性表的类型定义
2.2 线性表的顺序表示和实现
2.3 线性表的链式表示和实现
2.4 举例
2.1 线性表的类型定义
-
线性结构的特点:
在数据元素的非空有限集中,
1)有且仅有一个开始结点;
2)有且仅有一个终端结点;
3)除第一个结点外,集合中的每个数据元素均有且只有一个前驱;除最后一个结点外,集合中的每个数据元素均有且只有一个后继。
4)逻辑上相邻,物理上也相邻
- 线性序列:线性结构中的所有结点按其关系可以排成一个序列,记为 (a 1 ,…,a i ,a i+1 ,…a n )
1. 线性表
1)线性表是n(n ≥0)个数据元素的有限序列。
2)线性表是一种最常用且最简单的数据结构。
含有n个数据元素的线性表是一个数据结构:
List = (D,R)
其中:D = {a i | a i ∈D 0 ,i=1,2,…n,n≥0}
R = {N}, N = {< a i‐1 , a i > | a i‐1 , a i ∈D 0 , i = 2,3,…n}
D 0 为某个数据对象——数据的子集
特性:均匀性,有序性(线性序列关系)
3)线性表的长度及空表
线性表中数据元素的个数n(n≥0)定义为线性表的长度当线性表的长度为0 时,称为空表。
当线性表的长度为0 时,称为空表。
a i 是第i个数据元素,称i为a i 在线性表中的位序。
2. 线性表的基本操作
1)InitList(&L) 初始化,构造一个空的线性表
2)ListLength(L) 求长度,返回线性表中数据元素个数
3)GetElem(L,i,&e) 取表L中第i个数据元素赋值给e
4)LocateElem(L,e) 按值查找,若表中存在一个或多个值为e的结点,返回第一个找到的数据元素的位序,否则返回一个特殊值。
5)ListInsert(&L,i,e) 在L中第i个位置前插入新的数据元素e,表长加1。
6)ListDelete(&L,i,e) 删除表中第i个数据元素,e返回其值,表长减1。
3、存储结构
顺序表—线性表的顺序存储结构
用“物理位置”相邻来表示线性表中数据元素之间的逻辑关系
根据线性表的顺序存储结构的特点,只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以,线性表的顺序存储结构是一种随机存取的存储结构。
2.3 线性表的链式表示和实现
1. 线性链表
特点:在内存中用一组任意的存储单元来存储线性表的数据元素,用每个数据元素所带的指针来确定其后继元素的存储位置。这两部分信息组成数据元素的存储映像,称作结点。
- 结点:数据域 + 指针域(链域)
- 链式存储结构:n个结点链接成一个链表
- 线性链表(单链表):链表的每个结点只包含一个指针域
2.基本操作
1)取元素
2)插入元素
3)删除元素
4)建立链表
5)有序链表的合并
6)查找(按值查找)
7)求长度
8)集合的并运算
3.循环链表
1)循环链表——是一种首尾相接的链表。
循环链表最后一个结点的next指针不为 0 (NULL),而是指向了表头结点。在循环链表中没有NULL为简化操作,在循环链表中往往加入表头结点。
特点:循环链表中,从任一结点出发都可访问到表中所有结点;而在单链表中,必须从头指针开始,否则无法访问到该结点之前的其他结点
循环链表与单链表不同的是链表中表尾结点的指针域不是NULL,而是链表头结点的指针H(链表指针)
4.双向链表 (Doubly Linked List)
双向链表是指在前驱和后继方向都能游历(遍历)的线性链表。
1) 双向链表的结点结构:
前驱方向 <- (a)结点结构 -> 后继方向
双向循环链表的插入算法
p→prior = current; (1)
p→next =current→next; (2)
current→next = p; (3)
p→next→prior = p; (4)
双向循环链表的删除算法
current→next→prior = current→prior;
current→prior→next = current→next;