第1章 数据结构和算法简介 1
1.1 问题引入 1
1.1.1 查找电话号码问题 1
1.1.2 问题求解基本步骤 3
1.2 认识数据结构 3
1.2.1 数据的概念 3
1.2.2 数据元素和数据项 3
1.2.3 数据结构的概念 4
1.2.4 数据结构的存储 5
1.3 认识算法 8
1.3.1 算法的定义及特征 8
1.3.2 算法性能分析与度量 9
1.4 寻求问题求解的实现方法 10
本章小结 10
综合练习 11
第2章 解决线性表的编程问题 13
学习情境:用线性表解决学生成绩表的编程 13
2.1 认识线性表 13
2.1.1 分析线性表的逻辑结构 13
2.1.2 识别线性表的基本操作 14
2.2 用顺序表解决线性表的编程问题 15
2.2.1 用顺序表表示线性表 16
2.2.2 对顺序表进行操作 17
2.2.3 顺序表在学生成绩表中的应用 21
独立实践 25
2.3 用单链表解决线性表的编程问题 25
2.3.1 用单链表表示线性表 26
2.3.2 对单链表进行操作 27
2.3.3 单链表在学生成绩表中的应用 35
独立实践 36
2.4 用双向链表解决线性表的编程问题 36
2.4.1 用双向链表表示线性表 36
2.4.2 对双向链表进行操作 38
2.4.3 双向链表在学生成绩表中的应用 44
独立实践 44
2.5 用循环链表解决线性表的编程问题 45
2.5.1 用循环链表表示线性表 45
2.5.2 对循环链表进行操作 45
2.5.3 循环链表在学生成绩表中的应用 46
独立实践 46
2.6 度量不同存储结构的算法效率 46
2.6.1 分析顺序表的算法效率 46
2.6.2 分析单链表的算法效率 48
本章小结 49
综合练习 49
第3章 解决堆栈的编程问题 51
学习情境:用堆栈解决火车车厢重排问题的编程 51
3.1 认识堆栈 52
3.1.1 分析堆栈的逻辑结构 52
3.1.2 识别堆栈的基本操作 53
3.2 用顺序栈解决堆栈的编程问题 54
3.2.1 用顺序栈表示堆栈 54
3.2.2 对顺序栈进行操作 56
3.2.3 用顺序栈解决火车车厢重排问题的编程 59
3.3 用链栈解决堆栈的编程问题 62
3.3.1 用链栈表示堆栈 62
3.3.2 对链栈进行操作 64
3.3.3 用链栈解决火车车厢重排问题的编程 67
独立实践 69
本章小结 70
综合练习 70
第4章 解决队列的编程问题 72
学习情境:用队列解决银行排队叫号软件的编程 72
4.1 认识队列 73
4.1.1 分析队列的逻辑结构 73
4.1.2 识别队列的基本操作 74
4.2 用顺序队列解决队列的编程问题 75
4.2.1 用顺序存储结构表示队列 75
4.2.2 对顺序队列进行操作 78
4.2.3 用循环顺序队列解决银行排队叫号软件的编程 82
4.3 用链队列解决队列的编程问题 85
4.3.1 用链队列表示队列 85
4.3.2 对链队列进行操作 87
4.3.3 用链队列解决银行排队叫号软件的编程 91
独立实践 92
本章小结 92
综合练习 93
第5章 解决串的编程问题 94
学习情境:用串解决“以一敌百”游戏的编程 94
5.1 认识串 95
5.1.1 分析串的逻辑结构 95
5.1.2 识别串的基本操作 96
5.2 用顺序存储解决串的编程问题 97
5.2.1 用顺序存储结构表示串 97
5.2.2 对顺序串进行操作 98
5.2.3 用顺序串解决“以一敌百”游戏的编程 104
独立实践 108
本章小结 108
综合练习 109
第6章 解决数组的编程问题 110
学习情境:用数组解决数学魔术游戏编程 110
6.1 认识数组 110
6.1.1 分析数组的逻辑结构 111
6.1.2 识别数组的基本操作 111
6.1.3 用顺序存储结构存储数组 112
6.1.4 编程实现数组的基本操作 113
6.1.5 用数组解决数学魔术游戏的编程 113
独立实践 114
学习情境:用特殊矩阵解决查询城市间的距离的编程 115
6.2 认识特殊矩阵 116
6.2.1 分析特殊矩阵的逻辑结构 116
6.2.2 特殊矩阵的压缩存储 117
6.2.3 用特殊矩阵解决查询城市间距离的编程 118
独立实践 119
学习情境:用稀疏矩阵解决超市物品购买数据的编程 119
6.3 认识稀疏矩阵 120
6.3.1 描述稀疏矩阵的逻辑结构 120
6.3.2 稀疏矩阵的压缩存储 121
6.3.3 编程实现稀疏矩阵的基本运算 123
6.3.4 用稀疏矩阵实现超市物品购买数据的编程 125
独立实践 128
本章小结 128
综合练习 129
第7章 解决二叉树的编程问题 131
学习情境:解决快速搜索磁盘文件中记录的问题 131
7.1 认识二叉树 132
7.1.1 分析二叉树的逻辑结构 133
7.1.2 识别二叉树的基本操作 135
7.1.3 识别二叉树的主要性质 135
7.2 二叉树的存储实现 136
7.2.1 用顺序存储结构表示二叉树 136
7.2.2 用链式存储结构表示二叉树 137
7.3 二叉树的遍历方法及递归实现 143
7.4 用二叉搜索树解决快速搜索磁盘文件中记录的问题 147
独立实践 150
7.5 最优二叉树——哈夫曼树 151
7.5.1 哈夫曼树的基本概念 151
7.5.2 哈夫曼树的构造算法 152
本章小结 156
综合练习 157
第8章 解决树和森林的编程问题 158
学习情境:用树来解决学院组织结构的编程问题 158
8.1 认识树 158
8.1.1 分析树的逻辑结构 159
8.1.2 树的逻辑表示 161
8.1.3 识别树的基本操作 162
8.2 实现树的存储 163
8.2.1 用多重链表表示法存储树 163
8.2.2 用双亲表示法存储树 168
8.2.3 用孩子链表表示法存储树 170
8.2.4 用双亲孩子表示法存储树 173
8.2.5 用孩子兄弟表示法存储树 175
8.2.6 用多重链表表示法解决学院组织结构的编程 176
8.3 树、森林与二叉树的转换 177
8.3.1 树转换为二叉树 177
8.3.2 森林转换为二叉树 178
8.3.3 二叉树转换为树和森林 178
8.4 解决树和森林的遍历问题 179
8.4.1 树的遍历 179
8.4.2 森林的遍历 181
8.5 树的应用 182
8.5.1 集合的表示 182
独立实践 184
本章小结 184
综合练习 184
第9章 解决图的编程问题 186
学习情境:用图解决高速公路交通网的编程 186
9.1 认识图 186
9.1.1 图的定义和术语 187
9.1.2 识别图的基本操作 188
9.2 用邻接矩阵解决图的编程问题 189
9.2.1 用邻接矩阵表示图 189
9.2.2 对邻接矩阵进行操作 191
9.2.3 使用邻接矩阵解决高速公路交通网的存储问题 194
9.3 用邻接表解决图的编程问题 195
9.3.1 用邻接表表示图 195
9.3.2 对邻接表进行操作 198
9.3.3 使用邻接表解决高速公路交通网的存储问题 203
独立实践 205
9.4 解决图的遍历问题 205
9.4.1 深度优先搜索 205
9.4.2 广度优先搜索 207
9.4.3 使用图的遍历解决高速公路交通网城市的遍历 209
独立实践 210
9.5 图的最短路径问题 210
9.5.1 Dijkstra算法的引入 210
9.5.2 分析高速公路交通网的最短路径 211
9.5.3 编码实现Dijkstra算法 214
9.5.4 用Dijkstra算法解决高速公路交通网中最短路径的编程 215
独立实践 216
本章小结 216
综合练习 216
第10章 实现排序算法 218
学习情境:实现第29届奥运会奥运奖牌的排名 218
10.1 认识排序 219
10.1.1 排序的概念 219
10.1.2 排序的分类 219
10.2 插入排序 220
10.2.1 直接插入排序 221
10.2.2 希尔排序 222
10.3 选择排序 224
10.3.1 直接选择排序 224
10.3.2 堆排序 226
10.4 交换排序 230
10.4.1 冒泡排序 230
10.4.2 快速排序 232
10.5 归并排序 234
10.5.1 归并排序 235
10.6 分配排序 237
10.6.1 基数排序 237
10.7 编程实现第29届奥运会奥运奖牌的排名 240
独立实践 247
本章小结 248
综合练习 249
第11章 执行查询算法 250
学习情境:根据指定的条件查询第29届奥运会获奖情况 250
11.1 熟悉查找的基本概念 251
11.2 线性表查找技术 251
11.2.1 顺序查找 251
11.2.2 二分查找 253
11.2.3 分块查找 255
11.3 哈希表查询技术 257
11.3.1 认识哈希表 257
11.3.2 构造哈希函数 259
11.3.3 解决哈希冲突 260
11.3.4 实现哈希表的查找算法 262
11.3.5 分析哈希表的性能 267
11.4 编程实现第29届奥运会排行榜的查询功能 267
独立实践 275
本章小结 275
综合练习 276
参考文献 278