第1章 绪论 1
1.1 数据结构的基本概念 1
1.1.1 数据、数据元素、数据元素的数据类型 1
1.1.2 数据的逻辑结构 2
1.1.3 数据的存储结构 3
1.1.4 数据的操作 4
1.1.5 数据结构课程讨论的主要内容 4
1.2 抽象数据类型 4
1.3 算法和算法的时间复杂度 5
1.3.1 算法 5
1.3.2 算法的性质和设计目标 7
1.3.3 算法的时间效率分析 8
1.3.4 算法耗时的实际测试 10
1.3.5 数据元素个数和时间复杂度 13
1.4 算法书写规范 14
习题1 14
第2章 线性表 17
2.1 线性表概述 17
2.1.1 线性表的定义 17
2.1.2 线性表的抽象数据类型 17
2.2 线性表的顺序表示和实现 18
2.2.1 顺序表的存储结构 18
2.2.2 顺序表操作的实现 19
2.2.3 顺序表操作的效率分析 22
2.2.4 顺序表应用举例 23
2.3 线性表的链式表示和实现 26
2.3.1 单链表的存储结构 26
2.3.2 单链表的操作实现 29
2.3.3 单链表操作的效率分析 34
2.3.4 单链表应用举例 35
2.3.5 循环单链表 36
2.3.6 双向链表 36
2.4 静态链表 40
2.5 算法设计举例 41
2.5.1 顺序表算法设计举例 41
2.5.2 单链表算法设计举例 42
习题2 44
第3章 堆栈和队列 48
3.1 堆栈 48
3.1.1 堆栈的基本概念 48
3.1.2 堆栈的抽象数据类型 49
3.1.3 堆栈的顺序表示和实现 50
3.1.4 堆栈的链式表示和实现 53
3.2 堆栈应用 55
3.2.1 括号匹配问题 55
3.2.2 算术表达式计算问题 58
3.3 队列 64
3.3.1 队列的基本概念 64
3.3.2 队列的抽象数据类型 64
3.3.3 顺序队列以及存在的问题 65
3.3.4 顺序循环队列的表示和实现 66
3.3.5 链式队列 69
3.3.6 队列的应用 72
3.4 优先级队列 76
3.4.1 顺序优先级队列的设计和实现 77
3.4.2 优先级队列的应用 79
习题3 81
第4章 串 86
4.1 串概述 86
4.1.1 串及其基本概念 86
4.1.2 串的抽象数据类型 87
4.1.3 C语言的串函数 88
4.2 串的存储结构 90
4.3 串基本操作的实现算法 92
4.4 串的模式匹配算法 97
4.4.1 Brute-Force算法 98
4.4.2 KMP算法 101
4.4.3 Brute-Force算法和KMP算法的比较 106
习题4 109
第5章 数组 112
5.1 数组概述 112
5.1.1 数组的定义 112
5.1.2 数组的实现机制 112
5.1.3 数组的抽象数据类型 113
5.2 动态数组 113
5.2.1 动态数组的设计方法 113
5.2.2 动态数组和静态数组对比 117
5.3 特殊矩阵的压缩存储 118
5.4 稀疏矩阵的压缩存储 120
5.4.1 稀疏矩阵的三元组顺序表 121
5.4.2 稀疏矩阵的三元组链表 123
习题5 124
第6章 递归算法 127
6.1 递归的概念 127
6.2 递归算法的执行过程 128
6.3 递归算法的设计方法 131
6.4 递归过程和运行时栈 133
6.5 递归算法的时间效率分析 135
6.6 递归算法到非递归算法的转换 137
6.7 设计举例 141
6.7.1 一般递归算法设计举例 141
6.7.2 回溯算法及设计举例 143
习题6 147
第7章 广义表 150
7.1 广义表概述 150
7.1.1 广义表的概念 150
7.1.2 广义表的抽象数据类型 151
7.2 广义表的存储结构 152
7.2.1 头链和尾链存储结构 152
7.2.2 原子和子表存储结构 152
7.3 广义表的操作实现 153
7.3.1 头链和尾链存储结构下的操作实现 153
7.3.2 头链和尾链存储结构应用举例 159
7.3.3 原子和子表存储结构下的操作实现 161
7.3.4 原子和子表存储结构应用举例 164
习题7 164
第8章 树和二叉树 166
8.1 树 166
8.1.1 树的定义 166
8.1.2 树的表示方法 167
8.1.3 树的抽象数据类型 168
8.1.4 树的存储结构 169
8.2 二叉树 171
8.2.1 二叉树的定义 171
8.2.2 二叉树的抽象数据类型 172
8.2.3 二叉树的性质 173
8.3 二叉树的设计和实现 175
8.3.1 二叉树的存储结构 175
8.3.2 二叉树的操作实现 177
8.4 二叉树遍历 179
8.4.1 二叉树遍历的方法和结构 179
8.4.2 二叉链存储结构下二叉树遍历的实现 181
8.4.3 二叉树遍历的应用 182
8.4.4 非递归的二叉树遍历算法 185
8.5 线索二叉树 186
8.5.1 线索二叉树及其用途 186
8.5.2 中序线索二叉树的设计 188
8.5.3 中序线索二叉树循环操作的设计 190
8.5.4 设计举例 191
8.6 哈夫曼树 193
8.6.1 哈夫曼树的基本概念 193
8.6.2 哈夫曼编码问题 194
8.6.3 哈夫曼编码问题设计和实现 195
8.7 等价问题 200
8.8 树与二叉树的转换 204
8.9 树的遍历 205
习题8 206
第9章 图 209
9.1 图概述 209
9.1.1 图的基本概念 209
9.1.2 图的抽象数据类型 211
9.2 图的存储结构 212
9.2.1 图的邻接矩阵存储结构 212
9.2.2 图的邻接表存储结构 213
9.3 图的实现 214
9.3.1 邻接矩阵存储结构下图操作的实现 214
9.3.2 邻接表存储结构下图操作的实现 219
9.4 图的遍历 224
9.4.1 图的深度和广度优先遍历算法 224
9.4.2 图的深度和广度优先遍历算法实现 225
9.5 最小生成树 228
9.5.1 最小生成树的基本概念 228
9.5.2 普里姆算法 229
9.5.3 克鲁斯卡尔算法 234
9.6 最短路径 235
9.6.1 最短路径的基本概念 235
9.6.3 每对顶点之间的最短路径 240
9.7 拓扑排序 242
9.8 关键路径 245
习题9 249
第10章 排序 252
10.1 排序的基本概念 252
10.2 插入排序 254
10.2.1 直接插入排序 254
10.2.2 希尔排序 256
10.3 选择排序 258
10.3.1 直接选择排序 258
10.3.2 堆排序 259
10.4 交换排序 264
10.4.1 冒泡排序 264
10.4.2 快速排序 266
10.5 归并排序 269
10.6 基数排序 271
10.7 排序算法性能比较 275
习题10 275
第11章 查找 279
11.1 查找的基本概念 279
11.2 静态查找 280
11.2.1 顺序表 280
11.2.2 有序顺序表 281
11.2.3 索引顺序表 283
11.3 动态查找 286
11.3.1 二叉排序树和平衡二叉树 286
11.3.2 B_树和B+树 293
11.4 哈希查找 298
11.4.1 哈希表的基本概念 299
11.4.2 哈希函数构造方法 300
11.4.3 哈希冲突解决方法 302
11.4.4 哈希表设计 304
习题11 308
第12章 文件 312
12.1 文件概述 312
12.1.1 文件的演变过程及基本概念 312
12.1.2 文件的存储介质 313
12.1.3 文件的基本操作 314
12.2 顺序文件 315
12.3 索引文件 316
12.4 ISAM文件 317
12.5 VSAM文件 319
12.6 散列文件 321
习题12 322
附录A 上机实习内容规范和上机实习报告范例 323
附录A.1 上机实习内容规范 323
附录A.2 上机实习报告范例 323
附录B 部分习题解答 329
参考文献 358