第1章 基础知识 1
1.1 算法与数据结构 1
目录 1
1.2 什么是数据结构 2
1.2.1 基本概念 2
1.2.2 数据的逻辑结构 3
1.2.3 数据的存储表示 4
1.2.4 数据结构的运算 4
1.3 数据抽象和抽象数据类型 5
1.3.1 抽象、数据抽象和过程抽象 5
1.3.3 数据类型和抽象数据类型 6
1.3.2 封装与信息隐蔽 6
1.3.4 数据结构与抽象数据类型 7
1.4 面向对象方法 7
1.4.1 面向对象方法的由来 7
1.4.2 面向对象方法的基本思想 7
1.4.3 面向对象方法的要素 8
1.4.4 面向对象方法和抽象数据类型 9
1.5 *C++程序设计概要 9
1.5.1 函数与参数传递 9
1.5.2 动态存储分配 12
1.5.3 类与对象 13
1.5.4 函数和运算符重载 14
1.5.5 继承性和派生类 15
1.5.6 多态性、虚函数和动态联编 16
1.5.7 纯虚函数和抽象类 17
1.5.8 友元函数和友元类 18
1.5.9 模板函数和模板类 18
1.6 描述数据结构和算法 21
1.6.1 数据结构的规范 21
1.6.2 实现数据结构 22
1.7 算法和算法分析 23
1.7.1 算法及其性能标准 23
1.7.2 算法的时间复杂度 24
1.7.3 使用程序步分析算法 26
1.7.4 渐近表示法 28
1.7.5 算法按时间复杂度分类 29
1.7.6 算法的空间复杂度 30
本章小结 30
习题 31
第2章 数组和链表 33
2.1 结构和类 33
2.1.1 结构 33
2.1.2 结构表示元素 34
2.2.1 指针 36
2.2 指针和动态存储分配 36
2.2.2 动态存储分配 37
2.2.3 静态变量和动态变量 38
2.3 数组 38
2.3.1 一维数组 38
2.3.2 二维数组 39
2.3.3 多维数组 40
2.3.4 数组和指针 40
2.4 链表 41
2.4.2 单链表 42
2.4.1 指向结构的指针 42
2.4.3 带表头结点的单链表 45
2.4.4 单循环链表 45
2.4.5 双向链表 46
2.5 采用模拟指针的链表 47
2.5.1 结点结构 47
2.5.2 可用空间表 48
2.6 异常处理 50
本章小结 51
习题 51
3.1 堆栈 53
3.1.1 堆栈ADT 53
第3章 堆栈和队列 53
3.1.2 堆栈的顺序表示 54
3.1.3 堆栈的链接表示 57
3.2 队列 59
3.2.1 队列ADT 59
3.2.2 队列的顺序表示 61
3.2.3 队列的链接表示 64
3.3 *表达式计算 64
3.3.1 表达式 64
3.3.2 中缀表达式转换为后缀表达式 65
3.3.3 计算后缀表达式的值 68
3.4 *演示与测试 71
本章小结 75
习题 75
第4章 *递归 77
4.1 递归和递归算法 77
4.1.1 递归的概念 77
4.1.2 递归算法示例 78
4.1.3 递推关系 80
4.2 实现递归 81
4.2.1 函数调用和系统栈 81
4.2.2 递归函数的性能 82
4.2.4 消去递归 83
4.2.3 尾递归 83
本章小结 87
习题 87
第5章 线性表和数组ADT 88
5.1 线性表 88
5.1.1 线性表ADT 88
5.1.2 线性表的顺序表示 90
5.1.3 线性表的链接表示 93
5.1.4 两种存储表示的比较 96
5.2.1 多项式ADT 97
5.2 *一元多项式算术运算 97
5.2.2 多项式的链接表示 98
5.2.3 项结点类 98
5.2.4 多项式类 99
5.2.5 多项式的输入和输出 100
5.2.6 多项式相加 101
5.2.7 多项式相乘 102
5.2.8 重载运算符函数 103
5.3 数组作为抽象数据类型 104
5.3.1 数组ADT 104
5.3.2 一维数组的C++类 105
5.4.1 对称矩阵 106
5.4 特殊矩阵 106
5.4.2 *带状矩阵 107
5.5 稀疏矩阵 108
5.5.1 稀疏矩阵ADT 108
5.5.2 稀疏矩阵的三元组表 109
5.5.3 稀疏矩阵转置 110
5.5.4 *稀疏矩阵相乘 112
5.6 *稀疏矩阵的正交链表 115
5.6.1 稀疏矩阵的正交链表表示 115
5.6.2 正交链表结点类 116
5.6.3 正交链表类 117
5.6.4 建立正交链表 118
5.6.5 打印正交链表 119
本章小结 120
习题 120
第6章 字符串和广义表 122
6.1 字符串 122
6.1.1 字符串ADT 122
6.1.2 字符串的存储表示 123
6.1.3 串运算的实现 124
6.1.4 简单模式匹配算法 125
6.1.5 *模式匹配的KMP算法 127
6.2.1 广义表的概念 131
6.2 *广义表 131
6.2.2 广义表ADT 132
6.2.3 广义表的存储表示 133
6.2.4 广义表算法 134
本章小结 135
习题 135
第7章 树 137
7.1 树的基本概念 137
7.1.1 树的定义 137
7.1.2 基本术语 138
7.2.1 二叉树的定义 139
7.2 二叉树 139
7.2.2 二叉树的性质 140
7.2.3 二叉树ADT 141
7.2.4 二叉树的存储表示 142
7.2.5 二叉树类 143
7.2.6 二叉树基本运算 144
7.3 二叉树的遍历 146
7.3.1 二叉树遍历算法 146
7.3.2 二叉树遍历的递归算法 147
7.3.3 二叉树遍历的应用示例 149
7.4.1 遍历器类 151
7.4 *二叉树遍历的非递归算法 151
7.4.2 中序遍历器类 153
7.4.3 后序遍历器类 154
7.5 *二叉线索树 157
7.5.1 叉线索树的定义 157
7.5.2 构造中序线索树 158
7.5.3 遍历二叉线索树 159
7.6 树和森林 161
7.6.1 森林与二叉树的转换 161
7.6.2 树和森林的存储表示 162
7.7 *堆和优先权队列 164
7.6.3 树和森林的遍历 164
7.7.1 堆 165
7.7.2 优先权队列ADT 167
7.7.3 优先权队列类 168
7.7.4 实现优先权队列 168
7.8 哈夫曼树和哈夫曼编码 170
7.8.1 树的路径长度 171
7.8.2 哈夫曼树和哈夫曼算法 172
7.8.3 哈夫曼树类 173
7.8.4 构造哈夫曼树 173
7.8.5 哈夫曼编码 175
7.8.6 哈夫曼编码算法 176
7.9.1 并查集ADT 177
7.9 *并查集和等价关系 177
7.9.2 并查集的存储表示 178
7.9.3 并查集类 178
7.9.4 函数Union和Find 179
7.9.5 改进的函数Union和Find 179
7.9.6 按等价关系分组 181
本章小结 181
习题 182
8.1.1 集合和搜索的概念 184
第8章 集合和搜索 184
8.1 集合及其表示 184
8.1.2 动态集ADT 185
8.1.3 集合的表示 186
8.2 顺序搜索 187
8.2.1 无序表的顺序搜索 187
8.2.2 有序表的顺序搜索 188
8.2.3 平均搜索长度 188
8.2.4 自组织表 189
8.3.1 二分搜索算法 190
8.3 二分搜索 190
8.3.2 对半搜索 191
8.3.3 二叉判定树 192
8.3.4 *斐波那契搜索 193
8.4 *搜索算法的时间下界 195
本章小结 196
习题 196
第9章 动态集和搜索树 197
9.1 二叉搜索树 197
9.1.1 二叉搜索树的定义 197
9.1.2 二叉搜索树的搜索 198
9.1.3 二叉搜索树的插入 199
9.1.4 二叉搜索树的删除 200
9.1.5 平均情况时间分析 201
9.2 *二叉平衡树 203
9.2.1 二叉平衡树的定义 203
9.2.2 二叉平衡树类 204
9.2.3 二叉平衡树的平衡旋转 205
9.2.4 二叉平衡树的插入 210
9.2.5 二叉平衡树的删除 211
9.2.6 二叉平衡树的高度 214
9.3.1 自调节树和伸展树 215
9.3.2 伸展树的伸展操作 215
9.3 *伸展树 215
9.3.3 伸展树类 217
9.3.4 旋转的实现 218
9.3.5 伸展树的插入运算 218
9.3.6 时间分析 220
本章小结 222
习题 222
第10章 多叉搜索树 224
10.1 m叉搜索树 224
10.2.2 B树的高度 226
10.2.1 B树的定义 226
10.2 B树 226
10.2.3 B树的搜索 227
10.2.4 B树的插入 227
10.2.5 B树的删除 229
10.2.6 *B树类 231
10.2.7 *B树的搜索运算 232
10.2.8 *B树的插入运算 233
10.2.9 *B树的删除运算 235
10.3 *键树 239
10.3.1 键树的定义 239
10.3.2 链树 239
10.3.3 Trie树 240
10.3.4 Trie树的搜索 242
10.3.5 Trie树的插入 243
10.3.6 Trie树的删除 243
10.3.7 Trie树性能分析 244
本章小结 244
习题 244
第11章 跳表和散列表 246
11.1 字典 246
11.2 *跳表 246
11.2.1 什么是跳表 246
11.2.2 跳表类 248
11.2.3 跳表的搜索 250
11.2.4 跳表的插入 251
11.2.5 跳表的删除 252
11.3 散列表 253
11.3.1 散列技术 253
11.3.2 散列函数 254
11.3.3 拉链法 255
11.3.4 开地址法 256
11.3.5 线性探查法 256
11.3.6 其他开地址法 260
本章小结 262
习题 262
11.3.7 性能分析 262
第12章 图 264
12.1 图的基本概念 264
12.1.1 图的定义与术语 264
12.1.2 图ADT 266
12.2 图的存储结构 267
12.2.1 图的矩阵表示法 267
12.2.2 图的邻接矩阵实现 269
12.2.3 图的邻接表表示法 271
12.2.4 图的邻接表实现 272
12.3 图的遍历 274
12.3.1 扩充的图类 275
12.3.2 深度优先遍历 275
12.3.3 宽度优先遍历 277
12.3.4 基本遍历方法 278
12.4 拓扑排序 279
12.4.1 用顶点代表活动的AOV网 279
12.4.2 拓扑排序算法 280
12.4.3 实现拓扑排序算法 281
12.5 *关键路径 283
12.5.1 用边代表活动的AOE网 283
12.5.2 关键路径算法 284
12.5.3 实现关键路径算法 286
12.6.1 基本概念 287
12.6.2 普里姆算法 287
12.6 最小代价生成树 287
12.6.3 *克鲁斯卡尔算法 289
12.6.4 *算法正确性 291
12.7 单源最短路径 292
12.7.1 最短路径问题 292
12.7.2 迪杰斯特拉算法 292
12.7.3 数据结构选择 293
12.7.4 实现迪杰斯特拉算法 293
12.8.1 弗洛伊德算法 296
12.8 *所有顶点之间的最短路径 296
12.8.2 实现弗洛伊德算法 297
本章小结 298
习题 298
第13章 内排序 300
13.1 基本概念 300
13.2 插入排序 301
13.2.1 直接插入排序 301
13.2.2 顺序表直接插入排序 302
13.2.3 *单链表直接插入排序 303
13.2.4 *希尔排序 305
13.3 选择排序 306
13.3.1 简单选择排序 307
13.3.2 *堆排序 308
13.4 交换排序 309
13.4.1 冒泡排序 309
13.4.2 快速排序 311
134.3 快速排序算法 311
134.4 *快速排序性能分析 313
13.5 两路合并排序 315
13.5.1 合并两个有序序列 315
13.5.2 顺序表两路合并排序 316
13.5.3 *合并排序的递归算法 317
13.5.4 *单链表两路合并排序 317
13.6 *排序算法的时间下界 320
13.7 *基数排序 321
13.7.1 分配排序 321
13.7.2 基数排序算法 322
13.7.3 基数排序C++程序 323
本章小结 325
习题 325
14.1.1 主存储器和辅助存储器 327
14.1.2 磁盘存储器 327
14.1 辅助存储器简介 327
第14章 *文件和外排序 327
14.2 文件 328
14.2.1 文件的基本概念 328
14.2.2 文件的组织方式 329
14.3 文件的索引结构 332
14.3.1 静态索引结构 332
14.3.2 动态索引结构 332
14.4 外排序 333
14.4.1 外排序的基本过程 333
14.4.2 初始游程的生成 334
14.4.3 多路合并 338
14.4.4 最佳合并树 340
本章小结 340
习题 341
附录A 实习要求和实习题 342
A.1 面向对象方法概述 342
A.2 实习目的 344
A.3 实习要求 344
A.4 实习步骤 344
A.5 实习报告 345
A.6 实习题 346
附录B 专有名词中英文对照表 349
参考文献 355