![](https://img-blog.csdnimg.cn/20190314201717492.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法教程(旧版)
文章平均质量分 85
这套入门教程不仅讲解了基本的数据结构,还讲解了经典的算法,并把它们付诸实践,解决生活中的实际问题,例如停车场管理系统、迷宫游戏、字符过滤系统等。
本教程最大的特点是通俗易懂,深入浅出,摒弃教条主义,以“生动有趣”的笔风来讲解每个知识点。
数据结构和算法教程(C语言版)
将近8年的C语言和数据结构辅导经验,一对一辅导 C 语言,一对一辅导数据结构,需要的私我。
展开
-
什么是数据结构
当你决定看这篇文章,就意味着系统学习数据结构的开始。本节,我们先来讲什么是数据结构。数据结构,直白地理解,就是研究数据的存储方式。我们知道,数据存储只有一个目的,即为了方便后期对数据的再利用,就如同我们使用数组存储{1,2,3,4,5}是为了后期取得它们的加和值,无缘由的数据存储行为是对存储空间的不负责任。因此,数据在计算机存储空间的存放,决不是胡乱的,这就要求我们选择一种好的方式...原创 2020-03-18 17:48:18 · 1849 阅读 · 0 评论 -
数据结构有哪些,常用数据结构详解
通过上节我们知道,数据结构是学习数据存储方式的一门学科,那么,数据存储方式有哪几种呢?本节将对数据结构的学习内容做一个简要的总结。数据结构大致包含以下几种存储结构:线性表,还可细分为顺序表、链表、栈和队列; 树结构,包括普通树,二叉树,线索二叉树等; 图存储结构;下面对各种数据结构做详细讲解。线性表线性表结构存储的数据往往是可以依次排列的,就像小朋友手拉手,每位学生的前面和后面...原创 2020-03-18 17:48:07 · 1292 阅读 · 0 评论 -
算法时间复杂度和空间复杂度(看了无师自通)
算法,即解决问题的方法。同一个问题,使用不同的算法,虽然得到的结果相同,但是耗费的时间和资源是不同的。就比如要拧一个螺母,使用扳手还是钳子是有区别的,虽然使用钳子也能拧螺母,但是没有扳手好用。“条条大路通罗马”,解决问题的算法有多种,这就需要判断哪个算法“更好”。算法VS程序很多人误以为程序就是算法,其实不然:算法是解决某个问题的想法、思路;而程序是在心中有算法的前提下编写出来的可以运...原创 2019-03-13 19:35:57 · 1096 阅读 · 0 评论 -
数学不好,能学好数据结构吗?
数学基础不是学习数据结构的必备条件,但好的数据基础对学习数据结构大有助益。原创 2023-12-26 19:17:06 · 856 阅读 · 0 评论 -
冒泡排序算法(C语言实现)
使用起泡排序算法,其时间复杂度同实际表中数据的无序程度有关。若表中记录本身为正序存放,则整个排序过程只需进行 n-1(n 为表中记录的个数)次比较,且不需要移动记录;若表中记录为逆序存放(最坏的情况),则需要 n-1趟排序,进行 n(n-1)/2 次比较和数据的移动。所以该算法的时间复杂度为O()。当前阅读的是整套数据结构和算法教程中的一节内容,想系统学习数据结构和算法的读者,可以前往教程目录页面系统的学习,也可以猛击这里去我的个人门户网站学习,想购买教程的读者加我 q(834937624。原创 2023-11-09 19:28:41 · 64 阅读 · 0 评论 -
哈希表(散列表)详解(小白必看)
本节主要介绍了哈希表的构造及其在构造过程中对产生的冲突进行处理的方法。在选择具体使用哪种方法时,要根据查找表的实际情况具体问题具体分析。当前阅读的是整套数据结构和算法教程中的一节内容,想系统学习数据结构和算法的读者,可以前往教程目录页面系统的学习,也可以猛击这里去我的个人门户网站学习,想购买教程的读者加我 q(834937624)领取教程的 PDF 电子版。这里。原创 2023-11-09 19:22:22 · 38 阅读 · 0 评论 -
二叉排序树(二叉查找树)详解
二叉排序树是一种实现动态查找表的树形存储结构。同一张查找表中,元素的排序顺序不同,最终构建出的二叉排序树也不一样。例如,{45,24,53,12,37,93} 和 {12,24,37,45,53,93} 是同一张动态查找表,只是元素的排序顺序不同,它们对应的二叉排序树分别为:图 4 不同形态的二叉排序树左侧二叉排序树表示的是 {45,24,53,12,37,93},右侧二叉排序树表示的是 {12,24,37,45,53,93}。二叉排序树的查找性能和整棵树的形态有关。原创 2023-11-09 19:17:06 · 113 阅读 · 0 评论 -
顺序表(顺序存储结构)及初始化过程详解
顺序表,全名顺序存储结构,是线性表的一种。通过《线性表》一节的学习我们知道,线性表用于存储逻辑关系为“一对一”的数据,顺序表自然也不例外。不仅如此,顺序表对数据的物理存储结构也有要求。顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。例如,使用顺序表存储集合{1,2,3,4,5},数据最终的存储状态如图1 所示: ...原创 2019-03-13 20:01:52 · 1871 阅读 · 0 评论 -
顺序表的基本操作及C语言实现(详解版)
我们学习了顺序表及初始化的过程,本节学习有关顺序表的一些基本操作,以及如何使用 C 语言实现它们。顺序表插入元素向已有顺序表中插入数据元素,根据插入位置的不同,可分为以下 3 种情况:插入到顺序表的表头; 在表的中间位置插入元素; 尾随顺序表中已有元素,作为顺序表中的最后一个元素;虽然数据元素插入顺序表中的位置有所不同,但是都使用的是同一种方式去解决,即:通过遍历,找到数据元素要...原创 2019-03-13 20:10:03 · 3139 阅读 · 1 评论 -
链表(链式存储结构)及创建(C语言详解版)
前面详细地介绍了顺序表,本节给大家介绍另外一种线性存储结构——链表。链表,别名链式存储结构或单链表,用于存储逻辑关系为 "一对一" 的数据。与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的。例如,使用链表存储{1,2,3},数据的物理存储状态如图1 所示: ...原创 2019-03-13 20:17:13 · 964 阅读 · 2 评论 -
链表的基本操作(C语言)详解
《链表及创建》一节我们学习了如何使用链表存储数据元素,以及如何使用 C 语言创建链表。本节将详细介绍对链表的一些基本操作,包括对链表中数据的添加、删除、查找(遍历)和更改。注意,以下对链表的操作实现均建立在已创建好链表的基础上,创建链表的代码如下所示://声明节点结构typedef struct Link{ int elem;//存储整形元素 struct Link *...原创 2019-03-13 20:22:27 · 726 阅读 · 0 评论 -
静态链表及实现(C语言)详解
《顺序表和链表优缺点》一节,我们了解了两种存储结构各自的特点,那么,是否存在一种存储结构,可以融合顺序表和链表各自的优点,从而既能快速访问元素,又能快速增加或删除数据元素。静态链表,也是线性存储结构的一种,它兼顾了顺序表和链表的优点于一身,可以看做是顺序表和链表的升级版。使用静态链表存储数据,数据全部存储在数组中(和顺序表一样),但存储位置是随机的,数据之间"一对一"的逻辑关系通过一个整形变量...原创 2019-03-13 20:29:46 · 556 阅读 · 0 评论 -
静态链表基本操作(C语言实现)详解
上节,我们初步创建了一个静态链表,本节学习有关静态链表的一些基本操作,包括对表中数据元素的添加、删除、查找和更改。本节是建立在已能成功创建静态链表的基础上,因此我们继续使用上节中已建立好的静态链表学习本节内容,建立好的静态链表如图1 所示: 图 ...原创 2019-03-13 20:34:44 · 545 阅读 · 0 评论 -
双向链表基本操作(C语言实现)详解
前面学习了如何创建一个双向链表,本节学习有关双向链表的一些基本操作,即如何在双向链表中添加、删除、查找或更改数据元素。本节知识基于已熟练掌握双向链表创建过程的基础上,我们继续上节所创建的双向链表来学习本节内容,创建好的双向链表如图1 所示: 图 1 双向链表示意图双向链表添...原创 2019-03-14 13:22:40 · 3141 阅读 · 3 评论 -
双向链表及其创建(C语言)详解
目前我们所学到的链表,无论是动态链表还是静态链表,表中各节点中都只包含一个指针(游标),且都统一指向直接后继节点,通常称这类链表为单向链表(或单链表)。虽然使用单链表能 100% 解决逻辑关系为 "一对一" 数据的存储问题,但在解决某些特殊问题时,单链表并不是效率最优的存储结构。比如说,如果算法中需要大量地找某指定结点的前趋结点,使用单链表无疑是灾难性的,因为单链表更适合 "从前往后" 找,而 ...原创 2019-03-14 13:23:00 · 2899 阅读 · 0 评论 -
循环链表(约瑟夫环)的建立及C语言实现
无论是静态链表还是动态链表,有时在解决具体问题时,需要我们对其结构进行稍微地调整。比如,可以把链表的两头连接,使其成为了一个环状链表,通常称为循环链表。和它名字的表意一样,只需要将表中最后一个结点的指针指向头结点,链表就能成环儿,如图1 所示。 图 1 循环链表需要注...原创 2019-03-14 13:23:13 · 340 阅读 · 0 评论 -
什么是栈,栈及其特点和应用详解
同顺序表和链表一样,栈也是用来存储逻辑关系为 "一对一" 数据的线性存储结构,如图1 所示。 图 1 栈存储结构示意图从图 1 我们看到,栈存储结构与之前所学的线性存储结构有所差异,这缘于栈对数据 "存" 和 "取" 的过程有特殊的要求:栈只能从表的一端存取数据,另一...原创 2019-03-14 18:40:24 · 14758 阅读 · 0 评论 -
顺序栈基本操作(入栈和出栈)C语言详解
顺序栈,即用顺序表实现栈存储结构。通过前面的学习我们知道,使用栈存储结构操作数据元素必须遵守 "先进后出" 的原则,本节就 "如何使用顺序表模拟栈以及实现对栈中数据的基本操作(出栈和入栈)" 给大家做详细介绍。如果你仔细观察顺序表(底层实现是数组)和栈结构就会发现,它们存储数据的方式高度相似,只不过栈对数据的存取过程有特殊的限制,而顺序表没有。例如,我们先使用顺序表(a 数组)存储{1,2,...原创 2019-03-14 18:45:40 · 17989 阅读 · 1 评论 -
链栈基本操作(入栈和出栈)C语言详解
链栈,即用链表实现栈存储结构。链栈的实现思路同顺序栈类似,顺序栈是将数顺序表(数组)的一端作为栈底,另一端为栈顶;链栈也如此,通常我们将链表的头部作为栈顶,尾部作为栈底,如图1 所示: 图 1 链栈示意图将链表头部作为栈顶的一端,可以避免在实现数据 "入栈" ...原创 2019-03-14 18:48:57 · 19490 阅读 · 5 评论 -
什么是队列,队列及其应用(超详细)
队列,和栈一样,也是一种对数据的"存"和"取"有严格要求的线性存储结构。与栈结构不同的是,队列的两端都"开口",要求数据只能从一端进,从另一端出,如图1 所示: 图 1 队列存储结构通常,称进数据的一端为 "队尾",出数据的一端为 "队头",数据元素进队...原创 2019-03-14 18:50:40 · 5223 阅读 · 0 评论 -
顺序队列及其(C语言)实现详解
顺序队列,即采用顺序表模拟实现的队列结构。我们知道,队列具有以下两个特点:数据从队列的一端进,另一端出; 数据的入队和出队遵循"先进先出"的原则;因此,只要使用顺序表按以上两个要求操作数据,即可实现顺序队列。首先来学习一种最简单的实现方法。顺序队列简单实现由于顺序队列的底层使用的是数组,因此需预先申请一块足够大的内存空间初始化顺序队列。除此之外,为了满足顺序队列中数据从队尾进,队...原创 2019-03-14 18:54:02 · 2873 阅读 · 3 评论 -
链式队列及基本操作(C语言)完全攻略
链式队列,简称"链队列",即使用链表实现的队列存储结构。链式队列的实现思想同顺序队列类似,只需创建两个指针(命名为 top 和 rear)分别指向链表中队列的队头元素和队尾元素,如图1 所示: 图 1 链式队列的初始状态图 1 所示为链式队列的...原创 2019-03-14 18:57:33 · 2956 阅读 · 1 评论 -
串是什么,串存储结构及其实现(无师自通)
数据结构中,字符串要单独用一种存储结构来存储,称为串存储结构。这里的串指的就是字符串。严格意义上讲,串存储结构也是一种线性存储结构,因为字符串中的字符之间也具有"一对一"的逻辑关系。只不过,与之前所学的线性存储结构不同,串结构只用于存储字符类型的数据。无论学习哪种编程语言,操作最多的总是字符串。数据结构中,根据串中存储字符的数量及特点,对一些特殊的串进行了命名,比如说:空串:存储 0 个字...原创 2019-03-14 18:59:20 · 4618 阅读 · 0 评论 -
串的块链存储结构(C语言)详解
串的块链存储,指的是使用链表结构存储字符串。本节实现串的块链存储使用的是无头节点的单链表。当然根据实际需要,你也可以自行决定所用链表的结构(双向链表还是单链表,有无头节点)。我们知道,单链表中的 "单" 强调的仅仅是链表各个节点只能有一个指针,并没有限制数据域中存储数据的具体个数。因此在设计链表节点的结构时,可以令各节点存储多个数据。例如,图1 所示是用链表存储字符串shujujiego...原创 2019-03-15 08:36:36 · 4478 阅读 · 0 评论 -
串的堆分配存储结构(C语言详解版)
串的堆分配存储,其具体实现方式是采用动态数组存储字符串。通常,编程语言会将程序占有的内存空间分成多个不同的区域,程序包含的数据会被分门别类并存储到对应的区域。拿 C 语言来说,程序会将内存分为 4 个区域,分别为堆区、栈区、数据区和代码区,其中的堆区是本节所关注的。与其他区域不同,堆区的内存空间需要程序员手动使用 malloc 函数申请,并且在不用后要手动通过 free 函数将其释放。C 语...原创 2019-03-15 08:36:59 · 3191 阅读 · 0 评论 -
串的定长顺序存储结构(C语言)详解版
我们知道,顺序存储结构(顺序表)的底层实现用的是数组,根据创建方式的不同,数组又可分为静态数组和动态数组,因此顺序存储结构的具体实现其实有两种方式。通常所说的数组都指的是静态数组,如 str[10],静态数组的长度是固定的。与静态数组相对应的,还有动态数组,它使用 malloc 和 free 函数动态申请和释放空间,因此动态数组的长度是可变的。串的定长顺序存储结构,可以简单地理解为采用...原创 2019-03-15 08:37:11 · 2934 阅读 · 1 评论 -
什么是数组(数据结构),数组及其定义详解
前面学习数据结构的过程中,总是使用数组作为顺序表的底层实现,给我们一种 "数据结构中,数组的作用就是实现顺序表" 的错误认识。其实,数组的作用远不止于此。本节将从数据结构的角度讲解数组存储结构。本节所讲的数组,要将其视为一种存储结构,与平时使用的数组基本数据类型区分开。什么是数组一说起数组,我们的印象中数组往往是某一门编程语言中包含的具体数据类型,其实不然。从本质上讲,数组与顺...原创 2019-03-17 18:20:59 · 15128 阅读 · 1 评论 -
数组的顺序存储及(C语言)实现
数组作为一种线性存储结构,对存储的数据通常只做查找和修改操作,因此数组结构的实现使用的是顺序存储结构。要知道,对数组中存储的数据做插入和删除操作,算法的效率是很差的。由于数组可以是多维的,而顺序存储结构是一维的,因此数组中数据的存储要制定一个先后次序。通常,数组中数据的存储有两种先后存储方式:以列序为主(先列后行):按照行号从小到大的顺序,依次存储每一列的元素 以行序为主(先行后序)...原创 2019-03-17 18:23:43 · 3917 阅读 · 0 评论 -
矩阵(稀疏矩阵)压缩存储(3种方式)
数据结构中,提供针对某些特殊矩阵的压缩存储结构。这里所说的特殊矩阵,主要分为以下两类:含有大量相同数据元素的矩阵,比如对称矩阵; 含有大量 0 元素的矩阵,比如稀疏矩阵、上(下)三角矩阵;针对以上两类矩阵,数据结构的压缩存储思想是:矩阵中的相同数据元素(包括元素 0)只存储一个。对称矩阵 ...原创 2019-03-17 19:26:19 · 15720 阅读 · 2 评论 -
三元组顺序表,稀疏矩阵的三元组表示及(C语言)实现
本节介绍稀疏矩阵的三元组顺序表压缩存储方式。通过《矩阵的压缩存储》一节我们知道,稀疏矩阵的压缩存储,至少需要存储以下信息:矩阵中各非 0 元素的值,以及所在矩阵中的行标和列标; 矩阵的总行数和总列数; 图1 稀疏矩阵示意图例如,图 1 是一个稀疏矩...原创 2019-03-17 19:29:23 · 12554 阅读 · 4 评论 -
行逻辑链接的顺序表(压缩存储稀疏矩阵)详解
前面学习了如何使用三元组顺序表存储稀疏矩阵,其实现过程就是将矩阵中各个非 0 元素的行标、列标和元素值以三元组的形式存储到一维数组中。通过研究实现代码你会发现,三元组顺序表每次提取指定元素都需要遍历整个数组,运行效率很低。本节将学习另一种存储矩阵的方法——行逻辑链接的顺序表。它可以看作是三元组顺序表的升级版,即在三元组顺序表的基础上改善了提取数据的效率。行逻辑链接的顺序表和三元组顺序表的实现过...原创 2019-03-17 19:33:18 · 5280 阅读 · 1 评论 -
十字链表法,十字链表压缩存储稀疏矩阵详解
对于压缩存储稀疏矩阵,无论是使用三元组顺序表,还是使用行逻辑链接的顺序表,归根结底是使用数组存储稀疏矩阵。介于数组 "不利于插入和删除数据" 的特点,以上两种压缩存储方式都不适合解决类似 "向矩阵中添加或删除非 0 元素" 的问题。例如,A 和 B 分别为两个矩阵,在实现 "将矩阵 B 加到矩阵 A 上" 的操作时,矩阵 A 中的元素会发生很大的变化,之前的非 0 元素可能变为 0,而 0 元素...原创 2019-03-17 19:35:48 · 3871 阅读 · 0 评论 -
矩阵(稀疏矩阵)的转置算法(C语言)详解
矩阵(包括稀疏矩阵)的转置,即互换矩阵中所有元素的行标和列标,如图1 所示: 图 1 矩阵转置示意图但如果想通过程序实现矩阵的转置,互换行标和列标只是第一步。因为实现矩阵转置的前提是将矩阵存储起来,数据结构中提供了 3 种存储矩阵的结构,分别是三元组顺序表、行逻辑链...原创 2019-03-17 19:39:01 · 7061 阅读 · 0 评论 -
什么是广义表、广义表及定义详解
前面讲过,数组即可以存储不可再分的数据元素(如数字 5、字符 'a'),也可以继续存储数组(即 n 维数组)。但需要注意的是,以上两种数据存储形式绝不会出现在同一个数组中。例如,我们可以创建一个整形数组去存储 {1,2,3},我们也可以创建一个二维整形数组去存储 {{1,2,3},{4,5,6}},但数组不适合用来存储类似 {1,{1,2,3}} 这样的数据。有人可能会说,创建一个二维数组...原创 2019-03-17 19:46:02 · 6324 阅读 · 1 评论 -
广义表的存储结构(2种)详解
由于广义表中既可存储原子(不可再分的数据元素),也可以存储子表,因此很难使用顺序存储结构表示,通常情况下广义表结构采用链表实现。使用顺序表实现广义表结构,不仅需要操作 n 维数组(例如 {1,{2,{3,4}}} 就需要使用三维数组存储),还会造成存储空间的浪费。使用链表存储广义表,首先需要确定链表中节点的结构。由于广义表中可同时存储原子和子表两种形式的数据,因此链表节点的结构也有两种...原创 2019-03-17 19:49:21 · 10233 阅读 · 0 评论 -
广义表的复制及C语言代码实现
对于任意一个非空广义表来说,都是由两部分组成:表头和表尾。反之,只要确定的一个广义表的表头和表尾,那么这个广义表就可以唯一确定下来。复制一个广义表,也是不断的复制表头和表尾的过程。如果表头或者表尾同样是一个广义表,依旧复制其表头和表尾。所以,复制广义表的过程,其实就是不断的递归,复制广义表中表头和表尾的过程。递归的出口有两个:如果当前遍历的数据元素为空表,则直接返回空表。 如果当前遍历的...原创 2019-03-17 19:51:34 · 688 阅读 · 0 评论 -
数据结构中的树存储结构
之前介绍的所有的数据结构都是线性存储结构。本章所介绍的树结构是一种非线性存储结构,存储的是具有“一对多”关系的数据元素的集合。 (A) ...原创 2019-03-18 18:44:10 · 567 阅读 · 0 评论 -
什么是二叉树,二叉树及其性质详解
通过《树的存储结构》一节的学习,我们了解了一些树存储结构的基本知识。本节将给大家介绍一类具体的树结构——二叉树。简单地理解,满足以下两个条件的树就是二叉树:本身是有序树; 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2;例如,图1a) 就是一棵二叉树,而图 1b) 则不是。 ...原创 2019-03-18 18:54:46 · 1040 阅读 · 0 评论 -
二叉树的顺序存储结构(无师自通)
二叉树的存储结构有两种,分别为顺序存储和链式存储。本节先介绍二叉树的顺序存储结构。二叉树的顺序存储,指的是使用顺序表(数组)存储二叉树。需要注意的是,顺序存储只适用于完全二叉树。换句话说,只有完全二叉树才可以使用顺序表存储。因此,如果我们想顺序存储普通二叉树,需要提前将普通二叉树转化为完全二叉树。有读者会说,满二叉树也可以使用顺序存储。要知道,满二叉树也是完全二叉树,因为它满足完全二叉树的...原创 2019-03-18 18:56:56 · 1290 阅读 · 0 评论 -
二叉树的链式存储结构及(C语言)实现
上一节讲了二叉树的顺序存储,通过学习你会发现,其实二叉树并不适合用数组存储,因为并不是每个二叉树都是完全二叉树,普通二叉树使用顺序表存储或多或多会存在空间浪费的现象。本节我们学习二叉树的链式存储结构。 图1 普通二叉树示意图如图 1...原创 2019-03-18 18:59:35 · 5424 阅读 · 1 评论