内 容 简 介数据结构是计算机专业的核心课程。本书所有算法都采用C语言描述,书中不仅讲解了数据结构的基本理论知识,还提供了大量典型的应用实例,所有实例均能直接运行,以帮助读者充分理解和掌握知识点。全书共分9章,内容包括数据结构概述、线性表、栈和队列、串、数组和广义表、树和二叉树、图、查找、排序等。本书内容实用,结构清晰,实例丰富,可操作性强,可作为本、专科院校的计算机及相关专业的数据结构教材,也可作为进行计算机软件开发、考研和软件资格(水平)考试人员的参考书。
前 言在多年来的教学与研究过程中,作者读过不少关于数据结构方面的教材,发现好多教材不是内容不够全面,就是语言表述方面偏于晦涩,看书时间久了就会比较辛苦。有鉴于此,作者采用通俗活泼的语言风格编著了本书,把这些年来学习数据结构的一些心得分享给大家,希望能对大家的学习有所帮助。数据结构是计算机科学与技术专业的一门重要的专业基础课程。当用计算机来解决实际问题时,就要涉及数据与数据之间关系的表示与处理,而这正是数据结构研究的对象。通过对数据结构的学习,可为后续课程,特别是软件方面的课程打下坚实的知识基础。因此,数据结构在计算机相关专业中起着举足轻重的作用。目前,数据结构不仅是计算机专业的必修课程,而且大多数高等院校的非计算机专业也将数据结构作为主干课程。数据结构不仅是计算机专业考研的必考科目之一,还是全国计算机等级考试、软件资格(水平)考试的主要考试内容。本书全面介绍数据结构中的线性结构、树形结构、图结构及查找、排序技术,通过图和实例的形式分析了算法思想,以便读者理解和掌握。相信学完本书之后,读者将具备一定的抽象思维的能力和算法设计的能力。本书的特点1.内容全面,讲解详细本书涵盖了数据结构中线性结构、树形结构和图结构的所有知识点,对于每一种数据结构,都使用了所有可能的逻辑结构和存储结构进行描述,并对算法的实现尽量多地采用多种实现方式,如递归和非递归、顺序存储和链式存储,从而使读者对算法的理解更加深刻。2.层次清晰,结构合理本书将数据结构按章、节划分知识点,将知识点细化,易于读者理解。在知识点的讲解过程中,循序渐进,由浅入深,先引出概念,然后用例子说明,最后是算法描述与程序实现。这样的层次十分易于读者的理解和消化。3.结合图表,叙述简单在每个概念提出后,都结合图表和例子加以说明以方便读者理解。在内容的描述上,普遍采用短句子、易于理解的语言,而避免使用复杂句子和晦涩难懂的语言。通过以上方式的描述,读者可以更加容易和轻松地学习数据结构。
4.例子典型,深入剖析在例子的选取上,都是一些最为常见且涵盖知识点丰富的典型算法。在每章的最后,都会给出一个完整的程序,对算法进行剖析,并给出程序运行结果,以帮助读者分析、理解算法。5.配有习题,巩固知识在每章的最后,都有一个小结,对本章的知识点进行总结。为了让读者熟练编写算法,本书在每章的最后都会配有一定数量的实践题目,在学习每章的内容之后,可以通过这些习题试着编写算法,以巩固本章的学习内容。本书的内容第1章:如果读者刚接触数据结构,这一章将告诉您数据结构是什么,以及本书的学习目标、学习方法和学习内容;另外,还介绍了本书对算法的描述方法。第2章:主要介绍了线性表。首先讲解线性表的逻辑结构,然后介绍线性表的各种常用存储结构,在每一节均给出了算法的具体应用。通过学习这一章,读者可以掌握顺序表、动态链表和静态链表的操作。第3章:主要介绍操作受限的线性表——栈和队列,内容包括栈的定义,栈的基本操作及栈与递归的转化,队列的概念,顺序队列和链式队列的运算。第4章:主要介绍一种特殊的线性表——串。首先介绍串的概念,然后介绍串的各种存储表示,以及串的模式匹配算法。第5章:主要介绍数组与广义表。首先介绍数组的概念,数组(矩阵)的存储结构及运算,几种特殊矩阵;然后介绍广义表的概念,广义表的两种存储方式,广义表的操作实现。第6章:主要介绍非线性数据结构——树和二叉树。首先介绍树和二叉树的概念,然后介绍树和二叉树的存储表示、二叉树的性质、二叉树的遍历和线索化、树、森林与二叉树的转换及哈夫曼树。第7章:主要介绍非线性数据结构——图。首先介绍图的概念和存储结构,然后介绍图的遍历、最小生成树、拓扑排序、关键路径及最短路径。第8章:主要介绍数据结构的常用技术——查找。首先介绍查找的概念,然后结合具体实例介绍各种查找算法,并给出了完整程序。第9章:主要介绍数据结构的常用技术——排序。首先介绍排序的相关概念,然后介绍各种排序技术,并给出了具体实现算法。本书由陈锐(高级程序员)担任主编,空军航空大学的扶晓、北京联合大学的刘琨、郑春霞担任副主编,大连外国语学院的李绍华、河南工业大学的沈献念、郑州科技学院的汪东芳和张思卿、重庆科创职业学院的李学国、西安文理学院的王悦、长安大学的黄美玲参编。全书由陈锐统稿、定稿。在本书的出版过程中,得到了来自中原工学院的夏敏捷、山东师范大学的李忠、华中师范大学汉口分校的刘河、北京信息职业技术学院的李红、渤海船舶职业学院的邢容、湖南娄底职业学院的刘益洪、华北水利水电学院的徐艳杰等老师的支持,在此表示衷心感谢。由于作者水平有限,书中难免存在一些不足之处,恳请读者批评指正。邮件地址:nwuchenrui@126.com。编 者
目 录
第1章 数据结构概述1.1 数据结构的发展概况1.2 数据结构的基本概念1.3 算法的描述与算法的分析1.3.1 算法的定义与特性1.3.2 算法设计的要求1.3.3 算法的描述1.3.4 算法分析1.4 关于数据结构的学习习题第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.3.4 双向链表2.3.5 静态链表2.4 综合案例──一元多项式的相加2.4.1 一元多项式的表示与存储2.4.2 一元多项式的相加2.5 顺序表和链表的比较2.6 小结习题第3章 栈和队列3.1 栈3.1.1 栈的定义3.1.2 栈的抽象数据类型3.1.3 栈的顺序表示与实现3.1.4 顺序栈的基本运算3.1.5 共享栈的问题3.1.6 栈的链式表示与实现3.1.7 栈的应用举例3.1.8 栈与递归3.2 队列3.2.1 队列的定义3.2.2 队列的抽象数据类型3.2.3 队列的表示与实现3.2.4 队列的应用举例3.3 小结习题第4章 串4.1 串的基本概念4.1.1 串的基本概念4.1.2 串的抽象数据类型4.2 串的存储实现4.2.1 定长顺序串4.2.2 串的模式匹配4.3 堆串与块链串4.3.1 堆串的存储结构4.3.2 堆串的基本运算4.3.3 块链串4.4 小结习题第5章 数组和广义表5.1 数组的定义及基本操作5.1.1 数组的定义5.1.2 数组的抽象数据类型5.1.3 数组的存储表示5.2 特殊矩阵的压缩存储5.2.1 对称矩阵5.2.2 三角矩阵5.2.3 带状矩阵5.3 稀疏矩阵5.3.1 稀疏矩阵的三元组表存储5.3.2 稀疏矩阵的十字链表存储5.4 广义表5.4.1 广义表的定义5.4.2 广义表的存储结构5.4.3 广义表基本操作的实现5.5 小结习题第6章 树和二叉树6.1 树6.1.1 树的定义6.1.2 树的基本术语6.1.3 树的表示形式6.1.4 树的抽象数据类型6.2 二叉树6.2.1 二叉树的定义与性质6.2.2 二叉树的存储结构6.2.3 二叉树的基本操作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.6 哈夫曼树及其应用6.6.1 哈夫曼树6.6.2 哈夫曼编码6.6.3 哈夫曼编码算法的实现6.7 小结习题第7章 图7.1 图的基本概念7.1.1 图的定义7.1.2 图的相关概念7.1.3 图的抽象数据类型7.2 图的存储结构7.2.1 邻接矩阵表示法7.2.2 邻接表表示法7.2.3 十字链表表示法7.2.4 邻接多重链表表示法7.3 图的遍历7.3.1 图的深度优先搜索7.3.2 图的广度优先搜索7.3.3 图的遍历应用举例7.4 图的应用7.4.1 图的连通性问题7.4.2 有向无环图7.4.3 最短路径7.5 小结习题第8章 查找8.1 查找的基本概念8.2 基于线性表的查找8.2.1 顺序查找8.2.2 折半查找8.2.3 分块查找8.3 基于树的查找8.3.1 二叉排序树8.3.2 平衡二叉排序树8.3.3 B_树8.4 哈希表的查找8.4.1 哈希函数的构造方法8.4.2 处理冲突的方法8.4.3 哈希表的查找与分析8.4.4 哈希表的应用举例8.5 小结习题第9章 排序9.1 排序的基本概念9.2 插入排序9.2.1 直接插入排序9.2.2 折半插入排序9.2.3 希尔排序9.3 交换排序9.3.1 冒泡排序9.3.2 快速排序9.4 选择排序9.4.1 简单选择排序9.4.2 堆排序9.5 归并排序9.6 基数排序9.6.1 基数排序的算法思想9.6.2 基数排序的算法实现9.7 各种排序的性能比较9.8 小结习题参考文献