第1章 绪论 1
1.1 程序=算法+数据结构 1
1.1.1 程序的产生及对程序的分析 1
目录 1
1.1.2 算法的概念及对算法的要求 2
1.1.3 算法与程序的关系及算法的描述方法 3
1.1.4 数据结构简介 4
1.2 数据结构的基本内涵 4
1.2.1 数据结构研究的内容 4
1.2.2 基本概念和术语 5
1.2.4 数据结构的表示 6
1.2.3 数据的存储结构 6
1.3 时间复杂度和空间复杂度 9
1.3.1 时间复杂度 9
1.3.2 空间复杂度 10
1.4 数据结构与面向对象编程 11
习题1 11
第2章 线性表 15
2.1 线性表的逻辑特点 15
2.2 线性表的顺序存储结构——顺序表 17
2.2.1 顺序表定义 17
2.2.2 顺序表基本操作的实现 18
2.3 线性表的链式存储结构——链表 21
2.2.3 典型应用——多项式求值 21
2.3.1 单向链表的类定义 22
2.3.2 基本运算的实现 25
2.3.3 基本操作的实现 31
2.3.4 循环链表与双向链表 34
2.3.5 典型应用——多项式表示及相加 42
习题2 48
3.1 栈的概念 50
3.1.1 栈的定义和特征 50
第3章 栈和队列 50
3.1.2 栈的基本操作 51
3.2 顺序栈——栈的顺序存储表示 51
3.2.1 顺序栈的类定义 51
3.2.2 其他基本操作的实现 54
3.2.3 多栈共享空间 55
3.2.4 栈的应用 57
3.3 栈的链式存储结构——链栈 65
3.3.1 链栈的类定义 66
3.3.2 部分操作的实现 67
3.4 队列的基本概念 69
3.5.1 链队列的的概念和特征 70
3.5 队列的链式存储结构——链队列 70
3.5.2 链队列的表示与实现 71
3.6 队列的顺序存储结构 74
3.6.1 顺序存储的队列 74
3.6.2 以数组表示的循环队列 75
3.6.3 应用举例 77
3.7 优先级队列 83
3.7.1 优先级队列的基本概念 83
3.7.2 优先级队列的类定义 84
3.7.3 优先级队列的存储表示和实现 84
3.7.4 优先级队列的应用实例 85
习题3 86
第4章 数组和广义表 88
4.1 数组的逻辑特点 88
4.2 数组的存储结构 89
4.2.1 一维数组 89
4.2.2 二维数组 90
4.2.3 多维数组 90
4.3 特殊矩阵的压缩存储 91
4.3.1 对称矩阵 92
4.3.2 三角矩阵 93
4.3.3 带状矩阵 94
4.4 稀疏矩阵的压缩存储 95
4.5 稀疏矩阵运算的实现 97
4.5.1 稀疏矩阵转置的实现 98
4.5.2 矩阵相乘 101
4.6 广义表 103
4.6.1 广义表的概念 104
4.6.2 广义表的存储结构 106
4.6.3 广义表的类定义 109
4.6.4 广义表的递归算法 112
4.7 递归 115
4.7.1 递归的概念 115
4.7.2 函数调用与递归实现 116
4.7.3 回溯 119
4.7.4 递归问题的非递归算法 123
习题4 124
第5章 树和二叉树 127
5.1 树的逻辑结构 127
5.1.1 树的递归定义 128
5.1.2 树的基本术语 129
5.1.3 树的表示 130
5.2 二叉树 132
5.2.1 二叉树的基本概念 132
5.2.2 二叉树的性质 133
5.2.3 二叉树的抽象数据类型 134
5.2.4 二叉树的存储结构 135
5.2.5 二叉树的基本操作及实现 138
5.3 二叉树遍历 141
5.3.1 二叉树遍历的定义 141
5.3.2 先序遍历算法描述 141
5.3.3 中序遍历算法描述 142
5.3.4 后序遍历算法描述 143
5.3.5 二叉树遍历的非递归实现 143
5.3.6 层次遍历算法描述 146
5.3.7 二叉树遍历算法的应用 147
5.4.1 二叉树的线索化 155
5.4 线索二叉树 155
5.4.2 线索二叉树的中序遍历 159
5.5 堆 160
5.5.1 堆的定义 160
5.5.2 最小堆的类声明 160
5.5.3 堆的建立 161
5.5.4 堆的插入与删除 162
5.5.5 堆的应用 164
5.6 树和森林 166
5.6.1 树的存储结构 166
5.6.2 树、森林与二叉树的转换 169
5.6.3 树和森林的遍历 171
5.7 哈夫曼树及其应用 173
5.7.1 基本术语 173
5.7.2 构造哈夫曼树 175
5.7.3 哈夫曼树的应用 176
习题5 177
第6章 图 180
6.1 图的定义和术语 180
6.1.1 图的定义 180
6.1.2 基本术语 181
6.1.3 图的应用领域 184
6.2 图的存储结构 185
6.2.1 邻接矩阵 186
6.2.2 邻接表 188
6.2.3 十字链表 192
6.2.4 邻接多重表 193
6.3 图的遍历 194
6.3.1 深度优先搜索 194
6.3.2 广度优先搜索 195
6.4 图的应用 197
6.4.1 图的连通性 197
6.4.2 最小生成树 197
6.4.3 最短路径 203
6.4.4 拓扑排序 208
6.4.5 关键路径 211
习题6 214
第7章 查找 217
7.1 查找的基本概念 217
7.2 线性表查找 218
7.2.1 顺序查找 218
7.2.2 折半查找 220
7.3 索引表查找 224
7.3.1 索引查找 224
7.4 树表查找 226
7.3.2 分块查找 226
7.4.1 二叉排序树查找 227
7.4.2 平衡二叉树 234
7.4.3 B树 237
7.5 散列表查找 240
7.5.1 散列表与散列函数 240
7.5.2 处理冲突的办法 243
7.5.3 散列表的查找算法 246
7.5.4 散列查找性能分析 247
习题7 248
第8章 排序 250
8.2 插入排序 252
8.1 排序的基本概念 252
8.2.1 直接插入排序 253
8.2.2 折半插入排序 254
8.2.3 希尔排序 255
8.3 交换排序 256
8.3.1 冒泡排序 257
8.3.2 快速排序 258
8.4 选择排序 260
8.4.1 直接选择排序 261
8.4.2 堆排序 262
8.5.1 二路归并排序 266
8.5 归并排序 266
8.5.2 多路归并排序 268
8.5.3 两个有序文件的归并 268
8.6 基数排序 269
8.7 各种排序方法的比较 273
8.7.1 时间性能 273
8.7.2 空间性能 274
8.7.3 排序方法的稳定性能 274
8.7.4 排序方法的时间复杂度下限 274
8.7.5 一般选择规则 274
习题8 275
参考文献 276