耿国华老师的这本书以其严谨的学术风格、清晰的逻辑结构和丰富的实例而著称,非常适合作为计算机专业学生学习数据结构的入门和进阶教材。

(图片来源网络,侵删)
教材整体特点
- 语言基础明确:书名明确指出“用C语言描述”,这意味着书中所有的算法和示例代码都基于C语言实现,这对于已经掌握了C语言基础,希望学习如何用C语言来高效组织和管理数据的学生来说非常直接。
- 理论与实践并重:不仅系统地阐述了数据结构的基本概念、逻辑结构和存储结构,更重要的是,通过大量的C语言代码示例,将抽象的理论知识具体化、可操作化。
- 结构清晰,循序渐进:教材通常按照“基本概念 → 线性结构 → 树形结构 → 图状结构 → 查找与排序”的逻辑顺序展开,符合人们的认知规律,便于学习和复习。
- 内容全面,重点突出:涵盖了数据结构课程的所有核心知识点,包括数组、链表、栈、队列、树、图、查找算法和排序算法等,并对每种结构的原理、操作和复杂度分析都进行了深入讲解。
核心内容结构详解
以下是耿国华版《数据结构》通常会包含的核心章节内容,并用C语言的关键思想进行描述。
第1章:绪论
- 核心概念:
- 数据:描述客观事物的符号,是计算机操作的对象。
- 数据元素:数据的基本单位,在程序中通常作为一个整体进行考虑。
- 数据项:数据元素中有独立含义的、不可分割的最小单位。
- 数据对象:性质相同的数据元素的集合,是数据的一个子集。
- 数据结构:相互之间存在一种或多种特定关系的数据元素的集合,它包含两个要素:
- 数据的逻辑结构:数据元素之间的逻辑关系,与具体计算机无关,分为:
- 集合结构:元素间没有特定关系。
- 线性结构:元素之间是“一对一”的关系(如:数组、链表)。
- 树形结构:元素之间是“一对多”的关系(如:二叉树)。
- 图状结构(网状结构):元素之间是“多对多”的关系(如:图)。
- 数据的物理结构(存储结构):数据在计算机内存中的存储方式,主要有:
- 顺序存储:用一段连续的内存空间存储数据元素,逻辑上相邻的元素物理上也相邻,C语言中通常用数组实现。
- 链式存储:用不连续的内存空间存储数据元素,每个元素包含数据本身和指向下一个元素的指针,C语言中通常用结构体 + 指针实现。
- 索引存储。
- 散列存储。
- 数据的逻辑结构:数据元素之间的逻辑关系,与具体计算机无关,分为:
- 算法:解决特定问题求解步骤的描述,衡量算法好坏的指标是时间复杂度和空间复杂度。
第2章:线性表
- 逻辑结构:最简单、最常用的一种数据结构,元素之间是“一对一”的线性关系。
- 存储结构实现:
- 顺序表:
- C语言描述:使用一个结构体封装一个动态分配的数组和其长度。
#define INIT_SIZE 100 typedef struct { ElemType *data; // 动态数组指针 int length; // 当前长度 int capacity; // 总容量 } SqList; - 特点:随机访问速度快(O(1)),但插入和删除元素需要移动大量元素(最坏O(n)),且空间大小固定(动态数组可缓解)。
- C语言描述:使用一个结构体封装一个动态分配的数组和其长度。
- 链表:
- C语言描述:定义节点结构体,包含数据域和指针域。
typedef struct LNode { ElemType data; // 数据域 struct LNode *next; // 指针域,指向下一个节点 } LNode, *LinkList; - 特点:插入和删除操作灵活(O(1),已知位置时),不需要预先分配空间,但随机访问速度慢(需遍历,O(n))。
- 变种:单链表、双向链表、循环链表、静态链表。
- C语言描述:定义节点结构体,包含数据域和指针域。
- 顺序表:
第3章:栈和队列
- 共同点:是两种特殊的线性表,插入和删除操作被限制在表的一端进行。
- 栈:
- 特点:后进先出,允许插入和删除的一端称为栈顶。
- C语言描述:通常用顺序存储(顺序栈)或链式存储(链栈)实现,顺序栈需要一个
top指针指示栈顶。 - 应用:函数调用、表达式求值、括号匹配、递归实现等。
- 队列:
- 特点:先进先出,允许插入的一端叫队尾,允许删除的一端叫队头。
- C语言描述:通常用链式存储(链队列)实现,避免顺序存储的“假溢出”问题,顺序存储的队列需要实现为循环队列。
- 应用:任务调度、广度优先搜索、缓冲区管理等。
第4章:串
- 逻辑结构:一种特殊的线性表,其数据元素是字符。
- 存储结构:
- 定长顺序存储:用字符数组实现。
- 堆分配存储:动态分配一块连续空间存储字符串,非常灵活。
- 块链存储:用链表存储,每个节点存放多个字符。
- 核心操作:串的赋值、连接、求子串、模式匹配(KMP算法是重点和难点)。
第5章:数组和广义表
- 数组:
- 逻辑结构:线性结构的推广,是“n维”的。
- 物理结构:在内存中是顺序存储的,行优先(C语言)和列优先(Fortran)是两种主要的存储方式。
- 广义表:
- 逻辑结构:线性表的推广,其元素可以是原子,也可以是子表。
- C语言描述:通常用联合体和指针实现,以区分原子和子表。
- 特点:结构灵活,可以表示复杂的树形结构。
第6章:树和二叉树
- 树:
- 逻辑结构:一种“一对多”的层次结构。
- 基本术语:根、节点、边、度、叶子节点、分支节点、层次、高度/深度等。
- 二叉树:
- 定义:度不超过2的有序树。
- 重要性质:第i层最多有
2^(i-1)个节点;深度为k的二叉树最多有2^k - 1个节点;叶子节点数n0 = n2 + 1(n2为度为2的节点数)。 - 存储结构:
- 顺序存储:适合完全二叉树,用数组实现,浪费空间少。
- 链式存储:最常用,定义节点结构体,包含数据、左孩子指针、右孩子指针。
typedef struct BiTNode { ElemType data; struct BiTNode *lchild, *rchild; } BiTNode, *BiTree;
- 遍历:是二叉树的核心操作,有四种方式:
- 前序遍历:根 -> 左 ->右
- 中序遍历:左 -> 根 -> 右
- 后序遍历:左 -> 右 -> 根
- 层序遍历:从上到下,从左到右(通常借助队列实现)。
- 应用:二叉搜索树、AVL树、哈夫曼树、堆等。
第7章:图
- 逻辑结构:最复杂的数据结构,元素之间是“多对多”的关系。
- 基本术语:顶点、边、弧、有向图、无向图、带权图(网)、度、入度、出度、路径、连通图等。
- 存储结构:
- 邻接矩阵:用一个二维数组表示,适合稠密图,易于判断顶点间是否有边。
- 邻接表:为每个顶点建立一个单链表,链表中的节点代表与该顶点相邻的顶点,适合稀疏图,节省空间。
- 核心操作:图的遍历。
- 深度优先搜索:类似树的先序遍历,借助栈(或递归调用栈)实现。
- 广度优先搜索:类似树的层序遍历,借助队列实现。
- 应用:最小生成树(Prim、Kruskal算法)、最短路径(Dijkstra、Floyd算法)、拓扑排序等。
第8章:查找
- 概念:在数据集合中寻找特定关键字的数据元素。
- 静态查找表:数据集合在查找过程中不改变。
- 顺序查找:简单,效率低(O(n))。
- 折半查找:要求数据有序,效率高(O(log n))。
- 动态查找表:在查找过程中可能会插入或删除元素。
- 二叉排序树:左子树所有值 < 根节点值 < 右子树所有值,查找、插入、删除的平均时间复杂度为O(log n),但最坏情况会退化为O(n)。
- 平衡二叉树:通过旋转操作保持树的平衡,确保查找效率稳定在O(log n)。
- B树和B+树:用于文件系统和数据库索引,是多路平衡查找树。
- 哈希表:通过哈希函数将关键字映射到存储位置,核心是哈希函数的设计和冲突的解决方法(如链地址法、开放定址法),理想情况下,查找时间复杂度接近O(1)。
第9章:排序
- 概念:将一组无序的数据元素按特定关键字重新排列成有序序列。
- 分类:
- 插入排序:直接插入排序、希尔排序。
- 交换排序:冒泡排序、快速排序。
- 选择排序:简单选择排序、堆排序。
- 归并排序。
- 基数排序。
- 学习要点:
- 掌握每种排序算法的基本思想。
- 能够画出排序过程的示意图。
- 会用C语言实现每种算法。
- 分析每种算法的时间复杂度和空间复杂度(最好、最坏、平均情况)。
- 理解算法的稳定性(相等元素的相对位置是否改变)。
学习建议
- 课前预习:提前阅读教材,了解基本概念,带着问题听课。
- 重视课堂:听老师如何分析问题、设计算法,这是理解算法思想的最佳途径。
- 动手实践:这是学习数据结构最关键的一步! 亲手将书中的C语言代码敲到编译器中,运行、调试、修改,尝试自己实现数据结构的创建、插入、删除、遍历等基本操作。
- 勤于画图:对于树、图等结构,画图是理解其逻辑关系和遍历过程的最好方法,画出链表的指针变化、树的递归调用栈、图的遍历路径等。
- 多做习题:教材后的习题是检验学习成果、加深理解的有效手段,尤其是算法设计题,能极大地锻炼编程能力。
- 对比总结:将相似的数据结构(如顺序表和链表、栈和队列)或算法(如各种排序算法)放在一起对比,分析它们的优缺点和适用场景,形成知识网络。
耿国华老师的《数据结构(用C语言描述)》是一本非常优秀的基础教材,学好它,不仅能让你掌握数据结构的理论知识,更能让你具备用C语言解决复杂问题的扎实能力,为后续学习操作系统、编译原理、数据库等课程打下坚实的基础。

(图片来源网络,侵删)
