diff --git a/README.md b/README.md index d8cc550..0727bd0 100644 --- a/README.md +++ b/README.md @@ -216,8 +216,62 @@ $$ O(1) < O(log_2n) < O(n) < O(nlog_2n) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n) $$ -## 3. [线性表](ch2/README.md) +## 3. [线性表](ch2/README.md#线性表) -## 4. [栈和队列](ch3/README.md) +- [定义](ch2/README.md#1-定义) +- [基本操作](ch2/README.md#2-基本操作) +- [顺序表](ch2/sequence/README.md#顺序表) + - [静态分配](ch2/sequence/README.md#1-静态分配) + - [动态分配](ch2/sequence/README.md#2-动态分配) +- [单链表](ch2/single-link/README.md#单链表) + - [带头结点](ch2/single-link/README.md#4-带头结点的单链表) + - [不带头结点](ch2/single-link/README.md#3-不带头结点的单链表) +- [双链表](ch2/double-link/README.md#双链表) +- [循环链表](ch2/circular-link/README.md#循环链表) + - [循环单链表](ch2/circular-link/README.md#1-循环单链表) + - [循环双链表](ch2/circular-link/README.md#2-循环双链表) +- [静态链表](ch2/static-link/README.md#静态链表) +- [顺序表 V.S 链表](ch2/README.md#9-顺序表-vs-链表) -## 5. [串](ch4/README.md) +## 4. [栈和队列](ch3/README.md#栈和队列) + +- [栈](ch3/stack/README.md#栈) + - [顺序栈](ch3/stack/README.md#1-顺序栈) + - [共享栈](ch3/stack/README.md#18-共享栈) + - [链栈](ch3/stack/README.md#2-链栈) +- [队列](ch3/queue/README.md#队列) + - [队列的顺序实现](ch3/queue/README.md#1-队列的顺序实现) + - [队列的链式实现](ch3/queue/README.md#2-队列的链式实现) + - [双端队列](ch3/README.md#3-双端队列) +- [栈的应用](ch3/stack-applications/README.md#栈的应用) + - [括号匹配](ch3/stack-applications/README.md#1-括号匹配) + - [表达式求值](ch3/stack-applications/README.md#2-表达式求值) + - [递归](ch3/stack-applications/README.md#3-递归) +- [队列的应用](ch3/README.md#5-队列的应用) + - 树的层次遍历 + - 图的广度优先遍历 + - 操作系统资源分配 +- [矩阵的压缩存储](ch3/matrix/README.md#矩阵的压缩存储) + - [对称矩阵](ch3/matrix/README.md#3-对称矩阵) + - [三角矩阵](ch3/matrix/README.md#4-三角矩阵) + - [三对角矩阵](ch3/matrix/README.md#5-三对角矩阵) + - [稀疏矩阵](ch3/matrix/README.md#6-稀疏矩阵) + +## 5. [串](ch4/README.md#串) + +- [定义](ch4/README.md#1-定义) +- [基本操作](ch4/README.md#2-基本操作) +- [串的存储结构](ch4/README.md#3-串的存储结构) + - [顺序存储](ch4/README.md#31-顺序存储) + - [链式存储](ch4/README.md#32-链式存储) +- [基本操作的实现](ch4/README.md#4-基本操作的实现) + - [求子串](ch4/README.md#41-求子串) + - [串的比较](ch4/README.md#42-串的比较) + - [求串在主串中的位置](ch4/README.md#43-求串在主串中的位置) +- [朴素模式匹配算法](ch4/README.md#5-朴素模式匹配算法性能分析) +- [KMP 算法](ch4/README.md#6-KMP-算法) + - [改进思路](ch4/README.md#61-改进思路) + - [next 数组](ch4/README.md#62-next-数组) + - [nextval 数组](ch4/README.md#63-KMP-算法优化) + +## 6. [树与二叉树](ch5/README.md#树与二叉树) diff --git a/ch2/README.md b/ch2/README.md index d8ee812..83e3469 100644 --- a/ch2/README.md +++ b/ch2/README.md @@ -54,43 +54,43 @@ Tips: - 循环链表 - 静态链表 -## 4. [顺序表](sequence/README.md) +## 4. [顺序表](sequence/README.md#顺序表) - 优点:可随机存取,存储密度高。 - 缺点:要求大片连续空间,改变容量不方便。 -## 5. [单链表](single-link/README.md) +## 5. [单链表](single-link/README.md#单链表) - 缺点:无法逆向检索,有时候不太方便。 -## 6. [双链表](double-link/README.md) +## 6. [双链表](double-link/README.md#双链表) -### 6.1. 初始化 +### 6.1. [初始化](double-link/README.md#1-初始化) 头结点 `prior`、`next` 都指向 `NULL`。 -### 6.2. 插入(后插) +### 6.2. [插入(后插)](double-link/README.md#2-插入) - 注意新插入结点、前驱结点、后继结点的指针修改。 - 边界情况:新插入结点在最后一个位置,需特殊处理。 -### 6.3. 删除(后删) +### 6.3. [删除(后删)](double-link/README.md#3-删除) - 注意删除结点的前驱结点、后继结点的指针修改。 - 边界情况:如果被删除结点是最后一个数据结点,需特殊处理。 -### 6.4. 遍历 +### 6.4. [遍历](double-link/README.md#4-遍历) - 从一个给定结点开始,后向遍历、前向遍历的实现(循环的终止条件)。 - 双链表不可随机存取,按位查找、按值查找都只能用遍历的方式实现。 -## 7. [循环链表](circular-link/README.md) +## 7. [循环链表](circular-link/README.md#循环链表) - 如何判空 - 如何判断结点 `p` 是否是表尾、表头结点 - 如何在表头、表中、表尾插入、删除一个结点 -## 8. [静态链表](static-link/README.md) +## 8. [静态链表](static-link/README.md#静态链表) 用数组的方式实现的链表。 @@ -102,7 +102,7 @@ Tips: - 不支持指针的低级语言。 - 数据元素数量固定不变的场景(如操作系统的文件分配表 FAT)。 -## 9. 顺序表 VS 链表 +## 9. 顺序表 V.S 链表 三要素: diff --git a/ch3/README.md b/ch3/README.md index ca3c475..226c618 100644 --- a/ch3/README.md +++ b/ch3/README.md @@ -8,7 +8,7 @@ 栈和队列都是**操作受限**的线性表。 -## 1. [栈](stack/README.md) +## 1. [栈](stack/README.md#栈) ### 1.1. 定义 @@ -57,36 +57,36 @@ $$ =42 $$ -### 1.3. [顺序栈](stack/README.md) +### 1.3. [顺序栈](stack/README.md#1-顺序栈) 顺序存储,用静态数据实现,并需要记录栈顶指针。 基本操作 -- 初始化(创) -- 进栈(增) -- 出栈(删) -- 获取栈顶元素(查询) +- [初始化(创)](stack/README.md#12-初始化栈) +- [进栈(增)](stack/README.md#13-进入栈) +- [出栈(删)](stack/README.md#14-出栈) +- [获取栈顶元素(查询)](stack/README.md#15-获取栈顶元素) 两种实现 - 初始化时 `top=-1` - 初始化时 `top=0` -共享栈 +[共享栈](stack/README.md#18-共享栈) - 两个栈共享同一片内存空间,两个栈从两边往中间增长。 - 初始化:`S.top0 = -1;`,`S.top1 = MaxSize;`。 - 栈满条件:`S.top0 + 1 == S.top1;` -### 1.4. [链栈](stack/README.md) +### 1.4. [链栈](stack/README.md#2-链栈) 与单链表类似,只实现头插法、头结点出栈。 - 带头结点的链栈 - 不带头结点的链栈 -## 2. [队列](queue/README.md) +## 2. [队列](queue/README.md#队列) ### 2.1. 定义 @@ -121,7 +121,7 @@ $$ - `GetHead(Q, &x)`:读队头元素。若队列 $Q$ 非空,则用 $x$ 返回队头元素。 - `QueueEmpty(Q)`:判断一个队列 $Q$ 是否为空。若 $Q$ 为空,则返回 `true`,否则返回 `false`。 -### 2.3. [队列的顺序实现](queue/README.md) +### 2.3. [队列的顺序实现](queue/README.md#1-队列的顺序实现) 实现思想: @@ -146,7 +146,7 @@ $$ - 增加 `tag` 变量用于标记最近一次操作是入队还是出队操作。 - ... -### 2.4. [队列的链式实现](queue/README.md) +### 2.4. [队列的链式实现](queue/README.md#2-队列的链式实现) 实现方式: @@ -225,9 +225,9 @@ $$ | 1,4,2,3 | 2,4,1,1 | 3,4,1,2 | 4,3,1,2 | | 1,5,3,2 | 2,4,3,3 | 3,4,2,1 | 4,3,2,1 | -## 4. [栈的应用](stack-applications/README.md) +## 4. [栈的应用](stack-applications/README.md#栈的应用) -### 4.1. [括号匹配](stack-applications/README.md) +### 4.1. [括号匹配](stack-applications/README.md#1-括号匹配) 实现思路: @@ -241,7 +241,7 @@ $$ - 右括号单身:扫描到右括号,但是此时栈空。 - 左右括号不匹配:栈顶左括号,与当前的右括号不匹配。 -### 4.2. [表达式求值](stack-applications/README.md) +### 4.2. [表达式求值](stack-applications/README.md#2-表达式求值) 三种算数表达式: @@ -263,7 +263,7 @@ $$ 中缀表达式求值 = 中缀转后缀 + 后缀表达式求值 $$ -### 4.3. [递归](stack-applications/README.md) +### 4.3. [递归](stack-applications/README.md#3-递归) 实现递归表达式: @@ -281,25 +281,25 @@ $$ - 图的广度优先遍历 - 多个进程争抢着使用优先的系统资源时,FCFS(First Come First Service,先来先服务)是一种常用策略。 -## 6. [矩阵的压缩存储](matrix/README.md) +## 6. [矩阵的压缩存储](matrix/README.md#矩阵的压缩存储) 数组的存储结构: -- 一维数组 -- 二维数组 +- [一维数组](matrix/README.md#1-一维数组) +- [二维数组](matrix/README.md#2-二维数组) 特殊矩阵: -- 对称矩阵 +- [对称矩阵](matrix/README.md#3-对称矩阵) - 特点:对方阵中的任意一个元素,有 $a_{i,j}=a_{j,i}$。 - 压缩:只存主对角线+下三角区(或主对角线+上三角区)。 -- 三角矩阵 +- [三角矩阵](matrix/README.md#4-三角矩阵) - 特点:上三角区全为常量(下三角矩阵);或下三角区全为常量(上三角矩阵)。 - 压缩:按行优先/列优先规则依次存储非常量区域,并在最后一个位置存放常量 $c$。 -- 三对角矩阵 +- [三对角矩阵](matrix/README.md#5-三对角矩阵) - 特点:当 $|i-j|>1$ 时,$a_{i,j}=0$ ($1 \leq i, j \leq n$)。 - 压缩:按行优先/列优先规则依次存储带状区域。 -- 稀疏矩阵 +- [稀疏矩阵](matrix/README.md#6-稀疏矩阵) - 特点:非零元素个数远少于零元素个数。 - 压缩:只存储非零元素 - 顺序存储:顺序存储三元组 `<行,列,值>`。 diff --git a/ch5/README.md b/ch5/README.md new file mode 100644 index 0000000..a667ff7 --- /dev/null +++ b/ch5/README.md @@ -0,0 +1 @@ +# 树与二叉树