第1章绪论1 1.1数据结构的概念及分类1 1.1.1为什么要学习数据结构1 1.1.2与数据结构相关的基本术语2 1.1.3数据结构的分类5 1.1.4数据结构的存储结构7 1.1.5定义在数据结构上的操作8 1.1.6“好”数据结构8 1.2使用C语言描述数据结构8 1.2.1C的数据类型9 1.2.2算法的控制结构10 1.2.3算法的函数结构11 1.2.4动态存储分配14 1.2.5逻辑和关系运算的约定15 1.2.6输入与输出15 1.3算法和算法设计16 1.3.1算法的定义和特性16 1.3.2算法的设计步骤17 1.3.3算法设计的基本方法18 1.4算法分析与度量21 1.4.1算法的评价标准22 1.4.2算法的时间和空间复杂性度量22 1.4.3算法的渐进分析25 本章小结28 习题28 第2章线性表32 2.1线性表32 2.1.1线性表的定义和特点32 2.1.2线性表的主要操作33 2.2顺序表34 2.2.1顺序表的定义和特点34 2.2.2顺序表的结构定义35 2.2.3顺序表主要操作的实现36 2.2.4顺序表主要操作的性能分析39 2.2.5顺序表的应用举例41 2.3单链表42 2.3.1单链表的定义和特点42 2.3.2单链表的结构定义43 2.3.3单链表中指针的操作43 2.3.4单链表中的插入与删除43 2.3.5带头结点的单链表47 2.3.6单链表主要操作的性能分析48 2.3.7单链表的顺序访问与尾递归49 2.3.8单链表的应用——用有序链表表示集合52 2.4顺序表与线性链表的比较55 2.5线性链表的其他变形57 2.5.1循环链表57 2.5.2双向链表61 2.5.3静态链表65 2.6线性表的应用: 一元多项式及其运算65 2.6.1一元多项式的表示66 2.6.2多项式的结构定义与建立67 2.6.3多项式的加法69 2.6.4多项式的乘法70 本章小结71 习题72 〖2〗〖2〗第3章栈和队列78 3.1栈78 3.1.1栈的概念78 3.1.2顺序栈79 3.1.3链式栈85 3.1.4栈的混洗87 3.2队列90 3.2.1队列的概念90 3.2.2循环队列91 3.2.3双循环队列95 3.2.4链式队列96 3.3栈的应用99 3.3.1数制转换99 3.3.2括号匹配100 3.3.3表达式的计算与优先级处理101 3.3.4栈与递归的实现105 3.4队列的应用108 3.4.1打印杨辉三角形与逐行处理108 3.4.2电路布线与两点间的*短路径110 3.5在算法设计中使用递归113 3.5.1汉诺塔问题与分治法113 3.5.2排列组合与减治法116 3.5.3迷宫问题与回溯法118 3.5.4计算组合数与动态规划123 3.6双端队列125 3.6.1双端队列的概念125 3.6.2输入受限的双端队列125 3.6.3输出受限的双端队列126 3.6.4双端队列的顺序存储表示127 3.6.5双端队列的链接存储表示128 本章小结130 习题130 第4章数组、串和广义表136 4.1数组136 4.1.1一维数组136 4.1.2多维数组138 4.1.3数组的应用举例140 4.2特殊矩阵的压缩存储141 4.2.1对称矩阵的压缩存储142 4.2.2三对角矩阵的压缩存储144 4.3稀疏矩阵145 4.3.1稀疏矩阵的概念145 4.3.2稀疏矩阵的三元组表表示146 4.3.3稀疏矩阵的十字链表表示151 4.4字符串152 4.4.1字符串的概念153 4.4.2字符串的初始化和赋值153 4.4.3C语言中有关字符串的库函数154 4.4.4自定义字符串的存储表示156 4.4.5串的模式匹配161 4.4.6字符串的应用实例166 4.5广义表170 4.5.1广义表的概念170 4.5.2广义表的性质171 4.5.3广义表的链接表示171 4.5.4三元多项式的表示174 本章小结176 习题177 第5章树与二叉树182 5.1树的基本概念182 5.1.1树的定义和术语182 5.1.2树的基本操作185 5.2二叉树186 5.2.1二叉树的概念186 5.2.2二叉树的性质187 5.2.3二叉树的主要操作189 5.3二叉树的存储表示190 5.3.1二叉树的顺序存储表示190 5.3.2二叉树的链表存储表示195 5.4二叉树的遍历199 5.4.1二叉树遍历的递归算法199 5.4.2递归遍历算法的应用举例200 5.4.3二叉树遍历的非递归算法203 5.4.4层次序遍历算法的应用举例208 5.4.5二叉树的计数212 5.5线索二叉树215 5.5.1线索二叉树的概念215 5.5.2线索二叉树的种类216 5.5.3中序线索二叉树的建立和遍历217 5.5.4前序与后序线索二叉树222 5.6树与森林223 5.6.1树的双亲表示223 5.6.2树的子女链表表示227 5.6.3子女兄弟链表表示230 5.6.4森林与二叉树的转换232 5.6.5树与森林的深度优先��历234 5.6.6树与森林的广度优先遍历236 5.6.7树遍历算法的应用举例238 本章小结239 习题240 第6章树与二叉树的应用245 6.1二叉查找树245 6.1.1二叉查找树的概念245 6.1.2二叉查找树的查找246 6.1.3二叉查找树的插入247 6.1.4二叉查找树的删除249 6.1.5二叉查找树的性能分析250 6.2中序线索二叉查找树253 6.2.1中序线索二叉查找树的构建253 6.2.2中序线索二叉查找树的插入254 6.2.3中序线索二叉查找树的删除256 6.2.4中序线索二叉查找树的范围查找257 6.3AVL树257 6.3.1AVL树的概念258 6.3.2平衡化旋转258 6.3.3AVL树的插入262 6.3.4AVL树的删除264 6.3.**VL树的性能分析268 6.4Huffman树270 6.4.1带权路径长度的概念270 6.4.2Huffman树的概念270 6.4.3*优判定树274 6.4.4Huffman编码275 6.5堆280 6.5.1小根堆和大根堆280 6.5.2堆的建立281 6.5.3堆的插入283 6.5.4堆的删除284 6.6并查集285 6.6.1并查集的定义及其实现285 6.6.2并查集操作的分析和改进287 6.7八皇后问题与树的剪枝289 6.7.1八皇后问题的提出289 6.7.2八皇后问题的状态树290 6.7.3八皇后问题算法292 本章小结293 习题293 第7章图298 7.1图的基本概念298 7.1.1与图有关的若干概念298 7.1.2图的基本操作301 7.2图的存储结构303 7.2.1图的邻接矩阵表示303 7.2.2图的邻接表表示308 7.2.3邻接矩阵表示与邻接表表示的比较315 7.2.4图的邻接多重表表示315 7.3图的遍历317 7.3.1图遍历的概念317 7.3.2深度优先搜索318 7.3.3广度优先搜索319 7.3.4图中的路径与回路320 7.4图的连通性323 7.4.1无向图的连通分量323 7.4.2重连通图325 7.4.3有向图的强连通分量327 7.5*小生成树330 7.5.1*小生成树求解和贪婪法330 7.5.2Kruskal算法332 7.5.3Prim算法335 7.6*短路径337 7.6.1非负权值的单源*短路径337 7.6.2任意权值的单源*短路径341 7.6.3所有顶点之间的*短路径344 7.6.4无权值图的*短路径347 7.7活动网络348 7.7.1AOV网络与拓扑排序348 7.7.2AOE网络与关键路径法352 本章小结356 习题357 第8章查找363 8.1查找的基本概念363 8.1.1查找的概念363 8.1.2查找算法的性能分析364 8.2顺序查找法364 8.2.1在顺序表上的顺序查找算法364 8.2.2在线性链表上的顺序查找算法368 8.3折半查找法368 8.3.1折半查找法368 8.3.2重复元素序列上的折半查找371 8.3.3斐波那契查找: 折半查找的变形372 8.3.4插值查找: 折半查找的变形375 8.4*优二叉查找树376 8.4.1自下向上构造*优二叉查找树376 8.4.2自上向下构造近似*优二叉查找树380 8.5B树384 8.5.1索引顺序表与分块查找384 8.5.2多级索引结构与m叉查找树387 8.5.3B树的概念388 8.5.4B树上的查找390 8.5.5B树上的插入391 8.5.6B树上的删除393 8.5.7B 树397 8.6键树400 8.6.1键树的概念400 8.6.2双链树400 8.6.3Trie树405 8.7散列表及其查找406 8.7.1散列的概念406 8.7.2常见的散列函数407 8.7.3解决冲突的开地址法410 8.7.4解决冲突的链地址法418 8.7.5散列法分析422 本章小结424 习题424 第9章内排序432 9.1排序概述432 9.1.1排序的概念432 9.1.2排序算法的性能433 9.1.3数据表的结构定义434 9.2插入排序435 9.2.1直接插入排序436 9.2.2基于链表的直接插入排序437 9.2.3折半插入排序439 9.2.4希尔排序440 9.3交换排序442 9.3.1起泡排序442 9.3.2快速排序445 9.3.3快速排序的改进算法449 9.4选择排序452 9.4.1简单选择排序452 9.4.2堆排序454 9.4.3锦标赛排序457 9.5归并排序460 9.5.1二路归并排序的设计思路460 9.5.2二路归并排序的递归算法461 9.5.3基于链表的归并排序算法463 9.5.4迭代的归并排序算法464 9.5.5利用循环右移的二路归并算法466 9.6基数排序468 9.6.1基数排序概述469 9.6.2MSD基数排序469 9.6.3LSD基数排序472 9.7内排序算法的分析和比较475 9.7.1排序方法的下界475 9.7.2各种内排序方法的比较476 9.8时间复杂度小于O(nlog2n)的排序算法478 9.8.1计数排序算法478 9.8.2鸽巢排序算法479 9.9选择算法480 9.9.1在顺序表中查找值第k小的元素480 9.9.2在带头结点的单链表中查找倒数第k个结点481 9.9.3在带头结点的单链表中查找值为倒数第k的元素482 9.9.4不要求完全排序求前k个值*小的元素483 本章小结484 习题485 第10章外排序491 10.1主存储器和外存储器491 10.1.1磁带491 10.1.2磁盘存储器492 10.1.3缓冲区493 10.2基于磁盘的外排序过程494 10.2.1基于磁盘排序的过程494 10.2.2基于磁盘排序的性能分析495 10.3m路平衡归并496 10.3.1m路平衡归并的过程496 10.3.2用败者树选*小记录497 10.3.3败者树的构造498 10.3.4排序算法中的读写磁盘操作500 10.3.5使用败者树进行m路平衡归并排序的算法502 10.4初始归并段的生成504 10.4.1置换选择排序504 10.4.2用败者树实现置换选择排序505 10.4.3置换选择排序算法的实现505 10.4.4置换选择排序的性能分析508 10.5*佳归并树509 10.5.1归并树的构造509 10.5.2构造*佳归并树的算法510 10.5.3根据*佳归并树实现M路归并排序512 10.6并行操作的缓冲区处理514 10.6.1使用固定缓冲区实现并行操作514 10.6.2使用缓冲区队列实现并行操作515 10.7磁带归并排序517 10.7.1平衡归并排序517 10.7.2多步归并排序518 10.7.3多步归并排序初始归并段的分配518 本章小结519 习题520 附录清华大学本科生考试试题525 参考文献528