图书目录

第1章绪论1

1.1什么是数据结构2

1.2抽象数据类型及面向对象概念4

1.2.1数据类型4

1.2.2数据抽象与抽象数据类型(ADTs: Abstract Data Types)4

1.2.3面向对象的概念5

1.2.4用于描述数据结构的语言7

1.3数据结构的抽象层次7

*1.4用C++描述面向对象程序9

1.4.1C++的函数特征9

1.4.2C++的数据声明10

1.4.3C++的作用域11

1.4.4C++的类11

1.4.5C++中的对象13

1.4.6C++的输入输出13

1.4.7C++中的函数15

1.4.8C++中的参数传递15

1.4.9C++中的函数名重载和操作符重载16

1.4.10C++中的动态存储分配17

1.4.11友元(friend)函数18

1.4.12内联(inline)函数18

1.4.13结构(struct)与类18

1.4.14联合(Union)与类19

1.5算法定义19

1.6模板(template)20

1.7性能分析与度量23

1.7.1算法的性能标准23

*1.7.2算法的后期测试24

1.7.3算法的事前估计26

1.7.4空间复杂度度量26

1.7.5时间复杂度度量27

1.7.6时间复杂度的渐进表示法31

1.7.7渐进的空间复杂度34

习题34

第2章数组37

2.1作为抽象数据类型的数组37

2.1.1在C++中数组的定义和初始化37

2.1.2作为抽象数据类型的数组38

2.1.3数组的顺序存储方式40

2.2顺序表42

2.2.1顺序表的定义和特点43

2.2.2顺序表的类定义43

2.2.3顺序表的查找、插入和删除45

2.2.4作为抽象数据类型,使用顺序表的事例47

*2.3多项式抽象数据类型47

2.3.1多项式抽象数据类型48

2.3.2多项式的表示49

2.3.3多项式的相加51

2.4稀疏矩阵53

2.4.1稀疏矩阵的抽象数据类型53

2.4.2稀疏矩阵的压缩表示53

*2.4.3稀疏矩阵的转置54

*2.4.4稀疏矩阵相乘57

2.5字符串59

2.5.1字符串抽象数据类型和类定义59

2.5.2字符串操作的实现61

2.5.3字符串的模式匹配63

*2.5.4模式匹配的改进算法——KMP(D.E.Knuth—J.H.Morris—V.R.Pratt)

算法64

习题68

第3章链表71

3.1单链表(Singly Linked List)71

3.1.1单链表的结构71

3.1.2单链表的类定义72

3.1.3单链表中的插入与删除73

3.1.4带表头结点的单链表75

3.1.5用模板定义的单链表类76

3.1.6单链表的游标(Iterator)类79

3.1.7静态链表81

3.2循环链表82

3.2.1循环链表的类定义82

3.2.2用循环链表求解约瑟夫问题83

*3.3多项式及其相加84

3.3.1多项式的类定义84

3.3.2多项式的加法85

3.4双向链表87

3.5稀疏矩阵92

3.5.1稀疏矩阵的类定义92

3.5.2稀疏矩阵的建立94

3.5.3删除稀疏矩阵95

3.6C++中的虚函数和动态联编96

3.6.1C++中的继承(inheritance)96

3.6.2基类与派生类对象指针的转换97

3.6.3虚函数(virtual function)99

3.6.4纯虚函数和抽象基类99

3.6.5多态性(polymorphism)和动态联编99

习题101

第4章栈和队列103

4.1栈103

4.1.1栈的抽象数据类型103

4.1.2栈抽象数据类型的顺序存储表示与实现——顺序栈104

4.1.3栈抽象数据类型的链接存储表示——链式栈106

*4.2表达式的计算(Expression Evaluation)107

4.2.1表达式107

4.2.2应用后缀表示计算表达式的值108

4.2.3中缀表达式转换为后缀表达式111

4.3队列113

4.3.1队列的抽象数据类型113

4.3.2队列的顺序存储表示——循环队列114

4.3.3队列的链接存储表示——链式队列116

4.3.4队列的应用举例——打印二项展开式(a+b)j的系数118

4.4优先级队列(Priority Queue)119

4.4.1优先级队列的定义119

4.4.2优先级队列的存储表示和实现120

*4.5事件驱动模拟(Event\|Driven Simulation)121

习题130

第5章递归(RECURVE)132

5.1递归的概念132

5.2迷宫问题135

5.3递归过程与递归工作栈138

*5.4利用栈实现的迷宫问题非递归解法142

5.5广义表(General Lists)145

5.5.1广义表的概念146

5.5.2广义表的表示及操作147

5.5.3广义表存储结构的实现149

5.5.4广义表的访问算法151

5.5.5广义表的递归算法153

*5.5.6三元多项式的表示159

习题161

第6章树与森林163

6.1树和森林的概念163

6.1.1树的定义163

6.1.2树的术语163

6.1.3树的抽象数据类型164

6.2二叉树(Binary Tree)165

6.2.1二叉树的定义165

6.2.2二叉树的性质166

6.2.3二叉树的抽象数据类型167

6.3二叉树的表示168

6.3.1数组表示168

6.3.2链表存储表示169

6.4二叉树遍历(Binary Tree Traversal)172

6.4.1中序遍历(Inorder Traversal)173

6.4.2前序遍历(preorder Traversal)173

6.4.3后序遍历(Postorder Traversal)174

6.4.4应用二叉树遍历的事例175

*6.4.5二叉树遍历的游标类(Tree Iterator)177

*6.4.6不用栈的二叉树中序遍历算法182

*6.5线索化二叉树(Threaded Binary Tree)182

6.5.1线索(Thread)182

6.5.2中序线索化二叉树183

6.5.3前序与后序的线索化二叉树188

6.6堆(Heap)189

6.6.1堆的定义190

6.6.2堆的建立191

6.6.3堆的插入与删除192

6.7树与森林194

6.7.1树的存储表示194

6.7.2森林与二叉树的转换199

6.7.3树的遍历200

6.7.4森林的遍历202

*6.8二叉树的计数203

6.9霍夫曼树(Huffman Tree)206

6.9.1路径长度(Path Length)206

6.9.2霍夫曼树207

6.9.3霍夫曼编码209

习题210

第7章集合与搜索212

7.1集合及其表示212

7.1.1集合基本概念212

7.1.2以集合为基础的抽象数据类型213

7.1.3用位向量实现集合抽象数据类型213

7.1.4用有序链表实现集合的抽象数据类型215

7.2等价类和并查集219

7.2.1等价关系与等价类219

7.2.2确定等价类的链表方法220

7.2.3并查集222

7.3静态搜索结构227

7.3.1搜索的概念227

7.3.2静态搜索结构228

7.3.3顺序搜索229

7.3.4基于有序顺序表的折半搜索231

*7.3.5基于有序顺序表的斐波那契搜索和插值搜索234

7.4二叉搜索树235

7.4.1定义235

7.4.2二叉搜索树上的搜索237

7.4.3二叉搜索树的插入238

7.4.4二叉搜索树的删除239

*7.4.5与二叉搜索树相关的中序游标类240

*7.5最优二叉搜索树242

7.5.1扩充二叉搜索树242

7.5.2最优二叉搜索树243

7.6AVL树247

7.6.1AVL树的定义247

7.6.2平衡化旋转248

7.6.3AVL树的插入和删除252

7.6.4AVL树的高度255

习题256

第8章图259

8.1图的基本概念259

8.1.1图的基本概念259

8.1.2图的抽象数据类型261

8.2图的存储表示262

8.2.1邻接矩阵262

8.2.2邻接表265

8.2.3邻接多重表269

8.3图的遍历与连通性270

8.3.1深度优先搜索271

8.3.2广度优先搜索272

8.3.3连通分量273

8.3.4重连通分量274

8.4最小生成树277

8.4.1克鲁斯卡尔(Kruskal)算法278

8.4.2普里姆(Prim)算法280

8.5最短路径283

8.5.1边上权值非负情形的单源最短路径问题283

*8.5.2边上权值为任意值的单源最短路径问题286

8.5.3所有顶点之间的最短路径288

8.6活动网络290

8.6.1用顶点表示活动的网络290

8.6.2用边表示活动的网络294

习题298

第9章排序301

9.1概述301

9.2插入排序303

9.2.1直接插入排序303

9.2.2折半插入排序304

9.2.3链表插入排序305

9.2.4希尔排序307

9.3交换排序309

9.3.1起泡排序309

9.3.2快速排序310

9.4选择排序312

9.4.1直接选择排序313

9.4.2锦标赛排序313

9.4.3堆排序317

9.5归并排序318

9.5.1归并318

9.5.2迭代的归并排序算法319

9.5.3递归的表归并排序321

*9.6基数排序323

9.6.1多关键码排序323

9.6.2链式基数排序324

9.7外排序326

9.7.1外排序的基本过程326

9.7.2k路平衡归并329

9.7.3初始归并段的生成333

*9.7.4并行操作的缓冲区处理337

9.7.5最佳归并树339

习题341

第10章索引结构与散列344

10.1静态索引结构344

10.1.1线性索引344

10.1.2倒排表346

10.1.3m路静态搜索树347

10.2动态索引结构348

10.2.1动态的m路搜索树348

10.2.2B-树350

10.2.3B-树的插入352

10.2.4B-树的删除354

10.2.5B+树358

*10.3Trie树361

10.3.1Trie树的定义361

10.3.2Trie树的搜索362

10.3.3在Trie树上的插入和删除363

10.4散列(Hashing)364

10.4.1词典(Dictionary)的抽象数据类型364

10.4.2散列表与散列方法365

10.4.3散列函数365

10.4.4处理溢出的闭散列方法369

10.4.5处理溢出的开散列方法——链地址法376

10.4.6散列表分析378

*10.5可扩充散列379

10.5.1二叉Trie树379

10.5.2将二叉Trie树转换为目录380

10.5.3插入与目录扩充383

10.5.4删除与目录收缩385

10.5.5性能分析386

习题388

附录实习要求与实习报告391

实习1栈和队列396

实习2串(内容: 全屏幕文本编辑器)396

实习3树(内容: 作业调度)398

实习4图(内容: 某公园导游图)399

实习5查找、排序(内容: 简单的职工管理系统)399

参考文献401