![](https://img-blog.csdnimg.cn/b6b5692f052f4524a6c78cb086829064.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构
文章平均质量分 75
自己学习数据结构的例题代码(风格参考天勤数据结构及严蔚敏数据结构),以及自己的小笔记,有错见谅。
芣苢的成长之路
一个菜鸟
展开
-
数据结构——迪杰斯特拉(Dijkstra)算法
迪杰斯特拉算法又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。以下是数据结构中关于迪杰斯特拉算法的操作(编程风格参考严蔚敏版数据结构)。原创 2022-10-31 22:00:50 · 14006 阅读 · 6 评论 -
数据结构——克鲁斯卡尔(Kruskal)算法
克鲁斯卡尔算法是求连通网的最小生成树的另一种方法。与普里姆算法不同,它的时间复杂度为O(eloge)(e为边数),适合于求边稀疏的网的最小生成树 。克鲁斯卡尔算法从另一途径求网的最小生成树。其基本思想是:假设连通网G,令最小生成树的初始状态为只有n个顶点而无边的非连通图T,概述图中每个顶点自成一个连通分量。在E中选择代价最小的边,若该边依附的顶点分别在T中不同的连通分量上,则将此边加入到T中;否则,舍去此边而选择下一条代价最小的边。原创 2022-10-31 11:19:03 · 17904 阅读 · 0 评论 -
数据结构——普里姆(Prim)算法
普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小。以下是数据结构中关于普里姆算法的操作(编程风格参考严蔚敏版数据结构)。原创 2022-10-30 16:40:37 · 12074 阅读 · 0 评论 -
数据结构——广度优先遍历(BFS)无向连通图
以下是数据结构中关于广度优先遍历无向连通图的操作(编程风格参考严蔚敏版数据结构)。其实深度优先遍历就是二叉树的层次遍历的推广。代码是参考严蔚敏版《数据结构》写的,因为书上只写核心代码不是完整的源程序,以上代码能调是通过是自己对书本代码进行补充才能跑起来,水平有限可能有错,敬请批评指正。原创 2022-10-30 10:33:49 · 2231 阅读 · 0 评论 -
数据结构——深度优先遍历(DFS)无向非连通图
以下是数据结构中关于深度优先遍历非无向连通图的操作(编程风格参考严蔚敏版数据结构)。其实深度优先遍历就是二叉树的先序遍历的推广。如果像连通图那样子用DFS,就会导致不管从哪个节点出发,都只能在自己所在的子图里遍历,而无法做到遍历完整的图。此时循环的作用就是:尝试遍历每一个节点,不放过每一个节点就可以把每一个子图以深度优先遍历的方式给遍历完成了(就是尝试从每个节点开始访问)。原创 2022-10-29 21:56:20 · 2835 阅读 · 0 评论 -
数据结构——深度优先遍历(DFS)无向连通图
以下是数据结构中关于深度优先便利无向连通图的操作(编程风格参考严蔚敏版数据结构)。深度优先遍历就是二叉树的先序遍历。说明: VerTexType;//代表节点变量的类型(一般我们用ABCD表示节点,所以用char) typedef intArcType;// 代表边变量的类型(肯定用长度表示边呀,所以用int或者double都可)#define MaxInt 32767 //边的最大值(表示目标不可达)#define MVNum 100 //最大节点数//标记访问记录的数组;宏定义会自动赋值为0。原创 2022-10-29 21:27:51 · 3930 阅读 · 0 评论 -
数据结构——二路归并排序
归并排序就是将两个或两个以上的有序表合并成一个有序表的过程,其中将两个有序表合并成一个有序表的过程称为“2-路归并”。原创 2022-10-07 19:35:36 · 1942 阅读 · 0 评论 -
数据结构——堆排序(向上调整构建大根堆,向下调整排序)
堆的结构可以分为大根堆和小根堆,是一个完全二叉树。它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,如果满足:Ki = K2 i+2称为大根堆。原创 2022-10-07 15:52:34 · 3285 阅读 · 0 评论 -
数据结构——折半查找
折半搜索,也称二分搜索、对数搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。注意:元素序列一定是要有序的,乱序的情况下不可以使用折半查找。原创 2022-10-04 21:04:00 · 6495 阅读 · 2 评论 -
数据结构——哈希排序
哈希排序,就是用空间换取时间的一种排序方式,空间利用率达O(n)。如果一个元素序列a里没有重复的元素,而我们需要找最大值或者前几个最大值时,怎么办呢?1、将这个a序列排序,然后直接选出目标值;2、开辟一个b数组,a里的每一个元素对应b数组的下标,并将b数组该下标的元素设置为1。然后将b数组逆序遍历,就能得到目标值。方式2就是哈希排序的思想。比如a的元素是[5,1,2,3,7],那么就是b[5]、b[1]、b[2]、b[3]、b[7]设置为1,其它位置的元素都是0。然后逆序遍历,就能拿到目标值。原创 2022-10-03 22:05:43 · 7385 阅读 · 7 评论 -
数据结构——希尔排序
本文主要介绍的是希尔排序是设计思想和编程实现。希尔排序是插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序是把记录按下标的一定增量(gap)分组,对每个分组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。引入的增量的目的就是:每次进行一次预排序,让整个序列在下一轮排序时相比之前都更为有序,以此类推越往后该序列越来越接近理想情况,时间复杂度也就越来越好了。原创 2022-10-03 19:15:43 · 579 阅读 · 0 评论 -
数据结构——二叉树的创建与遍历(链式存储结构)
二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。以下是对链式存储结构的二叉树的创建与先序、中序、后序遍历操作原创 2022-10-02 22:23:07 · 11371 阅读 · 6 评论 -
数据结构——快速排序
算法设计思想取出序列里某个值为基准值,以基准值为分割点,将待排序序列划分为左右两个子序列。左子序列的所有元素都比基准值小,右子序列都比基准值大;重复此过程,直到整个序列都有序为止。排序步骤找基准值的方法:1、选出待排序序列最左侧元素当基准值;2、设置两个哨兵left和right,分别位于待排序序列左右两端。3、右哨兵right先往左走,遇到比基准值小的元素时停止移动;4、右哨兵right停止移动后,左哨兵left开始向右移动,直到遇到比基准值大的元素时停止移动;5、交换左右哨兵所指向的元素原创 2022-10-02 20:29:27 · 775 阅读 · 0 评论 -
数据结构——选择排序
本篇文章介绍数据结构与算法的经典排序算法之一:选择排序。操作与思想:选择排序的思想和冒泡排序相似:每次从序列剩下的元素中选出最大/最小的元素,直至整个序列有序。和插入排序不同的是,选择排序不用进行数据的挪动,而是直接选择对应的元素进行交换。原创 2022-09-21 15:10:51 · 555 阅读 · 0 评论 -
数据结构——直接插入排序
直接插入排序是学习数据结构里经典排序算法之一。该排序的操作步骤类似平时我们打扑克牌的时候给自己的手牌进行排序的行为。这个操作思想主要可以概括为:一次取出序列里每一个元素,将其插入一个已经有序的序列之中,一直到整个序列都有序为止。原创 2022-09-21 10:47:10 · 959 阅读 · 0 评论 -
数据结构——KMP匹配过程(可视化输出)
数据结构里KMP是考点之一,很多人也觉得是难点之一。首先是代码很简洁,几行代码就完成了工作让人摸不着头脑;其次是想象不出KMP匹配的具体过程。以下是数据结构KMP的匹配过程(多图预警)...原创 2022-07-17 19:17:34 · 938 阅读 · 0 评论 -
数据结构——KMP之next执行过程解析
在复习到KMP的时候,发现KMP虽然是字符串匹配问题,但是核心不是模板串和目标串的匹配,而是求出模板串自己的每一位对应的前面公共前后缀的长度。关于求next的代码网上很多,书上也写有,但是运行的过程不太直观。以下是手推过程(关于next的思想我是菜鸡就不解释了,以下只推执行过程,通过过程来理解求next数组的思想吧):...原创 2022-07-17 11:22:44 · 441 阅读 · 0 评论 -
数据结构——顺序串(定义初始化、赋值、遍历、两串比较)
S;串的组成1length用length记录串的长度是为了减少后期的遍历串获取串长度的时间复杂度。如果不设置length的话,每一次获取字符串长度都需要一次循环,时间复杂度为O(n),如果设置了length的话,给串新增字符的过程中就记录当前串的长度,未来需要串的长度的时候直接获取length就可以了,时间复杂度降低为O(1)。2chch是串里的字符串。......原创 2022-07-16 16:41:05 · 3720 阅读 · 4 评论 -
数据结构——链队(定义、初始化、判断空队、入队、出队、遍历)
以下是数据结构中关于链队的定义、初始化、判断空队、入队、出队、遍历等基础操作。链队里有两个指针头指针和尾指针。指针的类型是QNode。QNode里有两个属性data和next指针。原创 2022-07-15 22:51:17 · 3801 阅读 · 3 评论 -
数据结构——循环队列(声明、初始化、判断队空/队满、入队、出队、遍历队)
以下是数据结构中关于循环的声明、初始化、判断空与满、出队、入队、遍历队等基础操作(编程风格参考严蔚敏数据结构)。本代码主要将书本代码进行补充完成调试的(元素最大数量为MAXSIZE-1),以及自己新加进去的遍历操作。......原创 2022-07-15 17:40:11 · 3004 阅读 · 0 评论 -
数据结构——顺序队列1(声明、初始化、判断队空/队满、入队、出队、遍历队)
以下是数据结构中关于顺序队列的声明、初始化、判断空与满、出队、入队、遍历队等基础操作(编程风格参考严蔚敏数据结构)。原创 2022-07-15 15:15:57 · 2434 阅读 · 0 评论 -
数据结构——顺序栈判断小括号匹配
以下是数据结构中关于顺序栈的小括号匹配的基础操作(编程风格参考天勤数据结构)。原创 2022-07-14 19:57:27 · 555 阅读 · 0 评论 -
数据结构——链栈3(声明、(无头结点)初始化、头插法入栈、出栈、遍历栈)
以下是数据结构中关于无头结点链栈的声明、初始化、头插法入栈、出栈、遍历栈等基础操作(编程风格参考严蔚敏数据结构)。经过头插法生成的无头结点链栈长这样:声明及初始化因为没有头结点,链栈第一个栈点直接设为null(具体原因看下面头插法的解释说明)步骤:画出来是这样的:S;p1->next = S;(S=p1后):S->S1(S1对应上一行的S);p2->next = S;(S=p2后):S->S2->S1(S1对应最初的S,S2是刚才的p1,S是刚才的p2)步骤:直接从头遍历到尾即可。...原创 2022-07-14 16:35:11 · 653 阅读 · 0 评论 -
数据结构——链栈2(声明、初始化、头插法入栈、出栈、遍历栈)
以下是数据结构中关于链栈的声明、初始化、头插法入栈、出栈、遍历栈等基础操作(编程风格参考天勤数据结构)。头插法的链栈长这样:具体操作在下面说明。注意:因为头结点没有具体的值,所以不需要输出头结点,从头结点的next开始输出。......原创 2022-07-14 15:33:26 · 444 阅读 · 0 评论 -
数据结构——链栈1(声明、初始化、尾插法入栈、出栈、遍历栈)
以下是数据结构中关于链栈的声明、声明、初始化、入栈、出栈、遍历栈等基础操作(编程风格参考天勤数据结构)。笔记:链栈一般视为无满栈状态,所以无需定义链栈最大尺寸注意:指向自己同类型的节点,不能写别名因为是给main函数里声明的链表进行初始的分配空间,所以必须把其实体(实参)传入,而不是传入形参。......原创 2022-07-14 12:49:50 · 1053 阅读 · 0 评论 -
数据结构——顺序栈1(声明、初始化、判断空与满、入栈、出栈、遍历栈)
以下是数据结构中关于顺序栈的声明、声明、初始化、判断空与满、入栈、出栈、遍历栈等基础操作(编程风格参考天勤数据结构)。两个属性:data是存放数据的数组,top用来表示栈顶。在这里设置top=-1表示栈空。当有元素进栈时,top先自增成0,这样设计数组的下标可以直接用top表示,紧接着元素按照下标入栈。当然,如果top=0,那就是数组下标用top表示元素入栈的位置,然后再自加1。判断满栈是用top != MAXSIZE - 1(因为下标从0开始算);......原创 2022-07-13 16:53:19 · 2010 阅读 · 0 评论 -
数据结构——单向链表(声明、初始化、增加、删除、插入、搜索、修改)
以下是数据结构中单向链表的声明、初始化、增加节点、删除节点、插入节点、搜索节点的基本操作:此处的结构体名为LNode,别名LNode、LinkList。声明一个节点,作为首节点,下一个节点设置为空。将链表地址传入函数中,再进行操作。值得注意的是:LinkList &List等价于LNode *&List如果data插入到第index个元素前,i设为1。如果data插入到第index个元素后,i设为0。p->next = t->next;//p指向下一个地址(被删除地址)的下一个地址。.....原创 2022-07-11 22:47:57 · 1058 阅读 · 2 评论 -
数据结构——双向循环链表(声明、初始化、增加、删除、搜索修改、顺序逆序遍历)
以下是数据结构中双向循环链表的声明、初始化、增加节点、删除节点、插入节点、搜索节点的基本操作:每一个节点有三个属性分别是data:数据;*next:下一个节点的地址;*pre:上一个节点的地址。因为是双向链表,首节点的后继节点和前驱节点都是自己本身。步骤如下:1、声明新节点2、将链表尾节点的后继由首节点更换为新节点;3、新节点的后继设为尾节点;4、将首节点的前驱设为新节点;5、将新节点的前驱设为之前的尾节点(此时新节点成为新的尾节点)。步骤:1、根据下标开始遍历;2、p->nex原创 2022-07-12 13:51:02 · 787 阅读 · 0 评论 -
数据结构——顺序表(声明、初始化、增加、删除、搜索修改、插入、遍历)
以下是数据结构中关于顺序表的声明、初始化、增加、删除、搜索修改、遍历等基础操作(编程风格参考严蔚敏版数据结构)。定义宏是为了让代码有更好的可读性初始化特别要注意的是:结构体用点( . ),结构体指针用箭头( -> )。也就是说点的左边必须为实体,箭头左边必须为指针。注意:add函数的flag = addElement(&L)的“&L”是为了将链表地址赋给addElement函数的指针L......原创 2022-07-12 19:04:05 · 1544 阅读 · 0 评论 -
数据结构——有序顺序表的合并
以下是数据结构中关于有序顺序表的合并的基础操作(编程风格参考严蔚敏版数据结构)。说明:ElemType 定义为int的目的是方便以后同意我们所需定义的元素的类型,比如如果以后想把结构体内的元素类型改为char,只需要在ElemType 这里宏定义为char即可(当然,编程的过程中关于元素的类型也要写ElemType)初始化特别注意:这里传进来的是一个实体,如果传进来的是指针,要先给指针开辟内存空间:L = new Sqlist;说明:书本上的代码是简写,关于声明的部分猜测是因为篇幅并没有写出来..原创 2022-07-13 13:54:22 · 7779 阅读 · 6 评论 -
数据结构——顺序栈2(声明、初始化、判断空与满、入栈、出栈、遍历栈)
以下是数据结构中关于顺序栈的声明、声明、初始化、判断空与满、入栈、出栈、遍历栈等基础操作(编程风格参考严蔚敏数据结构)。定义栈的尺寸为5个元素;属性说明:定义一个栈底指针和一个栈顶指针,用来表示栈元素的位置;定义一个栈尺寸防止栈溢出;步骤:判断栈满:如果栈顶指针地址-栈底指针的值等于栈的尺寸,就是栈空状态。因为指针是往下一个内存空间移动的,所以两个指针地址相减得出的是两个指针的距离(整形数据)。判断栈空:如果栈顶指针地址等于栈底指针,就是栈空状态。......原创 2022-07-13 22:41:35 · 2027 阅读 · 0 评论 -
C语言之函数调用指针参数*p、*&p的使用区别
而写了&的函数,就像main函数的a、b两个变量传入voidswap(int&x,int&y)交换main函数a、b两个变量值,以地址的形式传入便是a、b的实际地址,并不是把a、b的值赋给x、y,而是把a这个变量以名为x、b这个变量以名为y的方式在函数里进行交换,交换的依然是a和b,自然会将main函数的a、b两个变量的值进行交换了。指针实参指的是传入的是指针的地址。简言之x的值是a的地址,&x是x的地址,而*&x则是x的地址的值,也就是a的地址(地址的地址)。如果传递了地址符&,则为指针实参。......原创 2022-07-11 00:11:05 · 2435 阅读 · 0 评论 -
数据结构——结构体的5种定义方式及对比
以下仅介绍结构体的五种定义方式及定义方式的对比。原创 2022-07-10 22:58:35 · 899 阅读 · 0 评论