![](https://img-blog.csdnimg.cn/58eacc6755144ce388cbdbc814cc61a1.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
快速入门数据结构和算法(C语言版)
文章平均质量分 84
将近 8 年的 C 语言和数据结构辅导经验,原创了一整套数据结构和算法教程(C语言版),超过25W字,500+高清图片(含大量 gif 动画),期间大改版 2 次,语言通俗易懂,深入浅出,非常适合有 C 语言基础、想入门数据结构的小伙伴和计算机考研党阅读。
优惠券已抵扣
余额抵扣
还需支付
¥69.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
数据结构和算法教程(C语言版)
将近8年的C语言和数据结构辅导经验,一对一辅导 C 语言,一对一辅导数据结构,需要的私我。
展开
-
数据结构和算法教程(C语言版)
数据结构研究的是数据之间的关系,再进一步说,它研究的是多份数据之间的分布、排列和勾连的关系,以及在此基础之上如何进行高效的增删改查操作。数据结构是计算机专业的基础课程,也是所有程序员的内功心法;不懂数据结构就是写代码的农民,了解数据结构才能成为行业专家。六年创作,三次迭代,千般打磨,成就了现在这套精品的数据结构和算法教程。为了降低阅读门槛,本教程所有代码都基于C语言编写。原创 2023-11-04 14:20:52 · 1024 阅读 · 0 评论 -
数据结构是什么
数据结构是什么,在我看来,它是一门学科,教你如何存储那些具有复杂关系的数据。数据结构存储数据的思路(思维、思想),可以用任意一种编程语言实现。换句话说,无论你掌握哪种编程语言,也无论你从事什么开发工作,只要你和数据打交道,就一定会用到数据结构。原创 2023-11-04 14:28:16 · 104 阅读 · 0 评论 -
数据的逻辑结构和存储结构
关于数据结构,与其说它是一门研究存储数据以及数据之间关系的学科,还可以这样概括:它是一门研究数据存储结构和逻辑结构的学科。通过研究数据的物理结构,可以掌握存储数据的方法;通过研究数据的逻辑结构,可以掌握存储数据之间关系的方法。数据的存储结构有 2 种,分别是集中存储和分散存储。如果想集中存储数据,就选择顺序存储结构;如果想分散存储数据,就择链式存储结构。数据的逻辑结构有 4 种,分别是“无关系”、“一对一”、“一对多”和“多对多”。无逻辑关系的数据可以选用查找表存储结构;原创 2023-11-04 14:31:46 · 181 阅读 · 0 评论 -
数据结构到底学什么
学习数据结构,就是学习各种存储数据的方案。玩转数据结构,实际开发中遇到的各类数据存储问题都难不倒你。原创 2023-11-04 14:33:36 · 105 阅读 · 0 评论 -
时间复杂度和空间复杂度
跟随本教程学习数据结构,我们会给大家讲解一些与数据结构联系紧密的算法。所谓算法,简单理解就是解决问题的方法(方案、思路)。通常情况下,一个问题的解决方法会有很多种,或者说解决这个问题的算法有很多种。举个简单的例子,对数据集做升序排序,解决这个问题的算法就有很多种,比如冒泡排序算法、快速排序算法、归并排序算法、希尔排序算法等。借助任何一种算法,都可以得到升序序列。同一个问题,使用不同的算法,虽然都可以解决问题,但有的算法执行效率高,有的算法执行效率低。原创 2023-11-04 14:39:50 · 57 阅读 · 0 评论 -
数据结构与算法的区别(小白必读)
数据结构和算法是两个独立的学科,数据结构研究的是数据的存储问题,而算法研究是的解决问题的方法(思路)。解决实际问题,既需要用到数据结构的知识,也需要用到算法知识,数据结构和算法经常放在一起讲解。本教程在讲解数据结构的过程中,也会讲解一些关联紧密的算法,让每位读者都能学有所用,用有所成。当前阅读的是整套数据结构和算法教程中的一节内容,想系统学习数据结构和算法的读者,可以前往教程目录页面系统的学习,也可以猛击这里去我的个人门户网站学习,想购买教程的读者加我 q(834937624。原创 2023-11-08 20:02:22 · 890 阅读 · 0 评论 -
数据结构难学吗,如何才能学会?
熟练掌握一门编程语言,是学习数据结构的必备条件,没有任何捷径可以走。数据结构本身并不难学,找到适合自己的学习资料,学习过程中多动手敲代码,必要时手动画一画数据的存储状态,就一定能学好数据结构。当前阅读的是整套数据结构和算法教程中的一节内容,想系统学习数据结构和算法的读者,可以前往教程目录页面系统的学习,也可以猛击这里去我的个人门户网站学习,想购买教程的读者加我 q(834937624)领取教程的 PDF 电子版。原创 2023-11-08 20:13:50 · 628 阅读 · 0 评论 -
数学不好,能学好数据结构吗?
数学基础不是学习数据结构的必备条件,但好的数据基础对学习数据结构大有助益。原创 2023-12-26 19:17:06 · 856 阅读 · 0 评论 -
学好数据结构,你能超越99%的程序员!
和学习某一门编程语言不同,随学即用,常常会带给你学习的快感。有些知识并非学习了就能立竿见影,但学懂它会让你有整体的提升,数据结构就是这样的知识。原创 2023-12-26 19:18:39 · 937 阅读 · 0 评论 -
线性表(线性存储结构)是什么
线性表又称线性存储结构,是最简单的一种存储结构,专门用来存储逻辑关系为“一对一”的数据。在一个数据集中,如果每个数据的左侧都有且仅有一个数据和它有关系,数据的右侧也有且仅有一个数据和它有关系,那么这些数据之间就是“一对一“的逻辑关系。举个简单的例子:图 1 "一对一"逻辑关系的数据如上图所示,在 {1,2,3,4,5} 数据集中,每个数据的左侧都有且仅有一个数据和它紧挨着(除 1 外),右侧也有且仅有一个数据和它紧挨着(除 5 外),这些数据之间就是“一对一“的关系。原创 2023-11-04 15:33:12 · 101 阅读 · 0 评论 -
顺序表(顺序存储结构)是什么
顺序表又称顺序存储结构,是线性表的一种,专门存储逻辑关系为“一对一”的数据。顺序表存储数据的具体实现方案是:将数据全部存储到一整块内存空间中,数据元素之间按照次序挨个存放。举个简单的例子,将 {1,2,3,4,5} 这些数据使用顺序表存储,数据最终的存储状态如下图所示:图 1 顺序存储结构示意图。原创 2023-11-04 15:37:35 · 196 阅读 · 0 评论 -
顺序表的基本操作(C语言详解版)
我们学习了顺序表及初始化的过程,本节学习有关顺序表的一些基本操作,以及如何使用 C 语言实现它们。原创 2023-11-04 15:42:42 · 104 阅读 · 0 评论 -
顺序表与数组根本不是一码事!
很多人认为顺序表就是数组,或者数组就是顺序表等等,这些理解都是错误的、片面的。原创 2023-12-26 19:28:08 · 1090 阅读 · 0 评论 -
链表(链式存储结构)是什么
链表又称单链表、链式存储结构,用于存储逻辑关系为“一对一”的数据。和顺序表不同,使用链表存储数据,不强制要求数据在内存中集中存储,各个元素可以分散存储在内存中。例如,使用链表存储 {1,2,3},各个元素在内存中的存储状态可能是:图 1 数据分散存储在内存中可以看到,数据不仅没有集中存放,在内存中的存储次序也是混乱的。那么,链表是如何存储数据间逻辑关系的呢?原创 2023-11-04 15:48:03 · 88 阅读 · 0 评论 -
单链表的基本操作(C语言实现)
/链表中节点的结构int elem;}Link;int i;//1、创建头指针//2、创建头结点//头指针指向头结点p = temp;//3、每创建一个结点,都令其直接前驱结点的指针指向它for (i = 1;i < 5;i++) {//创建一个结点//每次 temp 指向的结点就是 a 的直接前驱结点//temp指向下一个结点(也就是a),为下次添加结点做准备return p;//p为链表,elem为目标元素,add为要插入的位置int i;原创 2023-11-04 15:53:41 · 108 阅读 · 0 评论 -
顺序表和链表的区别(优缺点)详解
顺序表和链表的区别在于它们的存储结构不同。顺序表将所有数据集中存放在内存中,擅长访问、遍历数据,在数据量提前预知的情况下,空间利用率更高。链表将数据分散存放在内存中,擅长插入、删除数据,在数据量无法预知的情况下,空间利用率更高。原创 2023-11-04 16:01:15 · 413 阅读 · 0 评论 -
反转单链表的4种方法(C语言实现)
本节讲解了实现链表反转的 4 种方法。原创 2023-12-26 19:55:45 · 1152 阅读 · 0 评论 -
判断两个单链表相交的3种方法(C语言实现)
这篇文章讲解了 3 种“判断 2 个链表是否相交”的方法,并赋予了 C 语言实现代码。原创 2023-12-26 20:03:52 · 926 阅读 · 0 评论 -
存储结构和存取结构不是一码事!
所谓存储结构,指的是数据在内存中真实的存储状态,具体可分为 2 类,即顺序存储结构和链式存储结构。而存取结构,指的是存取数据的方式,具体也可以分为 2 类,分别为顺序存取结构和随机存取结构。原创 2023-12-26 20:16:09 · 419 阅读 · 0 评论 -
静态链表是什么
一节,我们了解了两种存储结构各自的特点,那么,是否存在一种存储结构,可以融合顺序表和链表各自的优点,从而既能快速访问元素,又能快速增加或删除数据元素。静态链表,也是线性存储结构的一种,它兼顾了顺序表和链表的优点于一身,可以看做是顺序表和链表的升级版。使用静态链表存储数据,数据全部存储在数组中(和顺序表一样),但存储位置是随机的,数据之间"一对一"的逻辑关系通过一个整形变量(称为"游标",和指针功能类似)维持(和链表类似)。原创 2023-11-04 16:04:59 · 57 阅读 · 0 评论 -
静态链表基本操作(C语言实现)
int data;int cur;}component;//将结构体数组中所有分量链接到备用链表中//初始化静态链表//向链表中插入数据,body表示链表的头结点在数组中的位置,add表示插入元素的位置,num表示要插入的数据//删除链表中存有num的结点,返回新数据链表中第一个节点所在的位置//查找存储有num的结点在数组的位置//将链表中的字符oldElem改为newElem//输出函数//从备用链表中摘除空闲节点的实现函数//将摘除下来的节点链接到备用链表上。原创 2023-11-04 16:09:14 · 61 阅读 · 0 评论 -
静态链表和动态链表的区别
静态链表和动态链表的共同点是,数据之间"一对一"的逻辑关系都是依靠指针(静态链表中称"游标")来维系,仅此而已。如果选择使用静态链表存储数据,你需要通过操控两条链表,一条是存储数据,另一条是记录空闲空间的位置。而使用动态链表的整个过程,你只需要操控一条存储数据的链表。原创 2023-12-26 20:29:16 · 441 阅读 · 0 评论 -
双向链表是什么
目前我们所学到的链表,无论是动态链表还是静态链表,表中各个节点都只包含一个指针(游标),且都统一指向直接后继节点,这类链表又统称为单向链表或单链表。虽然单链表能 100% 存储逻辑关系为 "一对一" 的数据,但在解决某些实际问题时,单链表的执行效率并不高。例如,若实际问题中需要频繁地查找某个结点的前驱结点,使用单链表存储数据显然没有优势,因为单链表的强项是从前往后查找目标元素,不擅长从后往前查找元素。解决此类问题,可以建立双向链表(简称双链表)。原创 2023-11-04 16:12:23 · 61 阅读 · 0 评论 -
双向链表的基本操作(C语言实现)
/指向直接前趋int data;//指向直接后继}Line;int i;//创建链表第一个结点(首元结点)for (i = 2;i <= 5;i++) {//创建并初始化一个新结点//直接前趋结点的next指针指向新结点//新结点指向直接前趋结点//如果该节点无后继节点,说明此节点是链表的最后一个节点else {//删除结点的函数,data为要删除结点的数据域的值//删除表头结点free(temp);//删除表中结点。原创 2023-11-04 16:17:11 · 50 阅读 · 0 评论 -
双向链表实现贪吃蛇游戏(C语言版)
要知道,贪吃蛇是时刻移动的,而在上面的 move() 函数中,会时刻修正贪吃蛇每个节点的位置,因此当为双向链表添加新节点后,只要贪吃蛇移动一步,新节点的位置就会自行更正。换句话说,除非贪吃蛇吃到食物,否则无论怎样移动,都不会对双向链表的整个结构(节点数)产生影响,唯一受影响的就只是各个节点中 (x,y) 这对定位数据。1) 我们知道,双向链表中各个节点的标准构成是一个数据域和 2 个指针域,但对于实现贪吃蛇游戏来说,由于各个节点的位置是随贪吃蛇的移动而变化的,因此链表中的各节点还需要随时进行定位。原创 2023-12-26 20:43:46 · 906 阅读 · 0 评论 -
循环链表(C语言实现)
循环链表和动态链表唯一不同在于它的首尾连接,这也注定了在使用循环链表时,附带最多的操作就是遍历链表。在遍历的过程中,尤其要注意循环链表虽然首尾相连,但并不表示该链表没有第一个节点和最后一个结点。所以,不要随意改变头指针的指向。哪里不懂问哪里,助力初学者和计算机考研党快速入门数据结构,需要一对一答疑服务的(答疑范围主要是我写的数据结构教程),加 q(834937624)或者 V(x15297649174)联系我。原创 2023-12-27 20:28:37 · 835 阅读 · 0 评论 -
2种方法判断链表中有环
该算法的实现思想需要借助一个论点,即在一个链表中,如果 2 个指针(假设为 H1 和 H2)都从表头开始遍历链表,其中 H1 每次移动 2 个节点的长度(H1 = H1->next->next),而 H2 每次移动 1 个节点的长度(H2 = H2->next),如果该链表为有环链表,则 H1、H2 最终必定会相等;1) 最直接的实现思想就是:从给定链表的第一个节点开始遍历,每遍历至一个节点,都将其和所有的前驱节点进行比对,如果为同一个节点,则表明当前链表中有环;注意,有环链表并不一定就是循环链表。原创 2023-12-27 20:34:23 · 739 阅读 · 0 评论 -
双向循环链表(C语言实现)
我们知道,单链表通过首尾连接可以构成单向循环链表,如图 1 所示:图 1 单向循环链表示意图同样,双向链表也可以进行首尾连接,构成双向循环链表。如图 2 所示:图 2 双向循环链表示意图解决某些问题,可能既需要正向遍历数据,又需要逆向遍历数据,这时就可以考虑使用双向循环链表。原创 2023-12-27 20:46:50 · 383 阅读 · 0 评论 -
线性表实战:俄罗斯轮盘赌游戏
本节借轮盘赌小游戏,带领大家重新熟悉了线性表的顺序存储结构和链式存储结构,如果你能够根据项目要求自行完成两种结构代码实现的编写工作,恭喜你可以顺利进入下面章节的学习。哪里不懂问哪里,助力初学者和计算机考研党快速入门数据结构,需要一对一答疑服务的(答疑范围主要是我写的数据结构教程),加 q(834937624)或者 V(x15297649174)联系我。原创 2023-12-27 20:50:05 · 983 阅读 · 0 评论 -
栈是什么,数据结构中的栈
对于逻辑关系为“一对一”的数据,除了用顺序表和链表存储外,还可以用栈结构存储。栈是一种“特殊”的线性存储结构,它的特殊之处体现在以下两个地方:1、元素进栈和出栈的操作只能从一端完成,另一端是封闭的,如下图所示:图 1 栈存储结构示意图通常,我们将元素进栈的过程简称为“入栈”、“进栈”或者“压栈”;将元素出栈的过程简称为“出栈”或者“弹栈”。2、栈中无论存数据还是取数据,都必须遵循“先进后出”的原则,即最先入栈的元素最先出栈。原创 2023-11-05 17:24:07 · 56 阅读 · 0 评论 -
顺序栈的基本操作(入栈和出栈)
/元素elem进栈return top;//数据元素出栈printf("空栈");return -1;printf("弹栈元素:%d\n", a[top]);top--;return top;int a[100];return 0;程序输出结果为:弹栈元素:4弹栈元素:3弹栈元素:2弹栈元素:1空栈当前阅读的是整套数据结构和算法教程中的一节内容,想系统学习数据结构和算法的读者,可以前往教程目录页面系统的学习,也可以猛击这里。原创 2023-11-05 17:27:22 · 173 阅读 · 0 评论 -
链栈的基本操作(入栈和出栈)
/链表中的节点结构int data;}LineStack;//stack为当前的链栈,a表示入栈元素//创建存储新元素的节点//新节点与头节点建立逻辑关系//更新头指针的指向//栈顶元素出链栈的实现函数//声明一个新指针指向栈顶节点//更新头指针printf("出栈元素:%d ", p->data);printf("新栈顶元素:%d\n", stack->data);else {printf("栈已空\n");free(p);else {原创 2023-11-05 17:30:36 · 576 阅读 · 0 评论 -
栈实现进制转换器(C语言实现)
进制转换器项目要求:用户提供需要转换的数据和该数据的进制,以及要转换的进制,进制转换器提供给用户最终的正确转换的结果。原创 2023-11-05 17:21:03 · 115 阅读 · 0 评论 -
栈解决括号匹配问题(C语言版)
在编写代码的时候,经常会用到两种括号:圆括号 “()” 和大括号 “{}”。不管使用哪种括号,程序编译没有问题的其中一个重要因素就是所使用的括号是否能够匹配上.在编写程序时,括号可以嵌套,即: “({()})” 这种形式,但 “({)” 或者 “({}” 都不符合要求。括号匹配项目要求:给出任意搭配的括号,判断是否匹配。原创 2023-12-28 17:00:56 · 342 阅读 · 0 评论 -
栈求表达式的值(C语言版)
通过前面章节的学习,读者已经了解了什么是栈以及栈存储结构的 2 种实现方式(顺序栈和链栈)。在此基础上,本节教读者用栈解决一个实际问题:如何用栈结构求一个表达式的值?所谓表达式,就是由变量、常量以及运算符组合而成的式子。其中,常用的运算符无非!(阶乘运算符)、^(指数运算符)、+、-、*、/ 、( ) 这几种,比如就是一个表达式。那么,如何用栈结构求一个表达式的值呢?实际上,已经有前辈设计好了一种完美的解决方案。原创 2023-12-28 17:11:10 · 947 阅读 · 0 评论 -
顺序队列的基本操作(入队和出队)
顺序队列指的是用顺序表模拟实现的队列存储结构。在顺序表的基础上,只要元素进出的过程遵循以上两个规则,就能实现队列结构。原创 2023-11-05 17:36:35 · 714 阅读 · 0 评论 -
链式队列基本操作(入队和出队)
通过学习链式队列最基本的数据入队和出队操作,我们可以就实际问题,对以上代码做适当的修改。前面在学习顺序队列时,由于顺序表的局限性,我们在顺序队列中实现数据入队和出队的基础上,又对实现代码做了改进,令其能够充分利用数组中的空间。链式队列就不需要考虑空间利用的问题,因为链式队列本身就是实时申请空间。因此,这可以算作是链式队列相比顺序队列的一个优势。//链表中的节点结构int data;}QNode;//创建链式队列的函数//创建一个头节点//对头节点进行初始化。原创 2023-11-05 17:39:45 · 481 阅读 · 0 评论 -
循环队列(C语言详解)
所谓循环队列,本质仍是用顺序表模拟实现队列,只不过在具体实现的过程中,会将顺序表想象成首尾相连的环状表来用。例如,图 1 左侧就是一个空的 "环状" 顺序表,用它模拟实现队列,队头(top)和队尾(rear)都位于 a[0] 处。图 1 右侧是一个存有 {1,2,3,4} 的循环队列,它的队头位于 a[2] 处,队尾位于 a[6] 处。图 1 循环队列再次强调,我们只是将顺序表想象成环状表来用,实际用 C 语言程序实现循环队列时,建立的仍是普通的顺序表,后续会讲解将顺序表当做环状表使用的实现方法。原创 2023-12-28 17:15:34 · 903 阅读 · 0 评论 -
队列实现停车场管理系统(含C语言源码)
设停车场是一个可以停放 n 辆汽车的南北方向的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端)。若车场内已停满 n 辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。原创 2024-01-01 17:00:55 · 957 阅读 · 0 评论 -
队列实现“推小车”扑克牌游戏(含C语言源码)
小时候在刚开始接触扑克牌的时候,最初学会的扑克游戏就是类似于“推小车”这样的无脑游戏,本节带领大家使用学过的知识编写推小车卡牌游戏。“推小车”扑克牌游戏适合 2-3 个人玩,游戏规则也超级简单:将一副扑克牌平均分成两份,每人拿一份,每个人手中的扑克牌全部反面朝上,叠成一摞。游戏进行时,每个人轮流拿出第一张扑克牌放到桌上,将其排成一竖行。原创 2024-01-01 17:02:08 · 541 阅读 · 0 评论