本书在绪论部分介绍数据结构、算法的相关概念和算法分析方法等,其后各章分别讨论栈、队列、线性表、哈希表、二叉树、树、森林和图等数据结构的定义、表示和实现。将查找和排序融入相应的数据结构的讨论中,并在二叉树前介绍递归内容。在多数章节中加入应用实例,介绍运用数据结构和算法进行程序设计和解决实际问题的方法,以增强读者对基本知识的理解与掌握,有利于分析问题能力和程序设计能力的提高。全书采用C语言作为数据结构和算法的描述语言。
“数据结构”是一门研究用计算机进行信息数据表示和处理的课程。一方面,信息的表示和组织直接关系到处理信息的程序的效率;另一方面,信息的处理方法往往是根据信息的组织关系来设计的。课程致力于训练计算机软件开发人员运用抽象思维表示和处理数据,进而以计算机程序的形式运行并获得结果。
基于多年的数据结构教学经验,编者编写了这部教材,其具有以下特色。
1.内容体系重构优化
遵循循序渐进和由易到难的教学原则,重构、优化了教材内容体系。
对于线性数据结构,一改以往先介绍线性表再介绍栈和队列的做法,先介绍接口简单的栈和队列,再拓展到更一般的线性表。
紧接线性结构之后,设置“排序基础”一章,介绍排序概念和基本算法,涉及递归的排序算法则分散于后续相关章节。类似地,对于查找结构与算法,单独设置“哈希表”一章,二又排序树和平衡二叉树以及B树则安排在二叉树和树的章节中。经典的排序和查找算法都是与具体的数据结构相结合的,本质上是相应数据结构的具体应用,如此编排体现了数据结构与算法的紧密结合。
将教学难点“递归”单独设章,介绍递归函数的调用原理,通过折半查找、快速排序和归并排序3个经典算法的讨论,学习递归与分治的算法设计思想。作力从线性结构到非线性结构的过渡,广义表为后续二叉树和树的学习建立了递归数据结构的基本概念。
2.接口定义精简实用
现有教材大多对接口的定义往往是过分追求操作集的完备,而忽略了实用性,不够合理。基于对实际应用的分析和归纳,本书对各种数据结构的接口定义进行了全面的精简与优化,总体降低了教学难度,减少了学时。
比如,现有教材大多在顺序表和单链表的接口中都含有插入和删除第i个元素的操作,其中顺序表需要移动大量数据元素,单链表需要找到第i-1个位置的元素。这些操作效率不高且实际应用很少,本书已将其去掉。又如,一般二叉树的接口操作都相当多,本书将其缩减到仅7个。
3.算法代码可上机运行
本书采用扩展了引用形参的C语言描述数据结构的存储结构和接口的实现,所有代码无须转换就可以上机编译、运行和实际应用。
吴伟民,国务院政府特殊津贴专家,广东省计算机学会常务理事,广东工业大学计算机学院教授。与清华大学严蔚敏教授合著数据结构系列教材,曾先后荣获国家高校优秀教材特等奖和国家科技进步三等奖。主要研究领域:计算机系统软件与系统结构,计算机系统逆向和介入工程技术及工具,数据结构与算法,可视计算及程序可视化运行、调试与测评,程序设计语言和编译系统,虚拟机和虚拟化技术,智能系统与电器,嵌入式系统等。其他主要获奖:电子工业部科技成果二等奖、霍英东青年教师三等奖、曾宪梓高师教师三等奖、广东省教学成果二等奖、广东省计算机学会特等奖等。
第1章 绪论
1.1 数据抽象与数据结构
1.1.1 抽象与结构
1.1.2 抽象与封装
1.1.3 程序设计中的抽象
1.1.4 数据结构
1.2 抽象数据类型与应用程序接口
1.2.1 抽象数据类型
1.2.2 接口和实现
1.2.3 良好的接口设计规则
1.3 算法和算法分析
1.3.1 算法和算法描述
1.3.2 算法分析基础
1.4 数据结构与算法的描述与实现
1.4.1 一维数组
1.4.2 指针与结构体
习题1
第2章 线性数据结构
2.1 典型线性数据结构
2.1.1 线性结构的逻辑描述
2.1.2 线性结构的存储表示
2.2 顺序栈
2.2.1 栈的顺序表示和实现
2.2.2 应用举例
2.3 循环队列
2.3.1 队列的顺序表示
2.3.2 一循环队列的实现
2.3.3 应用举例
2.4 顺序表
2.4.1 线性表的顺序表示与实现
2.4.2 一元稀疏多项式
2.4.3 稀疏矩阵
2.5 链栈与链队列
2.5.1 链栈
2.5.2 链队列
2.6 线性表的链式表示和实现
2.6.1 单链表
2.6.2 双向链表
2.6.3 循环链表
2.7 线性表两种存储结构的比较
习题2
第3章 排序基础
3.1 排序的概念与分类
3.1.1 排序的概念
3.1.2 排序的分类
3.2 直接插入排序
3.3 希尔排序
3.4 基数排序
3.4.1 多关键字排序
3.4.2 基数排序
习题3
第4章 晗希表
4.1 哈希表的概念
4.2 哈希函数的构造方法
4.2.1 直接定址法
4.2.2 除留余数法
4.2.3 数字分析法
4.2.4 折叠法
4.2.5 平方取中法
4.3 处理冲突的方法
4.3.1 链地址法
4.3.2 开放定址法
4.4 哈希表的实现
4.4.1 链地址哈希表的实现
4.4.2 开放定址哈希表的实现
4.5 哈希表的查找性能
习题4
第5章 递归
5.1 递归基础
5.1.1 汉诺塔问题
5.1.2 递归函数执行过程
5.2 递归与分治
5.2.1 分治法
5.2.2 折半查找
5.2.3 归并排序
5.2.4 快速排序
5.3 递归与迭代
5.3.1 迭代三要素
5.3.2 迭代与递归的联系与区别
5.4 广义表
5.4.1 广义表的定义
5.4.2 广义表的存储结构
5.4.3 广义表常用操作的实现
习题5
第6章 二叉树
6.1 二叉树的概念和性质
6.1.1 二叉树的定义和术语
6.1.2 二叉树的性质
6.2 二叉树的存储结构
6.2.1 顺序存储结构
6.2.2 链式存储结构
6.3 遍历二叉树
6.3.1 二叉树的递归遍历
6.3.2 二叉树的非递归遍历
6.3.3 遍历的应用
6.4 堆
6.4.1 堆的定义
6.4.2 基本操作的实现
6.4.3 堆排序
6.5 二叉查找树
6.5.1 二叉查找树的定义
6.5.2 二叉查找树的查找
6.5.3 二叉查找树的插入
6.5.4 二叉查找树的删除
6.5.5 二叉查找树的查找性能
6.6 平衡二叉树
6.6.1 平衡二叉树的定义
6.6.2 平衡二叉树的失衡及调整
6.6.3 平衡二叉树的插入
习题6
第7章 树和森林
7.1 树的定义
7.2 树的存储结构
7.2.1 双亲表示法
7.2.2 双亲孩子表示法
7.2.3 孩子兄弟表示法
7.3 树和森林的遍历
7.4 并查集
7.5 B树
7.5.1 B树的定义
7.5.2 B树的查找
7.5.3 B树的插入
7.5.4 B树的删除
7.5.5 B+树
习题7
第8章 图
8.1 图的基本概念
8.1.1 图的定义
8.1.2 图的术语
8.2 图的存储结构
8.2.1 邻接数组
8.2.2 邻接表
8.3 图的遍历
8.3.1 深度优先遍历
8.3.2 广度优先遍历
8.3.3 遍历的应用
8.4 最小生成树
8.4.1 普里姆算法
8.4.2 克鲁斯卡尔算法
8.5 最短路径
8.6 拓扑排序
8.7 关键路径
习题8
参考文献