1 概论 1
1.1 为什么学习数据结构 1
1.2 什么是数据结构 2
1.3 数据的逻辑结构 4
1.3.1 基本概念 4
1.3.2 数据的逻辑结构 5
1.3.3 数据结构的分类 6
1.4 数据的存储结构 7
1.5 数据运算和算法 9
1.5.1 数据运算 9
1.5.2 算法 10
1.5.3 算法的评价 11
习题 12
2 线性表 13
2.1 线性表的定义及基本运算 13
2.1.1 线性表的定义 13
2.1.2 线性表的基本运算 14
2.2 线性表的顺序存贮结构及其运算 14
2.2.1 线性表的顺序存储结构 14
2.2.2 顺序表的运算 15
2.3 线性表的链接存储结构及其运算 17
2.3.1 线性链表 17
2.3.2 单链表及其运算 19
2.3.3 循环链表 22
2.3.4 双向链表 24
2.3.5 线性表的应用举例 26
2.4 数组 28
2.4.1 数组的定义 28
2.4.2 数组的顺序存储结构 29
2.4.3 规则矩阵的压缩存储 30
2.4.4 稀疏矩阵及存储 32
2.5 广义表 35
2.5.1 广义表的定义 36
2.5.2 广义表的存储结构 36
习题 38
3 栈与队列 39
3.1 栈 39
3.1.1 栈的定义 39
3.1.2 栈的存储结构及其运算 40
3.1.3 栈的应用举例 45
3.2 队列 49
3.2.1 队列的定义及运算 49
3.2.2 队列的存储结构 50
3.2.3 队列的应用 54
习题 55
4 串 56
4.1 串的基本概念 56
4.2 串的存储结构 57
4.2.1 顺序存储 57
4.2.2 链接存储 57
4.2.3 索引存储 59
4.3 串的基本运算 59
习题 64
5 排序 65
5.1 排序的基本概念 65
5.2 插入排序 66
5.2.1 插入排序概述 66
5.2.2 直接插入排序 67
5.2.3 折半插入排序 68
5.2.4 希尔排序 70
5.3 选择排序 72
5.3.1 选择排序概述 72
5.3.2 直接选择排序 72
5.4 交换排序 74
5.4.1 冒泡排序 74
5.4.2 快速排序 76
5.5 归并排序 78
5.6 基数排序 80
5.6.1 多关键字的排序 80
5.6.2 基数排序 80
5.7 几种排序方法的比较 83
习题 83
6 线性表的查找 84
6.1 基本概念 84
6.2 顺序查找 85
6.3 二分法查找 86
6.4 分块查找 88
6.5 散列表及其查找 89
6.5.1 散列表的概念 89
6.5.2 散列函数的构造方法 91
6.5.3 冲突处理 93
习题 97
7 树形结构 98
7.1 树的基本概念 98
7.1.1 树的定义 98
7.1.2 常用术语 99
7.1.3 树的存储结构 100
7.2 二叉树 100
7.2.1 二叉树的定义 100
7.2.2 二叉树的基本性质 101
7.3 二叉树的链接存储 102
7.3.1 二叉链表 102
7.3.2 二叉链表的生成 103
7.4 二叉树的遍历 104
7.5 穿线二叉树 107
7.5.2 访问穿线二叉树 110
7.6 二叉排序树和平衡二叉树 111
7.6.1 二叉排序树 111
7.6.2 平衡二叉树 116
7.7 二叉树的顺序存储和堆排序 117
7.7.1 二叉树的顺序存储结构 117
7.7.2 堆排序 118
7.8 树、森林与二叉树的关系 123
7.8.1 森林与二叉树之间的转换 123
7.9 哈夫曼树 125
7.9.1 哈夫曼树的定义 126
7.9.2 哈夫曼树的构造 127
7.9.3 哈夫曼树的应用 128
7.10 B树 130
7.10.1 B-树的定义 130
7.10.2 B-树的查找 131
7.10.3 B-树的插入 132
7.10.4 B-树的删除 134
习题 135
8 图 137
8.1 图的基本概念 137
8.2 图的存储结构 140
8.2.1 邻接矩阵表示法 140
8.2.2 邻接表表示法 142
8.3 图的运算 143
8.3.1 图的建立 143
8.3.2 图的遍历 145
8.4 最小生成树 150
8.4.1 生成树和最小生成树的概念 150
8.4.2 普里姆(Prim)算法 151
8.4.3 克鲁斯卡尔(kruskal)算法 154
8.5 图的其他应用 157
8.5.1 最短路径 157
8.5.2 拓扑(topology)排序 158
习题 160