本书系统地介绍了数据结构的有关内容,主要包括:线性表、栈、队列、串、数组、广义表、树、图等常用的数据逻辑结构和存储结构,各种数据结构的基本操作,以及查找、排序算法等。 本书采用的算法全部用C语言描述,各章均附有大量习题。与本书配套的《数据结构教程习题解析与上机指导》(胡元义,黑新宏主编,ISBN 978-7-121-35132-7)详细给出了本书习题的解题思路和参考答案,对书中的所有算法和涉及算法的示例都给出了完整的C语言实现程序,并且在VC++ 6.0环境下通过上机验证。 本书结构清晰、算法突出。在内容的组织上,本书强调知识的实用性,既注重理论的完整性,化繁为简,又将理论融入具体实例中,化难为易,以达到准确、清楚地阐述相关概念和原理的目的。本书注重对数据结构各章节知识阐述的条理性,书中给出的例子也具有较强的实用性与连贯性,以便使读者对数据结构有全面、透彻的认识。 本书可作为高等院校相关专业本科生及硕士研究生的专业教材或参考书,也可作为相关技术人员的自学用书。
胡元义,男,副教授。1978年—1982年,就读于陕西工商学院计算机软件专业;1982年—至今,就职于西安理工大学,历任工程师、高级工程师。主要从事的研究方向有编译原理、操作系统及数据结构等。先后主持《信息学科计算机人才培养模式研究》(2010年校教学研究项目),以及《三本院校人才培养实践教学模式研究》(2009年陕西省教育厅教学研究项目)。编写教材共6部,编写系列教辅书共11部。
目 录
第1章 绪论 1
1.1 数据结构的概念 1
1.1.1 数据与数据元素 2
1.1.2 数据结构 3
1.2 逻辑结构与存储结构 3
1.2.1 逻辑结构 3
1.2.2 存储结构 4
1.3 算法与算法分析 5
1.3.1 算法的定义与描述 5
1.3.2 算法分析与复杂度计算 7
习题1 8
第2章 线性表 12
2.1 线性表及其逻辑结构 12
2.1.1 线性表的定义 12
2.1.2 线性表的基本操作 13
2.2 线性表的顺序存储结构及运算实现 13
2.2.1 线性表的顺序存储——顺序表 13
2.2.2 顺序表上基本运算的实现 15
2.3 线性表的链式存储结构及运算实现 20
2.3.1 单链表 21
2.3.2 单链表上基本运算的实现 23
2.3.3 循环链表 29
2.3.4 双向链表 30
2.3.5 静态链表 32
2.3.6 单链表应用示例 35
习题2 37
第3章 栈和队列 41
3.1 栈 41
3.1.1 栈的定义及基本运算 41
3.1.2 栈的存储结构与运算实现 42
*3.2 栈与递归 47
3.2.1 递归及其实现 47
3.2.2 递归调用过程分析 48
3.3 队列 51
3.3.1 队列的定义及基本运算 51
3.3.2 队列的存储结构与运算实现 52
*3.4 递归转化为非递归的研究 58
3.4.1 汉诺塔问题的递归解法 58
3.4.2 汉诺塔问题的非递归解法 61
3.4.3 八皇后问题递归解法 63
3.4.4 八皇后问题非递归解法 66
习题3 68
第4章 串 72
4.1 串的概念及基本运算 72
4.1.1 串的基本概念 72
4.1.2 串的基本运算 73
4.2 串的顺序存储结构及基本运算 74
4.2.1 串的顺序存储结构 74
4.2.2 顺序串的基本运算 75
4.3 串的链式存储结构及基本运算 77
4.3.1 串的链式存储结构 77
4.3.2 链串的基本运算 78
4.4 串的模式匹配 80
4.4.1 简单模式匹配 80
4.4.2 无回溯的KMP匹配 82
*4.4.3 next函数的改进 86
习题4 88
第5章 数组与广义表 90
5.1 数组的概念与存储结构 90
5.1.1 数组的基本概念 90
5.1.2 数组的存储结构 91
5.2 特殊矩阵的压缩存储 93
5.2.1 对称矩阵 94
5.2.2 三角矩阵 95
5.2.3 对角矩阵 96
5.3 稀疏矩阵 97
5.3.1 稀疏矩阵的三元组表示 97
5.3.2 稀疏矩阵十字链表的表示 101
5.4 广义表 104
5.4.1 广义表的基本概念 104
5.4.2 广义表的存储结构 106
5.4.3 广义表基本操作实现算法 109
习题5 112
第6章 树与二叉树 117
6.1 树的基本概念 117
6.1.1 树的概念与定义 117
6.1.2 树的基本术语 118
6.2 二叉树 119
6.2.1 二叉树的定义 119
6.2.2 二叉树的性质 120
6.2.3 二叉树的存储结构 122
6.3 二叉树的遍历 124
6.3.1 二叉树的遍历方法 124
6.3.2 遍历二叉树的递归算法及遍历示例 125
6.3.3 遍历二叉树的非递归算法 128
6.3.4 二叉树的层次遍历算法 131
6.3.5 由遍历序列恢复二叉树 132
6.3.6 二叉树遍历的应用 134
6.4 线索二叉树 138
6.4.1 线索二叉树的定义及结构 138
6.4.2 线索化二叉树 139
6.4.3 访问线索二叉树 141
6.5 哈夫曼树 143
6.5.1 哈夫曼树基本概念及构造方法 143
6.5.2 哈夫曼算法的实现 146
6.5.3 哈夫曼编码 148
6.6 树和森林 150
6.6.1 树的定义与存储结构 150
6.6.2 树、森林与二叉树之间的转换 152
6.6.3 树和森林的遍历 153
习题6 154
第7章 图 160
7.1 图的基本概念 160
7.1.1 图的定义 160
7.1.2 图的基本术语 161
7.2 图的存储结构 163
7.2.1 邻接矩阵 164
7.2.2 邻接表 165
*7.2.3 有向图的十字链表存储方法 168
*7.2.4 无向图的邻接多重表存储方法 169
7.3 图的遍历 170
7.3.1 深度优先搜索 170
7.3.2 广度优先搜索 173
7.3.3 图的连通性问题 175
7.4 生成树与最小生成树 176
7.4.1 生成树与生成森林 176
7.4.2 最小生成树与构造最小生成树的Prim算法 179
7.4.3 构造最小生成树的Kruskal算法 182
7.5 最短路径 185
7.5.1 从一个源点到其他各点的最短路径 186
7.5.2 每对顶点之间的最短路径 189
7.6 拓扑排序与关键路径 192
7.6.1 AOV网与拓扑排序 192
7.6.2 AOE网与关键路径 196
习题7 201
第8章 查找 209
8.1 查找的基本概念 209
8.2 静态查找表 210
8.2.1 顺序查找 210
8.2.2 有序表的查找 211
8.3 树表形式的动态查找表 216
8.3.1 二叉排序树 216
8.3.2 平衡二叉树 223
8.3.3 B树与B+树 230
8.4 地址映射方式下的动态查找表——哈希表 237
8.4.1 哈希表与哈希方法 237
8.4.2 哈希函数的构造方法 238
8.4.3 处理冲突的方法 240
8.4.4 哈希表的查找 242
习题8 245
第9章 排序 252
9.1 基本概念 252
9.2 插入排序 253
9.2.1 直接插入排序 253
9.2.2 折半插入排序 255
9.2.3 希尔(Shell)排序 256
9.3 交换排序 258
9.3.1 冒泡排序 258
9.3.2 快速排序 260
9.4 选择排序 263
9.4.1 直接选择排序 263
9.4.2 堆排序 266
9.5 归并排序 270
9.6 基数排序 275
9.6.1 多关键字排序 275
9.6.2 链式基数排序 276
*9.7 外排序简介 279
9.8 内排序方法讨论 282
9.8.1 提高排序效率的方法 282
9.8.2 各种内排序方法的比较 282
习题9 285
附录 思考题 290
参考文献 292