本书以提高学生的算法设计与分析能力为主旨, 全面地介绍了程序设计的基础知识、各种常用的数据结构以及排序、查找的各种算法及它们的应用。为了方便教学, 各数据结构类型和基本运算首先用类C代码加以描述, 并作了详细的注解。全书既注重原理, 又强调实践, 配有大量的图表和习题, 概念讲解清楚, 逻辑性强, 可读性好。
既注重原理,又强调实践,配有大量的图表和习题,概念讲解清楚,逻辑性强,可读性好
大数据时代已经到来,数据与算法是数据科学与工程的重要内容,而“数据结构”是计算机算法设计的重要理论和方法基础,它不仅是计算机类专业的核心课程,而且已成为其他专业的重要教学内容。“数据结构与算法”的教学目的是:让学生学会分析需要计算机处理的数据对象的特性,以选择适当的数据结构、存储结构从而选择相应的算法;初步掌握算法性能分析的方法;初步掌握将实际问题求解转化为算法,进而转化为计算机程序的能力;通过本课程的学习,使学生获得更进一步的程序设计技能训练,提高编程能力,进而提高计算机软件工程能力。
长久以来由于数据结构课程自身的抽象和严密,以及数据结构开设的时间通常在大一的第二学期,教师感觉数据结构难教,学生普遍反映数据结构难学,学生很难独立完成算法的实现。基于上述问题我们在编写本教材时充分考虑了学生的知识结构和教师的教学方法。本教材的编写遵循的原则是:既注重原理又注重实践;既注重抽象思维又注重形象思维;既方便自学又方便教学。本书的编写有以下特色。
(1)采用“任务驱动”方式来设计教学内容。除第1章外,在每一章,必要的基础知识介绍后都安排了一个问题作为学习完本章后要解决的“任务”。该问题具有两个特征:①有一定的趣味性,能较好地激发学生的学习兴趣和解决问题的动力;②综合性较强,问题的解决需要使用到本章中的知识。
(2)利用教材中的“思考”标志,提出问题拓展学生思维。“思考”不同于“习题”,“习题”的作用代替不了“思考”,因为“习题”在每个章节之后,一般要等到讲完一个章节才会遇到,因此“习题”对于课堂教学是滞后的。采用提示“思考”的方式可以在教学中恰到好处地启发学生的思维。教材使用“思考”标志通常有3种情况:一是提醒学生注意;二是启发学生基于当前知识基础进一步思考;三是提示本教材没有讲授的内容以引导学有余力的学生拓展自身知识面。另外,这些标志为“思考”的问题,可方便地应用于“翻转课堂”教学模式。
(3)在计算机专业的核心基础课程中增加计算机科学文化的知识,使学生在学习本教材的过程中,不但能学到专业知识,还能了解计算机科学发展历史的相关知识和数据结构课程与其他课程的联系;对提高学生学习本课程的兴趣,拓宽学生的知识面大有好处。
全书共分8章:第1章介绍数据结构和算法分析的基本概念及程序设计基础;第2~4章介绍线性结构及一部分与线性结构密切相关的非线性结构;第5章和第6章分别介绍树形结构和图结构;第7章和第8章分别介绍排序和查找。
本书可作为技术应用型本科院校计算机专业教材,也可为参加全国计算机软件水平程序员级别考试提供参考,还可供广大从事计算机应用的科技人员参考。本书讲授60课时左右,除第1章外每章可安排2课时上机实习。
本书是由文益民、张瑞霞、李健三位在多年从事计算机专业数据结构课程教学的经验基础上,经过多次反复磋商和共同讨论而定稿。全书由桂林电子科技大学文益民整体构思、统稿、修改,易新河、文博奚等为本书的编辑、排版做了很多工作。
由于编著者水平有限,书中难免存在不足和疏漏之处,殷切期望广大读者批评指正。
文益民
2017年1月于桂林电子科技大学
第1章绪论
1.1数据结构的基本概念
1.1.1数据结构的实例
1.1.2数据结构的概念
1.1.3学习数据结构的理由
1.2算法分析的基本概念
1.2.1算法
1.2.2算法效率的分析
1.2.3算法效率的评价
1.3程序设计基础
1.3.1软件工程的基本概念
1.3.2软件设计基础
1.3.3编码基础
1.3.4计算机体系结构基础
习题1
第2章线性表
2.1线性表的基本概念
2.1.1线性表的基本运算
2.1.2一个有趣的问题
2.2线性表的顺序表示
2.2.1顺序表
2.2.2顺序表的基本运算
2.2.3顺序表的算法分析
2.3线性表的链式表示
2.3.1线性链表
2.3.2线性链表的基本运算
2.3.3顺序表和链式表的比较
2.4双链表和循环链表
2.4.1双链表
2.4.2循环链表
2.5线性表的应用
习题2
第3章栈和队列
3.1栈的概念及运算
3.1.1栈的概念
3.1.2栈的基本运算
3.1.3一个有趣的问题
3.2栈的存储和实现
3.2.1栈的顺序表示
3.2.2栈的链式表示
3.3栈的应用
3.3.1数制转换
3.3.2表达式求值
3.3.3栈与递归
3.3.4回溯法
3.4队列的概念及基本运算
3.4.1队列的概念
3.4.2队列的基本运算
3.4.3一个有趣的问题
3.5队列的存储结构及运算
3.5.1队列的顺序表示
3.5.2循环队列
3.5.3队列的链式表示
3.6队列的应用
习题3
第4章串、广义表及数组
4.1串的定义和基本运算
4.1.1串的定义
4.1.2串的基本运算
4.1.3一个有趣的问题
4.1.4串的定长顺序存储
4.1.5模式匹配
4.1.6串的链式存储结构
4.1.7串的应用
4.2广义表
4.2.1广义表的定义
4.2.2广义表的存储
4.3数组
4.3.1数组的定义和存储
4.3.2特殊矩阵的压缩存储
习题4
第5章树
5.1树的概念及基本运算
5.1.1树的概念
5.1.2树的基本术语
5.1.3树的基本运算
5.1.4一个有趣的问题
5.1.5树的存储
5.2二叉树的概念与性质
5.2.1二叉树的概念及基本运算
5.2.2二叉树的性质
5.2.3二叉树的存储
5.3二叉树的遍历
5.4二叉树遍历算法的应用
5.5线索二叉树
5.6树和二叉树
5.6.1树与二叉树的转换
5.6.2二叉树与森林的转换
5.7哈夫曼树及其应用
5.8树的应用
习题5
第6章图
6.1图的概念及运算
6.1.1图的概念
6.1.2图的基本运算
6.1.3一个有趣的问题
6.2图的存储
6.2.1数组表示
6.2.2邻接表表示
6.3图的遍历
6.3.1深度优先搜索遍历
6.3.2广度优先搜索遍历
6.4图的连通性问题
6.4.1无向图的连通性
6.4.2最小生成树
6.4.3Prim算法
6.4.4Kruskal算法
6.5最短路径
6.5.1单源点最短路径
6.5.2任意一对顶点之间的最短路径
6.6有向无环图的应用
6.6.1AOV网
6.6.2拓扑排序
6.6.3AOE网
6.6.4关键路径
6.7图的应用
习题6
第7章排序
7.1排序的基本概念
7.2一个有趣的问题
7.3插入排序
7.3.1直接插入排序
7.3.2折半插入排序
7.3.3希尔排序
7.4交换排序
7.4.1冒泡排序
7.4.2快速排序
7.5选择排序
7.5.1直接选择排序
7.5.2树形选择排序
7.5.3堆排序
7.6归并排序
7.7排序的应用
7.8各种排序方法的综合比较
习题7
第8章查找
8.1查找的基本概念
8.2一个有趣的问题
8.3静态查找表
8.3.1顺序查找法
8.3.2折半查找法
8.3.3分块查找法
8.4动态查找表
8.5B-树
8.6哈希表
8.6.1哈希法与哈希表
8.6.2冲突处理的方法
8.6.3哈希函数的构造方法
8.6.4哈希表的查找
8.7查找的应用
习题8
参考文献