第1章 绪论 1
1.1 学习数据结构与算法的意义 1
1.1.1 学习数据结构的意义 1
1.1.2 学习算法的意义 2
1.2 数据结构 3
1.2.1 数据结构概述 3
1.2.2 基本概念 3
1.3 抽象数据类型 5
1.4 算法 6
1.4.1 算法概述 7
1.4.2 算法与数据结构之间的关系 8
1.4.3 算法的度量 8
1.5 算法分析 9
1.5.1 数学基础 9
1.5.2 所需分析的问题 11
1.5.3 运行时间的计算 11
1.5.4 检验你的分析 13
小结 15
自测题答案 16
编程项目 17
第2章 线性表 18
2.1 线性表的定义 18
2.1.1 线性表概述 18
2.1.2 线性表的抽象数据类型 19
2.1.3 线性表的相关操作 20
2.2 线性表的顺序存储结构 22
2.2.1 线性表的顺序存储结构 22
2.2.2 相关操作的实现 23
2.2.3 顺序存储结构的分析 29
2.3 线性表的链式存储结构 29
2.3.1 线性链表与相关操作实现 29
2.3.2 双向链表与相关操作实现 38
2.3.3 循环链表及其相关操作的实现 41
2.3.4 链式存储结构分析 42
2.4 线性表的应用 43
2.4.1 一元多项式的抽象数据类型 43
2.4.2 多项式的顺序表实现 43
小结 46
自测题答案 47
编程项目 48
第3章 栈和队列 49
3.1 栈 49
3.1.1 栈概述 49
3.1.2 栈的实现 50
3.1.3 栈的实现方式比较 54
3.2 栈的应用 55
3.2.1 平衡符号 55
3.2.2 表达式求值 57
3.2.3 函数调用 61
3.2.4 递归与栈 62
3.3 队列 67
3.3.1 队列概述 67
3.3.2 队列的实现 69
3.3.3 队列实现方法比较 76
3.4 队列的应用 76
3.4.1 排列问题 76
3.4.2 非排列问题 77
小结 79
自测题答案 79
编程项目 81
第4章 串 82
4.1 串的定义 82
4.1.1 串 82
4.1.2 串的抽象数据类型 83
4.2 串的存储实现 84
4.2.1 串的顺序存储结构 84
4.2.2 串的链式存储结构 87
4.3 串的模式匹配 88
4.3.1 简单模式匹配算法 88
4.3.2 KMP算法 90
4.3.3 其他模式匹配算法 94
小结 96
自测题答案 97
编程项目 98
第5章 数组及广义表 99
5.1 数组的定义 99
5.1.1 数组的基本概念 99
5.1.2 数组的抽象数据类型 100
5.2 数组的顺序存储 101
5.2.1 数组的顺序存储方式 101
5.2.2 数组的顺序存储的基本操作 102
5.3 矩阵的压缩存储 104
5.3.1 特殊矩阵 104
5.3.2 稀疏矩阵 107
5.4 广义表 115
5.4.1 广义表的定义 115
5.4.2 广义表的存储 117
5.4.3 广义表的基本操作 118
小结 122
自测题答案 123
编程项目 125
第6章 树和二叉树 126
6.1 树的定义与基本操作 126
6.1.1 树的定义与相关术语 126
6.1.2 树的抽象数据类型 128
6.2 二叉树 129
6.2.1 二叉树的定义与基本操作 129
6.2.2 二叉树的性质 131
6.2.3 二叉树的存储结构 133
6.2.4 二叉树的遍历 135
6.2.5 线索化二叉树 140
6.3 树和森林 144
6.3.1 树的存储结构 144
6.3.2 森林、树、二叉树的相互转化 147
6.3.3 树和森林的遍历 148
6.4 哈夫曼树与哈夫曼编码 149
6.4.1 哈夫曼树 150
6.4.2 哈夫曼编码 153
小结 157
自测题答案 158
编程项目 160
第7章 图 161
7.1 图的定义 161
7.1.1 图的定义和相关术语 161
7.1.2 图的抽象数据类型 165
7.2 图的存储方式 166
7.2.1 数组表示法 167
7.2.2 邻接表法 169
7.2.3 十字链表法 171
7.2.4 邻接多重表 173
7.3 图的遍历 175
7.3.1 深度优先遍历 175
7.3.2 广度优先遍历 177
7.4 图的连通性 180
7.4.1 无向图的连通性 180
7.4.2 有向图的连通性 183
7.5 最小生成树 184
7.5.1 基本概念 184
7.5.2 Prim算法 185
7.5.3 Kruskal算法 187
7.6 最短路径 189
7.6.1 从某个顶点到其余各顶点的最短路径 189
7.6.2 所有点对的最短路径 192
7.7 有向无环图的应用 195
7.7.1 拓扑排序 195
7.7.2 求解关键路径 199
小结 204
自测题答案 205
编程项目 209
第8章 查找 210
8.1 线性表上的查找 210
8.1.1 顺序表上的查找 210
8.1.2 有序表上的查找 211
8.1.3 索引顺序表上的查找 215
8.1.4 线性表上的查找算法比较 217
8.2 树上的查找 218
8.2.1 二叉排序树 218
8.2.2 平衡二叉树 226
8.2.3 B-树 233
8.3 哈希表 241
8.3.1 哈希表概述 241
8.3.2 哈希函数的构造 242
8.3.3 冲突的解决方法 245
8.3.4 哈希表的查找分析 251
小结 252
自测题答案 254
编程项目 257
第9章 排序 258
9.1 插入排序 258
9.1.1 直接插入排序 259
9.1.2 折半插入排序 260
9.1.3 2路插入排序 261
9.1.4 希尔排序 263
9.2 交换排序 266
9.2.1 冒泡排序 266
9.2.2 快速排序 267
9.3 选择排序 271
9.3.1 直接选择排序 271
9.3.2 树形选择排序 273
9.3.3 堆排序 274
9.4 归并排序 278
9.5 基数排序 281
9.6 各种内部排序方法比较 283
9.7 外部排序 286
9.7.1 选择外部排序的理由 286
9.7.2 简单外部排序算法 287
9.7.3 多路合并排序 289
9.7.4 替换-选择排序 289
小结 292
自测题答案 293
编程项目 296
附录 各章编程项目参考答案 297
参考文献 391