![](https://img-blog.csdnimg.cn/20190918140037908.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构c/c++描述
文章平均质量分 59
c/c++描述数据结构,因为课本用的是c语言描述
zhangzhangkeji
这个作者很懒,什么都没留下…
展开
-
红黑树的添加和删除逻辑,简易图解版
那如果我都是红的,我还欠高,那我为什么不自己调成黑的呢?就你这个红黑树他是病态的畸形的,但是呢,要不是拿那种很很专门攻击你的数据,去对你的数进行访问,你也不至于进行到哪去,就是带着病运行。工作环境中生产环境中,我我发现也有带病运行的,但,他没问题。那么既然我是黑的我就欠高,说明我这边的高至少是2,那哥哥这边至少是2。哎所以说,咱咱网上有些东西啊他那有缺陷或,者是写错了呢,你还一时半会还找不到,还看不出来,表现不出来。(1)教学来源,抛开具体的代码,讲清楚原理,这位b站老师,讲的非常好。原创 2023-08-30 17:17:28 · 71 阅读 · 0 评论 -
红黑树的调整图解
上面的视频讲解的红黑树很好。尤其是关于红黑树的调整。原创 2023-08-23 19:11:28 · 68 阅读 · 0 评论 -
串的模式匹配,c/c++描述
很好的视频链接懒猫老师-数据结构-(15)KMP算法2-next数组(模式匹配,字符串匹配)_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1U7411f7CB/?spm_id_from=autoNext以下是完整代码,见名知意的程序易于阅读和理解。#include<iostream>using namespace std;#define MAXSIZE 100#include<iomanip>struct Sequenc原创 2021-09-15 19:24:04 · 163 阅读 · 0 评论 -
归并排序,递归与非递归,c/c++描述
归并排序,又是一种新的排序。其时间复杂度 < O(n ^ 2)。 以前在链表里,我们已经学过,如何把两个有序表合并成一个总的有序表。 在归并排序里,要给一个大表排序,我们就采用了这样的思路:先把表分成两部分分别排好序,再把这两个有序的子表合并在一块。当然这个定义是递归的。当表里只有一个元素时,才不必进行拆分。 归并排序,也可以不用递归的方法。我们直接把表划分成一堆只有一个元素的子表,再对子表进行两两合并,使所有子表都含有两个元素,再对子表进行两两合并,使子表具有4个元素,依次类推,直到原创 2021-08-30 20:00:10 · 194 阅读 · 0 评论 -
插入排序,希尔排序,冒泡排序,快速排序,选择排序,堆排序,c/c++描述
这些排序方法非常精妙,但各有不同,这里给出代码汇总,至于分析过程,见前几篇文章,和网上资料的优秀讲解。同时也是再写一遍代码,加深印象。代码死记硬背不必要,关键在于理解原理。先是main函数所在源文件代码:#include<iostream>using namespace std;extern void swap(int & i,int & j);extern void dispaly(int array[],int length);extern void di原创 2021-08-29 20:29:16 · 122 阅读 · 0 评论 -
堆排序,c/c++描述
关于堆排序,B站这位博士生讲解的很好。跟他学会的https://www.bilibili.com/video/BV1Eb41147dK 堆排序是选择排序的改进。把数组里数据元素排列成堆树的形式。大顶堆的节点值大于等于其左右子节点的元素值。小顶堆的元素值小于等于其左右子节点的元素值,分别可以排列出数组的升序和降序形式。每次选择堆的根节点,进入已排序数组。再对堆里剩下的元素重新排序,再取新的根节点进入已排序数组。直至堆树为空。 完全二叉树很接近满二叉树,其按从上到下,从左到右的顺序逐个加入元素。由于原创 2021-08-29 12:42:10 · 87 阅读 · 0 评论 -
快速排序,c/c++描述
在插入排序的基础上形成了分组插入排序,即希尔排序。在交换排序,即冒泡排序的基础上,形成了快速排序。冒泡排序,是相邻的元素进行比较和交换,所以交换次数会很多。而快速排序,加大了元素比较和交换的距离,故减少了交换次数。快速排序,是以数组某元素为轴,排序后,把数组分为两部分。大于轴元素的排在其后面,小于等于轴元素的排在其前面。递归进行。直到待排序的子数组长度为1。该算法是递归的。一般以数组首元素为轴。 改进的快速排序: (1)修正轴元素的值,其值确保为关键字中大小居中的值,避免为最大关键字值或最小关键原创 2021-08-28 17:40:51 · 68 阅读 · 0 评论 -
希尔排序 c/c++描述
希尔插入排序,是对直接插入排序的改进。当数组很大,或者顺序很乱时候,由于比较和移动元素的次数太多,直接插入排序的效率会下降。对之的改进就是,分组排序,即希尔排序。 希尔排序,是把数组分组,每个子数组跨度很大,其中元素位置分散,总元素数较少。先对子数组排序,由于数目少,所以效率高,实现分组有序。当不再分组时,由于整体基本有序,元素移动次数少,直接插入排序,仍然有高的效率。 这些链接讲解的都很好。【数据结构与算法】高级排序(希尔排序、归并排序、快速排序)完整思路,并用代码封装排序函数_零一的博客-原创 2021-08-27 19:07:49 · 73 阅读 · 0 评论 -
折半插入排序,c/c++描述
折半插入排序和直接插入排序是一样的。都是把未定位的元素插入到已排好序的数组里。不同的是对插入位置的查找方法不同。直接插入是比较关键字一次,插入一次。折半插入是折半二分比较得到最终插入位置后,集体移动数组元素,空出待插入位置,再插入新的元素。 还有一个难点就是折半查找后,对最终插入位置的下标的确定。需要仔细思考,对照,因为仅差一位。全部代码如下:#include<iostream>using namespace std;void binaryInsertSort(int arra原创 2021-08-27 14:07:59 · 234 阅读 · 0 评论 -
选择排序,c/c++描述
选择排序,是把未排序的所有元素里的最小值,放在未排序范围的最左边。直至未排序范围未空。至此实现数组的关键字的递增排列。#include<iostream>using namespace std;void swap(int & i , int & j) { int temp; temp = i; i = j; j = temp;}void selectSort(int a[],int length,int & compare,int &原创 2021-08-26 18:33:29 · 46 阅读 · 0 评论 -
冒泡排序的三种方法,c/c++描述
这个非常简单。就不多解释了。#include<iostream>using namespace std;void swap(int & i , int & j) { int temp; temp = i; i = j; j = temp;}void bubbleSortBasic(int a[], int length , int & compare , int & move) { compare = move = 0; for(i原创 2021-08-26 17:09:50 · 97 阅读 · 0 评论 -
散列表 Hash ,c/c++描述
散列 ,英文单词 hash ,意思是把关键字映射变换成杂乱无章的其它值。虽然是映射成了内存地址。但直观上 Hash 后,是把数据杂乱无章的柔和在了一块。所以散列表也叫 hash table。 顺序查找、二分查找和折半查找,都是把待查询的记录的关键字与存储中的记录的关键字进行比较,关键字相同的,即是要找的记录。所以查找时间取决于关键字比较的次数。然而,我们也可以换一种存储技术,即hash 存储,由关键字代入 hash 函数,直接得到其在存储中的存储地址,找到该记录。 用公式表示:存储位置 =原创 2021-08-26 00:33:23 · 148 阅读 · 0 评论 -
B+树的插入删除和 c/c++ 代码实践
B+树是从B树修改而来的。对 B 树的建立会了的话,对 B+ 树的操作就不会太难。 关于 B 树,可以参看之前写的文章: ...原创 2021-08-21 23:16:56 · 916 阅读 · 2 评论 -
对B树的插入删除理解和c/c++代码实践
B树没有那位猫老师的B树教学视频了,学起来好难啊。很多资料讲其原理,而不结合代码,不结合代码细节,终究是不到位的。课本里 i j k 太多,代码阅读不易于理解。搜罗各位前辈提供的资料,这里写下自己的总结。 B树,也叫多路平衡查找树, multi - search banlance tree . 所以翻译为B树,对应B - Tree。 (1) B 树, 是平衡树。 根二叉平衡树一样。平衡指的是,左边的关键字都小于右边的关键字。节点里元素的值,大于其左边指针指向的节点里元素的值,小于其右边指针原创 2021-08-19 23:34:23 · 247 阅读 · 0 评论 -
关于B树的思考:m阶B树的非根非叶节点为什么要至少为ceil(m/2)个孩子? c/c++描述
相信每一位格物致知认真细致的学生,都不会放过这个知识点的掌握。而不是去死记硬背。这也是我们未来学的更多,做的更好的保证。 给个链接,这篇文章分析的就很好:关于B树的思考:m阶B树的非根非叶节点为什么要至少为ceil(m/2)个孩子?_oxygen’s blog-CSDN博客https://blog.csdn.net/oxygen0106/article/details/40262829 接着写些我自己的理解。 采用B树,而不是二叉树,是为了建立大节点,让每个节点包含的数据更多,包含更多的原创 2021-08-16 20:02:30 · 949 阅读 · 0 评论 -
平衡二叉树AVL树的创建,平衡,和删除节点,c/c++描述
平衡二叉树的左右子树的高度差小于等于1。或者说其左子树的高度减去右子树的高度,差值的绝对值小于等于1。平衡二叉树,仍然属于排序二叉树。其中序排列里,节点的关键字仍然按递增有序排列。 为了纪念对平衡二叉树的研究做出贡献的前苏联科学家,取其姓氏里的字母,平衡二叉树,也叫做AVL树。 每往AVL树里插入一个节点,由函数insertBST完成插入。都要对树里节点进行校平。 校平由函数checkBalance 完成,计算树里每个节点的平衡因子。可由后序递归完成(按节点左右根的顺序,依次校平每个节点的平原创 2021-08-15 21:44:17 · 326 阅读 · 0 评论 -
二叉排序树的删除,完成bilibili懒猫老师作业,c/c++描述
此前已经写了一篇文章,介绍了二叉排序树的插入,建立,查找,和删除。地址如下:https://blog.csdn.net/zhangzhangkeji/article/details/119681803 但看过bilibili懒猫老师的视频后,才对书里的递归方法删除节点的程序有了理解。所以,本程序里重写了BST的删除算法。 BST(binary sort tree )的删除节点后,仍应该保持BST的排序性质不变,即左子节点的键值 < 根节点的键值 < 右子节点的键值。所以删除原创 2021-08-14 22:16:21 · 205 阅读 · 0 评论 -
二叉排序树BST的插入,查询和删除,c/c++描述
关于查找,对于表的线性存储,可以采用顺序查找,二分查找,插值查找,斐波那契查找和分块查找。为了同时提高表的查询和插入删除性能,可以采用链式存储,采用二叉树结构。 二叉排序树,binary sort tree 。 建立对应于表的二叉排序树,要求树里 : 左子节点的关键字 < 根节点的关键字 < 右子节点的关键字。这样,如果按树的中序输出,可以得到表里记录的关于关键字值的递增排列。所以二叉排序树实现了对表里记录的有序存储。 表用一位数组存储,关键字就是数组里元素的值,要求不原创 2021-08-14 11:23:08 · 817 阅读 · 0 评论 -
顺序查找,折半查找,插值查找,斐波那契查找和分块查找,c/c++描述
这里的查找,是指找到关键字等于给定值的记录在表里的位置,或者说关键字等于给定值的元素在数组里的下标,对于一维数组,关键字就是数组里元素的值。前提是数组里不能有重复的值。 顺序查找,是把表里记录挨个与给定值比较,直到找到关键字等于给定值的记录。或者整个表里没有符合给定值的记录。要求表是线性表,顺序存储,或者链式存储。 对于顺序存储的、关键字已经排序的表,可以采用折半查找。效率得以提高,但这样的表,不适于经常的插入删除表里记录。依据公式 : mid = (start + end) / 2 。star原创 2021-08-13 01:00:28 · 263 阅读 · 0 评论 -
折半查找的平均查找次数
折半查找,适合顺序表,关键字有序排列。可以用二叉判定树描述判定过程。下面给出公式推导过程:谢谢阅读。原创 2021-08-12 13:25:59 · 4093 阅读 · 0 评论 -
生成树,非最小生成树,通过DFS、BFS,c/c++描述
图的生成树,是图的连通子图,包含了图里所有顶点,但只含有顶点数减一条边。树里任何两个顶点都有通路。但树里没有环路。 生成树的过程和图的遍历过程类似,遍历时,图里每个顶点都会出现且仅出现一次。 因为表达树的途径,是表达出树里所有的边,边用边的两个顶点表示。生成树的过程,是要考虑如何输出所有的边的两个顶点。 在DFS和BFS的程序代码基础上,修改代码,表达出生成树的过程。言虽简单,但也很巧妙。我也是看了书中代码,才明白的。自己虽然写过DFS,BFS,但跟书中代码一样简洁的思路,想不到。当然,咱们原创 2021-08-11 20:45:05 · 861 阅读 · 0 评论 -
图的深度优先遍历,DFS,非递归,c/c++描述
图的深度优先遍历的课本定义是: 受bilibili懒猫老师的讲解启发,我更愿意把图的DFS遍历过程概括为:先遍历图的根节点,再遍历根节点的第一邻接子图,依次遍历完根节点的所有子图。图的根节点就是遍历图时指定的第一个顶点。这样更好记忆其精髓,要点。 递归DFS时调用系统栈。不采用递归的方法,也可以,就自己建立一个栈,存储图里顶点的下标,从栈里依次弹出顶点的顺序,就是DFS遍历图的顺序。 具体过程为,每弹出一个顶点,就修改其对应的visited[]数组的值。对图的遍历,无论DFS还是BFS,都原创 2021-08-11 14:29:39 · 566 阅读 · 0 评论 -
关键路径AOE,c/c++描述
有些工程可以用有向带权无环图来表示。图中顶点代表事件,有向边代表事件之间的先后关系,制约关系。边也叫做活动,边的权值对应活动的时长,或者叫做起点对应事件完成需要的时间。 这种图里是没有环的,因为不能有事件互为先后关系,这在现实中是不存在的。 图里源点是入度为0的点,代表最开始发生的事件,汇点是出度为0的点,是最后完成的事件,然后整个工程结束。我们讨论有代表性的单源点单汇点图。即整个工程以唯一一个事件为开始,以唯一一个事件为结束。 验证一个有向图里有没有环,可以对该图进行拓扑排序输出,若拓扑序原创 2021-08-10 22:06:41 · 337 阅读 · 0 评论 -
有向图的拓扑排序,c/c++描述
谢谢bilibili懒猫老师的讲解。她一讲我就能听懂。看别的纸质书实在看不懂。这过了《数据结构》这门课,没了这位老师的讲解,咋整? 有向图的拓扑排序,是这么个意思:对图的顶点进行排序,从左到右输出。对于图里任意一条边,边的起点都在终点的左面。对于排序中的任意两个顶点,这俩顶点要么没有边相连,要么左边的顶点一定是起点,右边的点是终点。带有这种要求的排序就叫拓扑排序。 拓扑排序要求有向图里没有环。例如不允许点ABC构成环,A——>B——>C——>A。这样的环,如果对其进行拓扑排序的原创 2021-08-09 20:03:19 · 684 阅读 · 0 评论 -
关于最小生成树,最短路径的一些比较和思考,引用代码为c/c++描述
本文生成最小生成树的代码,引用自Prim算法,图的最小生成树,c/c++描述https://blog.csdn.net/zhangzhangkeji/article/details/119280054 本文生成图里所有顶点间的最短路径的Floyd算法代码,引用自Floyd算法https://blog.csdn.net/zhangzhangkeji/article/details/119487730 得到的结果如图: ...原创 2021-08-09 13:23:53 · 136 阅读 · 0 评论 -
Floyd算法,图的最短路径,c/c++描述
求图中任意两顶点间的最短路径。可以参考这篇文章Floyd - Warshall(弗洛伊德算法)https://blog.csdn.net/yuewenyao/article/details/81021319 Dijkstra算法是求解单源点最短路径。依次把图中所有顶点作为源点,也可以得到图中任意两顶点间的最短路径。 Floyd算法的依据是这个公式dist[i][j] = min(dist[i][j] , dist[i][k] + dist[k][j])。 关于最短路径的几个关键知识点:原创 2021-08-07 19:16:09 · 434 阅读 · 2 评论 -
Dijkstra算法,图的最短路径,第三篇,c/c++描述,课本代码是正确的
求图里顶点的最短路径,Dijkstra算法是单源点路径。求的是源点到其他所有顶点的最短路径。昨天刚发了两篇文章,关于Dijkstra算法,但里面的函数Dijkstra2ShortestPath,时间复杂度是O(n^3),课本给的同样的函数,时间复杂度是O(n ^ 2),经过仔细思考。课本也是正确的。跟着bilibili懒猫老师,思路是理解了。但具体代码,这一个自己摸索,还是很曲折的。因为懒猫老师,在她视频里,给了一个调用的函数名,没有给出这个被调用的具体函数。离了懒猫老师,学起来真难。课本里的i j原创 2021-08-06 21:24:44 · 121 阅读 · 0 评论 -
Dijkstra算法改进,最短路径,c/c++描述
刚才又研究了bilibili懒猫老师的教学视频,对昨天的同样的Dijkstra算法进行改进。 昨天的文章里,我们用一个结构体变量,来存储两顶点间的最短路径的全部信息。struct ShortestPath { int pathLength ; int indexOfVertexInPath[MAXVERTEX]; int numVertex;}; 这里的路径是完整路径,包括了路径里的所有顶点下标。 因为起点到最短路径里每一个顶点的路径都是最短路径(这个结论是我自己总结的,根据例题原创 2021-08-06 15:01:03 · 214 阅读 · 0 评论 -
Dijkstra算法,最短路径,c/c++描述
求图里两顶点间的最短路径,对于不带权图,就是两顶点间的包含最少边数的路径;对于带权图,就是路径中边的权值和最小的那条路径。 关于最短路径,在老鼠走迷宫里,我们遇到过,用队列记录走过的路径,依据广度优先的原则,第一个到达终点的路径就是最短路径。 对于图里两顶点间的路径,我们也可以先求出图里连接这俩顶点的所有路径,并找出来权值最小的那一条。 Dijstra算法课本定义是:把图里顶点分成包括起点在内的已求出最短路径的点,和未求出最短路径的顶点,依托这两个点集,按最短路径权值增加的顺序求出所有最短路原创 2021-08-05 22:35:52 · 845 阅读 · 8 评论 -
Kruskal算法,最小生成树,c/c++描述
感谢bilibili懒猫老师和小甲鱼老师的讲解。 图的最小生成树,是图的最小连通子图。前面我们讲了Prim算法,其依据的核心定理是:把图里顶点分成两个集合,连接这两个集合的边中,权值最小的边一定在最小生成树MST里,minimalspanning tree。 还有另外一个Kruskal算法,纪念伟大的Kruskal工程师。其核心思路是:首先把图里所有路径按权值由小到大排序,从小到大依次选取合适的边加入MST,直到MST里边数比顶点数小1.所谓合适,指待加入树的边,不能使树里出现环。或者说待加入原创 2021-08-02 20:37:58 · 198 阅读 · 0 评论 -
并查集,c/c++描述,完整代码
并查集,是描述了这样一类问题:我们经常需要合并两个集合,或者经常查询某个元素属于哪个集合。频繁进行合并与查询操作,所以叫做并查集。 问题如下:已知b与d、e与g、a与c、h与i、a与b、e与f、b与c,各自都是亲戚关系。请问:c与d、g与j、h与i是亲戚关系么? 课本里介绍了并查集,和几个关键函数,但没有给出完整例题与完整代码。参考请教网上资料后,这里也给出了自己的代码,并没有用到递归。但分析思路是一样的。 几个关键点的处理如下: 如何存储数据:所有人的数据组成一维数组。数组里每一个人的原创 2021-08-01 19:05:50 · 141 阅读 · 0 评论 -
Prim算法,图的最小生成树,c/c++描述
图的生成树是图的最小连通子图,包含了图里所有顶点,但仅含有比顶点数小1 的边数。边数再小将不连通,边数再多一条,则顶点间将有多条路径。生成树里的边的权值之和最小的树叫做最小生成树。最小生成树有着实际应用与意义。比如权值对应路程,则对应路程最短,施工造价最小。 如何找到一个最小生成树呢? 至此,为了纪念这位伟大的科学家,Prim,我们将他提出的查找最小生成树的算法叫做prim算法,也叫普里姆算法。 该算法依据的核心定理是:将图里顶点分成两个集合,则连接这两个顶点集合的边中,边的权值最小的边,一原创 2021-07-31 19:36:17 · 392 阅读 · 0 评论 -
BFS,,广度优先查找图里的最长路径,c/c++描述
查找图里从某一顶点出发的最长路径,显然,用队列记录从队列头部顶点出发的所有路径,到达队列尾部最后一个顶点的路径就是最长的路径。当然可能有长度相等的多个最长路径。那样会使问题复杂化。这里以找到一条路径即可。 函数BFSLongestPath:根据图里指定的路径起始顶点,查找出其能到达的最长路径。 main函数所在源文件代码:#include<iostream>#include<stdio.h>using namespace std;#define MAXVERTEX原创 2021-07-31 12:12:07 · 1060 阅读 · 0 评论 -
广度优先,查找图中顶点间的路径,c/c++描述
图的广度优先遍历BFS其实还是队列的应用。同迷宫问题里所有路径,用队列解决的思路是一样的。在图里查找两顶点间的路径,也同样要求路径是简单路径,路径中不可出现重复顶点。队列里第一个出现的到达终点的路径就是最短路径。 在数据结构里,把前几章节的基础打牢了,理解扎实,往后会不那么难了,虽然图里顶点间的关系多了,但分析思路还是和链表和树是一样的。 函数BFSAllPath:用广度优先,队列的方法查找给定起止顶点间的所有路径。 感谢bilibili懒猫老师的教导。main函数所在源文件代码:#in原创 2021-07-31 00:52:49 · 369 阅读 · 0 评论 -
图里查找经过某一顶点的所有简单回路,DFS深度优先,c/c++描述
深度优先遍历,是遍历图的一种思路,用递归的方法,依次遍历完给定顶点的所有子图,因为我们不能叫做该顶点的所有子树。子图就是依该顶点的邻接点为代表的子图。遍历过程中,不允许出现重复顶点,直至路径结束,遍历不到不重复的新的顶点;若是出现了与路径头顶点相同的顶点,说明出现了一条简单回路,即为所求。所以该题目是在DFS深度优先遍历的基础上进行的。 函数DFSFindPath:依次查找包含各个顶点的所有简单回路。本例中,查找完包含A的所有回路后,再查找包含B的所有回路,依次类推。 DFS深度优先遍历,bil原创 2021-07-30 17:56:33 · 882 阅读 · 0 评论 -
图里查找顶点间是否存在路径,c/c++描述
路径的查找问题,以往我们遇到过的,有栈的迷宫问题,树里根节点到叶节点的路径问题,哈夫曼编码。这些路径的查找,是相似的。找到路径则输出到屏幕。没有则不输出。同时,在图里面要防止路径上顶点重复,基于深度优先遍历DFS。 函数DFSFindPath:基于深度优先遍历,查找给定俩顶点间是否存在路径。 main函数所在源文件代码:#include<iostream>#include<stdio.h>using namespace std;#define MAXVERTEX原创 2021-07-30 13:51:45 · 318 阅读 · 0 评论 -
图的遍历,深度优先DFS与广度优先BFS,c/c++描述
图里顶点的关系是顶点可以有多个前驱,多个后继。对于无向图,则不区分入边与出边,顶点间只区分有无边连接。图的遍历,是指不重不漏的访问到图里每个顶点,每个顶点访问一次。 深度优先DFS的思路可以概括为:依次遍历完第一个顶点的所有子图,其每个邻接点作为子图的代表,这样就完成了整个图的遍历,这个定义是递归的。BFS的思路可以概括为,先遍历完第一个顶点的所有邻接点,再遍历完所有邻接点的所有邻接点,依次类推,直至所有顶点都被遍历一次。 因为顶点间可以有多条路径,所有要为所有顶点建立一个是否访问过的数组,vi原创 2021-07-30 00:09:26 · 95 阅读 · 0 评论 -
图的邻接多重表,c/c++描述
由主函数中图的顶点数组和邻接矩阵,给出图的已知信息,据此建立无向图的邻接多重表。 因为对于无向图的邻接链表来说,一条边对应的顶点间的连接关系会在两个顶点的邻接链表里各出现一次,造成存储上的资源浪费。而且,对于删除一条边的操作,需要在两个顶点的链表里各删除一个节点,可以认为稍嫌麻烦。因此出现了邻接多重表的存储结构。 邻接多重表里最重要的概念是,表里节点的结构:包括边对应的权成员,边的两个顶点在顶点数组里的下标,还有两个指针成员,两个指针各自指向与边里顶点邻接的下一个顶点所在的结点。 如顶点A—原创 2021-07-29 12:44:17 · 281 阅读 · 0 评论 -
图的十字链表的建立,c/c++描述
图比树有更复杂的数据关系。数据间是多对多的关系,有多个前驱,多个后继。对于有向图,图的邻接表,只能表示顶点的出边邻接点,即所有以表头顶点为边尾的顶点,求顶点的出度很方便,计算链表里除表头外有几个节点即可。但计算顶点的入度就很复杂。例如有A----->B,为了求顶点B的入度,找到A---->B这条边,只能逆向查找,在顶点A的出边邻接链表里,看是否有邻接点为B,遍历表头数组,即可得到顶点B的入度。 所以就有了图的十字链表储存方式,一个表头带两个链表,一个出边邻接点链表,一个入边邻接点链表。原创 2021-07-15 17:51:54 · 339 阅读 · 0 评论 -
图的邻接矩阵与邻接表的建立,c/c++描述
图里数据节点是多对多的关系。一个节点有多个前驱,也有多个后继。甚至还有无向图,不区分前驱和后继,只需要节点之间有邻接关系即可。因此,描述这种数据关系,需要新的数据结构。 图有顶点集和边集组成。顶点代表一个数据节点,边代表数据顶点间的邻接关系。 描述图的数据结构是多种多样的,bilibili里小甲鱼老师也说了,程序编程是没有唯一答案的。能解决问题即可。因为编程的自由度,比数学领域大,不像数学题那样只有唯一一个正确答案。和为数不多的几种解法。程序能解决问题,清晰易懂就是好程序。在前人的基础上改动一些原创 2021-07-14 18:27:33 · 1842 阅读 · 0 评论