第1章 绪论 1
1.1 数据结构的产生和发展 1
1.1.1 数据结构的产生 1
1.1.2 数据结构的发展 2
1.2 数据结构的研究对象 2
1.3 基本概念和术语 4
1.4 数据结构与算法的关系 8
1.5 算法与算法分析 9
1.5.1 算法 9
1.5.2 算法的描述方法 10
1.5.3 算法设计目标 11
1.5.4 算法效率的度量 12
1.6 与算法描述有关的C++知识 15
1.6.1 C++的输入和输出 15
1.6.2 函数 16
1.6.3 类和对象 18
1.6.4 变量的引用类型 22
1.6.5 运算符重载 23
1.6.6 数据类型相关说明 24
1.6.7 两个相关的头文件 24
本章小结 27
习题一 27
第2章 线性表 30
2.1 线性表的基本概念 30
2.1.1 线性表的定义 30
2.1.2 线性表的抽象数据类型 32
2.2 线性表的顺序存储和基本操作 35
2.2.1 线性表的顺序存储——顺序表 35
2.2.2 顺序表的基本操作 37
2.2.3 顺序表基本操作的算法分析 41
2.3 线性表的链式存储和基本操作 42
2.3.1 链式存储的概念 42
2.3.2 单链表 43
2.3.3 单链表的基本操作 44
2.3.4 单链表基本操作的算法分析 50
2.3.5 双向链表 51
2.3.6 循环链表 54
2.4 顺序表和链表的综合比较 56
2.5 静态链表 57
2.6 线性表算法设计举例 59
2.6.1 顺序表算法设计举例 59
2.6.2 单链表算法设计举例 61
本章小结 65
习题二 66
第3章 堆栈与队列 69
3.1 堆栈 69
3.1.1 堆栈的基本概念 69
3.1.2 堆栈的顺序存储和基本操作 71
3.1.3 堆栈的链式存储和基本操作 77
3.2 堆栈的应用举例 81
3.3 队列 88
3.3.1 队列的基本概念 88
3.3.2 队列的顺序存储和基本操作 89
3.3.3 队列的链式存储和基本操作 96
3.3.4 其他队列 100
3.4 队列的应用举例 101
本章小结 109
习题三 110
第4章 串 113
4.1 串的基本概念 113
4.1.1 串的定义 113
4.1.2 串的抽象数据类型 115
4.2 串的顺序存储和基本操作 116
4.2.1 串的顺序存储——顺序串 116
4.2.2 顺序串的基本操作 117
4.3 串的链式存储和基本操作 124
4.3.1 串的链式存储——链式串 124
4.3.2 链式串的基本操作 125
4.4 串的模式匹配算法 132
4.4.1 Brute-Force算法 132
4.4.2 KMP算法 133
4.5 串的应用举例 137
本章小结 144
习题四 145
第5章 数组和广义表 147
5.1 数组的基本概念 148
5.1.1 数组的定义 148
5.1.2 数组的抽象数据类型 148
5.2 数组的存储结构 149
5.2.1 一维数组的存储 149
5.2.2 多维数组的存储 149
5.3 数组的顺序存储表示和基本操作 151
5.3.1 数组的顺序存储表示 151
5.3.2 数组的基本操作 151
5.3.3 数组的应用举例 154
5.4 矩阵的压缩存储 157
5.4.1 特殊矩阵的压缩存储 157
5.4.2 稀疏矩阵的压缩存储 159
5.5 广义表 173
5.5.1 广义表的基本概念 173
5.5.2 广义表的存储结构 175
5.5.3 广义表的基本操作 177
本章小结 184
习题五 184
第6章 树和二叉树 187
6.1 树 188
6.1.1 树的基本概念 188
6.1.2 树的存储结构 193
6.1.3 树的基本操作 197
6.2 二叉树 203
6.2.1 二叉树的基本概念 203
6.2.2 二叉树的存储结构 207
6.2.3 二叉树的遍历 210
6.2.4 二叉树的其他操作 215
6.3 线索二叉树 223
6.3.1 线索二叉树的基本概念 223
6.3.2 线索二叉树的存储结构 224
6.3.3 二叉树的线索化 225
6.3.4 线索二叉树的基本操作 226
6.4 哈夫曼树 230
6.4.1 哈夫曼树的基本概念 230
6.4.2 构造哈夫曼树 232
6.4.3 哈夫曼编码 235
6.5 树、森林与二叉树的转换 238
6.5.1 树与二叉树的转换 238
6.5.2 森林与二叉树的转换 239
6.6 树的应用举例——PATRICIA tree 240
本章小结 244
习题六 244
第7章 图 248
7.1 图的基本概念 249
7.1.1 图的定义 249
7.1.2 图的基本术语 249
7.1.3 图的抽象数据类型 252
7.2 图的存储结构 253
7.2.1 邻接矩阵 254
7.2.2 邻接表 255
7.2.3 十字邻接表 257
7.2.4 邻接多重表 258
7.2.5 边集数组 259
7.3 图的实现 259
7.3.1 邻接矩阵存储结构下图基本操作的实现 260
7.3.2 邻接表存储结构下图基本操作的实现 268
7.4 图的遍历 275
7.4.1 深度优先遍历 276
7.4.2 广度优先遍历 277
7.5 最小生成树 282
7.5.1 最小生成树的概念 282
7.5.2 普里姆算法 283
7.5.3 克鲁斯卡尔算法 288
7.6 最短路径 292
7.6.1 最短路径的概念 292
7.6.2 从一顶点到其余各顶点的最短路径 293
7.6.3 每对顶点之间的最短路径 297
7.7 拓扑排序 302
7.7.1 拓扑排序的概念 302
7.7.2 拓扑排序的算法 303
7.8 关键路径 306
7.8.1 关键路径的概念 306
7.8.2 顶点事件的发生时间 307
7.8.3 求关键路径的算法 308
7.8.4 求关键路径的算法描述 310
本章小结 313
习题七 313
第8章 查找 318
8.1 查找的基本概念 318
8.2 静态查找 320
8.2.1 顺序查找 320
8.2.2 二分查找 321
8.2.3 索引查找 323
8.3 动态查找 326
8.3.1 二叉排序树 326
8.3.2 平衡二叉树 333
8.3.3 B-树和B+树 337
8.4 哈希表查找 345
8.4.1 哈希表查找的基本概念 345
8.4.2 哈希函数构造方法 347
8.4.3 哈希冲突解决方法 349
8.4.4 哈希表的操作 351
8.4.5 哈希表查找的性能分析 359
本章小结 359
习题八 360
第9章 排序 363
9.1 排序的基本概念 363
9.2 插入排序 365
9.2.1 直接插入排序 365
9.2.2 希尔排序 367
9.3 选择排序 369
9.3.1 直接选择排序 369
9.3.2 堆排序 370
9.4 交换排序 375
9.4.1 冒泡排序 375
9.4.2 快速排序 376
9.5 归并排序 380
9.6 基数排序 382
9.7 各种内排序方法的性能比较 384
9.8 外排序 386
9.8.1 外存信息的存取 386
9.8.2 外排序的过程 387
9.8.3 多路平衡归并 388
9.8.4 初始归并段的生成 390
9.8.5 最佳归并树 391
本章小结 393
习题九 393
第10章 文件 397
10.1 文件概述 397
10.1.1 文件的存储介质 397
10.1.2 文件的基本概念 399
10.2 顺序文件 400
10.3 索引文件 402
10.4 ISAM文件 403
10.5 VSAM文件 405
10.6 哈希文件 407
10.7 多关键字文件 408
10.7.1 多重表文件 408
10.7.2 倒排文件 409
10.8 文件的应用举例 409
本章小结 410
习题十 411
附录A 用面向对象的方法(C++的类)描述顺序表类 413
参考文献 416