目 录
第1章 概论 1
1.1 数据结构的概念 1
1.2 数据结构的组成与分类 2
1.2.1 数据的逻辑结构 2
1.2.2 数据的存储结构 3
1.2.3 数据的运算(集合) 5
1.3 数据类型与抽象数据类型 5
1.3.1 数据类型 5
1.3.2 抽象数据类型 6
1.4 算法的概念与描述 7
1.4.1 算法的概念 7
1.4.2 算法的描述 8
1.5 算法分析 14
1.5.1 算法性能的评价标准 14
1.5.2 算法的复杂度 15
1.6 本章小结 18
习题 19
第2章 顺序表 20
2.1 向量 21
2.1.1 向量的存储与运算 21
2.1.2 目录表 24
2.2 栈 25
2.2.1 栈的定义与基本操作 25
2.2.2 顺序栈 27
2.3 栈与递归 30
2.3.1 递归的概念 30
2.3.2 递归过程的实现 32
*2.3.3 递归过程到非递归过程的转换 33
2.4 队列 38
2.4.1 队列的定义与基本操作 38
2.4.2 顺序队列 40
2.5 应用举例 43
2.5.1 向量应用——约瑟夫斯问题 43
2.5.2 栈的应用—— 括号匹配的检验与数制转换 46
2.5.3 队列应用—— 输出杨辉三角形 52
2.6 本章小结 55
习题 56
第3章 链表 57
3.1 单链表 57
3.1.1 单链表的概念 57
3.1.2 单链表的存储描述 58
3.1.3 在单链表上实现的基本运算 59
3.1.4 带表头结点的单链表 62
3.2 栈和队列的链接存储表示 63
3.2.1 链栈 63
3.2.2 链队列 64
3.3 循环链表 66
3.4 双链表 67
3.4.1 双链表的概念 67
3.4.2 带表头结点的双循环链表 68
3.4.3 双循环链表的基本操作 68
3.5 应用举例 70
3.5.1 消除链表中的重复数据 70
3.5.2 用循环链表求解约瑟夫斯问题 73
3.6 本章小结 75
习题 76
第4章 串 77
4.1 串的基本概念 77
4.2 串的存储结构 78
4.2.1 顺序存储 78
4.2.2 链接存储 79
4.3 串的操作 80
4.4 模式匹配 82
4.4.1 Brute-Force算法 82
4.4.2 KMP算法 84
4.5 应用举例 88
4.6 本章小结 89
习题 90
第5章 树形结构 91
5.1 树形结构的概念 91
5.1.1 树的概念 91
5.1.2 二叉树的概念 93
5.1.3 树、森林与二叉树之间的相互转换 95
5.1.4 树形结构的遍历 97
5.2 树形结构的存储方式 99
5.2.1 链式存储 100
5.2.2 顺序存储 101
5.3 二叉树的遍历算法 106
5.3.1 遍历二叉树的非递归算法 106
5.3.2 遍历二叉树的递归算法 110
5.3.3 二叉树遍历的应用举例 111
5.4 线索二叉树 111
5.4.1 线索二叉树的概念 111
5.4.2 二叉树的线索化 112
5.4.3 线索二叉树的遍历 114
5.4.4 线索二叉树的插入 117
5.5 堆 118
5.5.1 堆的定义 118
5.5.2 堆的构造 119
5.5.3 堆的插入与删除 121
5.6 哈夫曼树 123
5.6.1 扩充的二叉树 123
5.6.2 哈夫曼树 124
5.6.3 哈夫曼树的应用举例 128
5.7 应用举例 130
5.7.1 判定树的应用——伪币鉴别问题 130
5.7.2 集合的表示与并查集 131
5.7.3 建立二叉树及遍历 133
5.8 本章小结 135
习题 136
第6章 图 139
6.1 图的概念 139
6.2 图的存储表示 141
6.2.1 邻接矩阵表示法 141
6.2.2 邻接表表示法 143
6.2.3 邻接多重表表示法 145
6.3 图的遍历 146
6.3.1 深度优先遍历 147
6.3.2 广度优先遍历 149
6.4 最小(代价)生成树 151
6.4.1 普里姆算法 152
6.4.2 克鲁斯卡尔算法 154
6.5 最短路径问题 157
6.5.1 单源最短路径 157
6.5.2 每对顶点间的最短路径 160
6.6 拓扑排序 163
6.7 关键路径 169
6.8 本章小结 173
习题 174
第7章 多维数组和广义表 177
7.1 多维数组 177
7.2 矩阵的压缩存储 179
7.2.1 特殊矩阵 179
7.2.2 稀疏矩阵 181
7.3 广义表 186
7.3.1 广义表的概念 186
7.3.2 广义表的存储结构 188
7.3.3 广义表的运算 191
7.4 本章小结 193
习题 193
第8章 排序 195
8.1 基本概念 195
8.2 插入排序 196
8.2.1 直接插入排序 197
8.2.2 希尔排序 198
*8.2.3 其他插入排序 200
8.3 交换排序 204
8.3.1 冒泡排序 205
8.3.2 快速排序 206
8.4 选择排序 209
8.4.1 直接选择排序 209
8.4.2 树形选择排序 211
8.4.3 堆排序 213
8.5 归并排序 215
8.6 基数排序 218
8.6.1 多排序码排序 218
8.6.2 基数排序 219
*8.7 外排序 223
8.7.1 2路平衡归并 223
8.7.2 k路平衡归并与败者树 224
8.7.3 最佳归并树 226
8.8 本章小结 228
习题 229
第9章 查找 230
9.1 基本概念 230
9.2 线性表的查找 231
9.2.1 顺序查找 231
9.2.2 折半查找 232
9.2.3 分块查找 235
9.3 树形表的查找 237
9.3.1 二叉排序树 237
9.3.2 最佳二叉排序树 242
9.3.3 AVL树 245
9.3.4 B-树与B+树 252
9.4 散列表的查找 261
9.4.1 基本概念 261
9.4.2 散列函数 264
9.4.3 冲突的解决 266
9.4.4 散列查找的性能 271
9.5 本章小结 272
习题 273
第10章 文件 275
10.1 文件的基本概念 275
10.2 顺序文件 277
10.3 索引文件 277
10.4 索引顺序文件 279
10.4.1 ISAM文件 279
10.4.2 VSAM文件 281
10.5 散列文件 282
10.6 多关键字文件 283
10.6.1 多重表文件 283
10.6.2 倒排文件 284
10.7 本章小结 285
习题 286
附录A Visual C++ 6.0集成开发环境介绍 287
附录B 常用字符与ASCII码对照表 290
参考文献 291