![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 85
数据结构和算法教程(C语言版)
将近8年的C语言和数据结构辅导经验,一对一辅导 C 语言,一对一辅导数据结构,需要的私我。
展开
-
data.biancheng.net数据结构网站
网站上有一整套的数据结构和算法教程,是 C 语言版本的,整套教程通俗易懂,不学院派,内容全面详尽,提供了完整、可运行的 C 语言程序,非常适合有 C 语言基础、对数据结构感兴趣的读者。感兴趣的小伙伴可以访问。原创 2024-01-17 17:35:14 · 423 阅读 · 0 评论 -
稳定排序算法有哪些?
相信您已经掌握了很多种排序算法,比如冒泡排序、插入排序、希尔排序、选择排序等。这些排序算法中,有些是 "稳定" 的,有些是 "不稳定" 的。给定的待排序序列中,经常会包含相同的元素,例如:3 142此序列中包含两个元素 2,为了区分它们,我们分别称它们为 "红 2" 和 "绿 2"。评价一个排序算法是否稳定,是指该算法完成排序的同时,是否会改变序列中相同元素的相对位置。例如,上面序列中红 2 和绿 2 的相对位置是:红 2 位于绿 2 的左侧,或者说绿 2 位于红 2 的右侧。原创 2024-01-10 10:11:50 · 460 阅读 · 0 评论 -
数据结构之线性表(长篇神文,小白必看)
/链表中节点的结构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-11 21:12:58 · 137 阅读 · 0 评论 -
回答数据结构相关的若干个问题(小白必看)
数据结构是什么,在我看来,它是一门学科,教你如何存储那些具有复杂关系的数据。数据结构存储数据的思路(思维、思想),可以用任意一种编程语言实现。换句话说,无论你掌握哪种编程语言,也无论你从事什么开发工作,只要你和数据打交道,就一定会用到数据结构。数据结构和算法是两个独立的学科,数据结构研究的是数据的存储问题,而算法研究是的解决问题的方法(思路)。解决实际问题,既需要用到数据结构的知识,也需要用到算法知识,数据结构和算法经常放在一起讲解。原创 2023-11-11 20:21:17 · 235 阅读 · 0 评论 -
什么是数据结构
当你决定看这篇文章,就意味着系统学习数据结构的开始。本节,我们先来讲什么是数据结构。数据结构,直白地理解,就是研究数据的存储方式。我们知道,数据存储只有一个目的,即为了方便后期对数据的再利用,就如同我们使用数组存储{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 评论 -
什么是线性表(超详细)
通过前面的学习我们知道,具有“一对一”逻辑关系的数据,最佳的存储方式是使用线性表。那么,什么是线性表呢?线性表,全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即“把所有数据用一根线儿串起来,再存储到物理空间中”。 图1 "一对一"...原创 2020-03-18 17:47:43 · 2586 阅读 · 2 评论 -
顺序表(顺序存储结构)及初始化过程详解
顺序表,全名顺序存储结构,是线性表的一种。通过《线性表》一节的学习我们知道,线性表用于存储逻辑关系为“一对一”的数据,顺序表自然也不例外。不仅如此,顺序表对数据的物理存储结构也有要求。顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。例如,使用顺序表存储集合{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:23:13 · 340 阅读 · 0 评论 -
双向链表及其创建(C语言)详解
目前我们所学到的链表,无论是动态链表还是静态链表,表中各节点中都只包含一个指针(游标),且都统一指向直接后继节点,通常称这类链表为单向链表(或单链表)。虽然使用单链表能 100% 解决逻辑关系为 "一对一" 数据的存储问题,但在解决某些特殊问题时,单链表并不是效率最优的存储结构。比如说,如果算法中需要大量地找某指定结点的前趋结点,使用单链表无疑是灾难性的,因为单链表更适合 "从前往后" 找,而 ...原创 2019-03-14 13:23:00 · 2899 阅读 · 0 评论 -
双向链表基本操作(C语言实现)详解
前面学习了如何创建一个双向链表,本节学习有关双向链表的一些基本操作,即如何在双向链表中添加、删除、查找或更改数据元素。本节知识基于已熟练掌握双向链表创建过程的基础上,我们继续上节所创建的双向链表来学习本节内容,创建好的双向链表如图1 所示: 图 1 双向链表示意图双向链表添...原创 2019-03-14 13:22:40 · 3141 阅读 · 3 评论 -
树的孩子兄弟表示法详解
前面讲解了存储普通树的双亲表示法和孩子表示法,本节来讲解最后一种常用方法——孩子兄弟表示法。 图1 普通树示意图树结构中,位于同一层的节点之间互为兄弟节点。例如,图 1 的普通树中,节点 A、B 和 C 互为兄弟节点,而节点 D、...原创 2020-04-15 12:39:13 · 19432 阅读 · 1 评论 -
什么是栈,栈及其特点和应用详解
同顺序表和链表一样,栈也是用来存储逻辑关系为 "一对一" 数据的线性存储结构,如图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 评论 -
数据结构中的树存储结构
之前介绍的所有的数据结构都是线性存储结构。本章所介绍的树结构是一种非线性存储结构,存储的是具有“一对多”关系的数据元素的集合。 (A) ...原创 2019-03-18 18:44:10 · 567 阅读 · 0 评论 -
二叉树的顺序存储结构(无师自通)
二叉树的存储结构有两种,分别为顺序存储和链式存储。本节先介绍二叉树的顺序存储结构。二叉树的顺序存储,指的是使用顺序表(数组)存储二叉树。需要注意的是,顺序存储只适用于完全二叉树。换句话说,只有完全二叉树才可以使用顺序表存储。因此,如果我们想顺序存储普通二叉树,需要提前将普通二叉树转化为完全二叉树。有读者会说,满二叉树也可以使用顺序存储。要知道,满二叉树也是完全二叉树,因为它满足完全二叉树的...原创 2019-03-18 18:56:56 · 1290 阅读 · 0 评论 -
二叉排序树(二叉查找树)及C语言实现
前几节介绍的都是有关静态查找表的相关知识,从本节开始介绍另外一种查找表——动态查找表。动态查找表中做查找操作时,若查找成功可以对其进行删除;如果查找失败,即表中无该关键字,可以将该关键字插入到表中。动态查找表的表示方式有多种,本节介绍一种使用树结构表示动态查找表的实现方法——二叉排序树(又称为“二叉查找树”)。什么是二叉排序树?二叉排序树要么是空二叉树,要么具有如下特点:二叉排序树...原创 2020-03-19 08:55:23 · 3886 阅读 · 0 评论 -
二叉树的链式存储结构及(C语言)实现
上一节讲了二叉树的顺序存储,通过学习你会发现,其实二叉树并不适合用数组存储,因为并不是每个二叉树都是完全二叉树,普通二叉树使用顺序表存储或多或多会存在空间浪费的现象。本节我们学习二叉树的链式存储结构。 图1 普通二叉树示意图如图 1...原创 2019-03-18 18:59:35 · 5424 阅读 · 1 评论 -
二叉树先序遍历(递归与非递归)及C语言实现
二叉树先序遍历的实现思想是:访问根节点; 访问当前节点的左子树; 若当前节点无左子树,则访问当前节点的右子树; 图1 二叉树以图 1 为例,采用先序遍历的思想遍历该二叉树的过程为:访问该二叉树的根节点,找到 1; 访...原创 2019-03-18 19:02:06 · 6330 阅读 · 2 评论 -
树的双亲表示法(C语言实现详解版)
前面讲了二叉树的顺序存储和链式存储,本节来学习如何存储具有普通树结构的数据。 图1 普通树存储结构如图 1 所示,这是一棵普通的树,该如何存储呢?通常,存储具有普通树结构数据的方法有 3 种:双亲表示法; 孩子表示法; 孩子兄弟表示法...原创 2020-04-15 12:38:13 · 3283 阅读 · 1 评论 -
什么是二叉树,二叉树及其性质详解
通过《树的存储结构》一节的学习,我们了解了一些树存储结构的基本知识。本节将给大家介绍一类具体的树结构——二叉树。简单地理解,满足以下两个条件的树就是二叉树:本身是有序树; 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2;例如,图1a) 就是一棵二叉树,而图 1b) 则不是。 ...原创 2019-03-18 18:54:46 · 1040 阅读 · 0 评论 -
树的孩子表示法(C语言)详解
前面学习了如何用双亲表示法存储普通树,本节再学习一种存储普通树的方法——孩子表示法。孩子表示法存储普通树采用的是 "顺序表+链表" 的组合结构,其存储过程是:从树的根节点开始,使用顺序表依次存储树中各个节点,需要注意的是,与双亲表示法不同,孩子表示法会给各个节点配备一个链表,用于存储各节点的孩子节点位于顺序表中的位置。如果节点没有孩子节点(叶子节点),则该节点的链表为空链表。例如,使...原创 2020-04-15 12:37:27 · 2302 阅读 · 0 评论 -
哈希表(散列表)及哈希表处理冲突的方法
前面介绍了静态查找表以及动态查找表中的一些查找方法,其查找的过程都无法避免同查找表中的数据进行比较,查找算法的效率很大程度取决于同表中数据的查找次数。而本节所介绍的哈希表可以通过关键字直接找到数据的存储位置,不需要进行任何的比较,其查找的效率相较于前面所介绍的查找算法是更高的。哈希表的构建在初中的数学课本中学习过函数的相关知识,给定一个 x,通过一个数学公式,只需要将 x 的值带入公式就...原创 2020-03-19 08:55:15 · 665 阅读 · 0 评论 -
二分查找法(折半查找法)及C语言实现
折半查找,也称二分查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高。但是该算法的使用的前提是静态查找表中的数据必须是有序的。例如,在{5,21,13,19,37,75,56,64,88 ,80,92}这个查找表使用折半查找算法查找数据之前,需要首先对该表中的数据按照所查的关键字进行排序:{5,13,19,21,37,56,64,75,80,88,92}。在折半查找之前对查找表按...原创 2020-07-16 08:54:01 · 2976 阅读 · 0 评论 -
置换选择排序算法详解(C语言实现)
上一节介绍了增加 k-路归并排序中的 k 值来提高外部排序效率的方法,而除此之外,还有另外一条路可走,即减少初始归并段的个数,也就是本章第一节中提到的减小 m 的值。m 的求值方法为:m=⌈n/l⌉(n 表示为外部文件中的记录数,l 表示初始归并段中包含的记录数)如果要想减小 m 的值,在外部文件总的记录数 n 值一定的情况下,只能增加每个归并段中所包含的记录数 l。而对于初始归并段的...原创 2020-03-18 17:48:24 · 6447 阅读 · 8 评论 -
数据结构之查找算法
在日常生活中,几乎每天都要进行一些查找的工作,在电话簿中查阅某个人的电话号码;在电脑的文件夹中查找某个具体的文件等等。本节主要介绍用于查找操作的数据结构——查找表。查找表是由同一类型的数据元素构成的集合。例如电话号码簿和字典都可以看作是一张查找表。一般对于查找表有以下几种操作:在查找表中查找某个具体的数据元素; 在查找表中插入数据元素; 从查找表中删除数据元素;静态查找表和动态查找表...原创 2020-07-16 08:53:13 · 490 阅读 · 0 评论 -
简单选择排序、树形选择排序和堆排序算法及其C语言实现
本节介绍三种选择排序算法,分别为:简单选择排序、树形选择排序和堆排序。简单选择排序该算法的实现思想为:对于具有 n 个记录的无序表遍历 n-1 次,第 i 次从无序表中第 i 个记录开始,找出后序关键字中最小的记录,然后放置在第 i 的位置上。例如对无序表{56,12,80,91,20}采用简单选择排序算法进行排序,具体过程为:第一次遍历时,从下标为 1 的位置即 56 开始,找出关...原创 2020-03-18 17:48:30 · 2508 阅读 · 1 评论 -
冒泡排序算法(起泡排序)及其C语言实现
起泡排序,别名“冒泡排序”,该算法的核心思想是将无序表中的所有记录,通过两两比较关键字,得出升序序列或者降序序列。例如,对无序表{49,38,65,97,76,13,27,49}进行升序排序的具体实现过程如图1 所示: 图 1 第一次起泡如...原创 2020-03-18 17:48:37 · 9668 阅读 · 0 评论 -
表插入排序算法及C语言实现(看了无师自通)
前面章节中所介绍到的三种插入排序算法,其基本结构都采用数组的形式进行存储,因而无法避免排序过程中产生的数据移动的问题。如果想要从根本上解决只能改变数据的存储结构,改用链表存储。表插入排序,即使用链表的存储结构对数据进行插入排序。在对记录按照其关键字进行排序的过程中,不需要移动记录的存储位置,只需要更改结点间指针的指向。链表的存储结构用代码表示为:#define SIZE 100type...原创 2020-03-18 17:48:43 · 2318 阅读 · 0 评论 -
2-路插入排序算法详解(C语言实现)
2-路插入排序算法是在折半插入排序的基础上对其进行改进,减少其在排序过程中移动记录的次数从而提高效率。具体实现思路为:另外设置一个同存储记录的数组大小相同的数组 d,将无序表中第一个记录添加进 d[0] 的位置上,然后从无序表中第二个记录开始,同 d[0] 作比较:如果该值比 d[0] 大,则添加到其右侧;反之添加到其左侧。在这里的数组 d 可以理解成一个环状数组。使用 2-路插入排序算...原创 2020-03-18 17:48:50 · 3499 阅读 · 1 评论