Data_Structure
文章平均质量分 89
李柒岁
这个作者很懒,什么都没留下…
展开
-
【leetcode】148.链表归并排序C语言实现O(n log n) 时间复杂度和常数级空间复杂度
题目出处题目要求:在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。以下评论来自leetcode @Allen个人感觉受益匪浅,本文在此思路上用C语言实现了对链表的归并排序,并对一些细节做出了补充说明。bottom-to-up 的归并思路是这样的:先两个两个的 merge,完成一趟后,再 4 个4个的 merge,直到结束。举个简单的例子:[4,3,1,7,8,9,2,11,5,6].step=1: (3->4)->(1->7)->(8->9原创 2020-09-19 16:24:16 · 387 阅读 · 0 评论 -
【leetcode】1491. 去掉最低工资和最高工资后的工资平均值 C语言实现+思路分析
题目给你一个整数数组 salary ,数组里每个数都是 唯一 的,其中 salary[i] 是第 i 个员工的工资。请你返回去掉最低工资和最高工资以后,剩下员工工资的平均值。与真实值误差在 10^-5 以内的结果都将视为正确答案。思路:模拟1.先找到最大最小工资2.再算平均值代码:double average(int* salary, int salarySize){ int max=0; int min=1000001; int MAX; int MIN原创 2020-08-05 11:21:26 · 509 阅读 · 0 评论 -
【leetcode】237_链表删除当前结点C语言实现
题目请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。由于函数参数只给定要求被删除的节点,所以我们可以这样想:如何让自己在世界上消失,但又不死? —— 将自己完全变成另一个人,再杀了那个人就行了。以上摘自leetcode评论区翻译过来便是:node这个节点就是需要删除的节点;之前我们可以用head->next->val去判断下一个是否是删除的节点,然后head->next=head->next->next,这题可以用把原创 2020-07-24 12:02:36 · 176 阅读 · 0 评论 -
【leetcode】239/剑指offer59_滑动窗口的最大值_C语言代码+注释
滑动窗口的最大值题目给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。进阶:你能在线性时间复杂度内解决此题吗?示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值--------------- ---原创 2020-07-23 21:46:09 · 790 阅读 · 1 评论 -
PTA 7-9 旅游规划 (25分)
题目链接有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。输入格式:输入说明:输入数据的第1行给出4个正整数N、M、S、D,N、M、S、D,N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0−(N−1);M0-(N−1);M0−(N−1);M是高速公路的条数;S是出发地的城市编号;D是目的地的城市编号。随后的M行中原创 2020-07-17 22:12:51 · 3020 阅读 · 1 评论 -
PTA 7-8 哈利波特的考试C语言实现
题目链接题目哈利·波特要考试了,他需要你的帮助。这门课学的是用魔咒将一种动物变成另一种动物的本事。例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等。反方向变化的魔咒就是简单地将原来的魔咒倒过来念,例如ahah可以将老鼠变成猫。另外,如果想把猫变成鱼,可以通过念一个直接魔咒lalala,也可以将猫变老鼠、老鼠变鱼的魔咒连起来念:hahahehe。现在哈利·波特的手里有一本教材,里面列出了所有的变形魔咒和能变的动物。老师允许他自己带一只动物去考场,要考察他把这只动物变成任意一只指定动物的原创 2020-07-17 11:57:23 · 1278 阅读 · 0 评论 -
【最小生成树】kruskal算法C语言实现
系列文章:【最小生成树】Prim算法C语言实现这里推荐一个B站的8min动画介绍的两种最小生成树的原理,建议先看完动画再看代码: 最小生成树(Kruskal(克鲁斯卡尔)和Prim(普里姆))算法动画演示 kruskal(克鲁斯卡尔)算法时间复杂度:O(NlogN)(N为边数)kruskal算法又称“加边法”,用于边数较少的稀疏图方法:每次找图中权值最小的边,将边连接的两个顶点加原创 2020-07-16 17:35:37 · 8005 阅读 · 4 评论 -
【最小生成树】Prim算法C语言实现
算法描述:Prim算法的大致思想:假设图G顶点集合为U,首先任选一点a(默认为第一条边)作为起始点,加入集合V,再从集合U-V中找到另一点b使得b到V中任意一点的权值最小,把b加入集合V。以此类推,现在集合V={a,b},再从集合U-V找到一点c使得c到V中任意一点的权值最小,将c加入集合V,此时就构建出一棵最小生成树。为了便于在集合U和U-V之间选择权值最小的边,建立两个数组mst和lowcost。lowcost[i]:表示以i为终点的边的最小权值,当lowcost[i]=0说明i点加入了最小生成树原创 2020-07-16 13:29:11 · 4716 阅读 · 11 评论 -
【图】最短路径Floyd算法C语言实现
相关blog:【图】最短路径Dijkstra算法C语言实现算法过程:1.把图用邻接矩阵G表示出来,如果从Vi到Vj有路可达,则G[i][j]=dG[i][j]=dG[i][j]=d,ddd表示该路的长度;否则G[i][j]=∞G[i][j]=∞G[i][j]=∞。一个点到自己的距离如G[i][i]=0G[i][i]=0G[i][i]=02.定义一个矩阵D用来记录所插入点的信息,D[i][j]D[i][j]D[i][j]表示从ViViVi到VjVjVj需要经过的点,初始化D[i][j]=−1D[i][j原创 2020-07-16 10:52:25 · 1692 阅读 · 2 评论 -
【图】最短路径Dijkstra算法C语言实现
Dijkstra算法(单源点路径算法)要求:图中不存在负权值边)算法步骤如下:G={V,E}初始时令 S=V0,T=V−S=S={V0},T=V-S=S=V0,T=V−S={其余顶点},T中顶点对应的距离值若存在<V0,Vi>,d(V0,Vi)<V0,Vi>,d(V0,Vi)<V0,Vi>,d(V0,Vi)为<V0,Vi><V0,Vi><V0,Vi>弧上的权值若不存在<V0,Vi><V0,Vi>&l原创 2020-07-15 21:38:14 · 1217 阅读 · 0 评论 -
【KMP字符串匹配】C语言实现 代码+视频详解
这是我看过讲得最好的KMP算法的视频了~视频适合小白,还请大佬指教!建议先看完视频,再配上文末代码食用!视频含代码,算法步骤讲解分析,通俗易懂。(声音好听) KMP字符串匹配算法1 KMP字符串匹配算法2 注意第一段视频中主要分析讲解步骤,第二段视频开始讲解代码。原创 2020-07-14 21:05:43 · 378 阅读 · 0 评论 -
【排序】经典排序算法动画详解----选择排序C语言实现
选择排序基本思想:1.第一次从全部数据元素扫描中选出最小(或最大)的一个元素,存放在序列的起始位置(第一个位置),2.再从第二个的元素开始向后扫描寻找到最小(大)元素,然后放到已排序的序列的第二个位置。 以此类推,直到全部待排序的数据元素的个数为零。图解:操作方法:1.假设第一个位置的元素是最小的设为min,for循环向后扫描一旦发现比min小的元素则把min的值换成比它小的元素值,并记下最小元素的值与坐标。2.一趟循环结束,交换第一个位置元素的值和序列中最小值元素所在位置的值。#incl原创 2020-07-13 10:25:31 · 285 阅读 · 0 评论 -
【排序】经典排序算法动画详解----希尔排序C语言实现
希尔排序希尔排序(Shellsort),也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序是基于插入排序的以下两点性质而提出改进方法的:1.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率2.但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位基本思想:希尔排序属于插入类排序,是将整个有序序列分割成若干小的子序列分别进行插入排序。排序过程:先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入原创 2020-07-13 09:57:02 · 589 阅读 · 0 评论 -
【排序】经典排序算法动画详解——冒泡排序C语言实现
系列文章插入排序堆排序冒泡排序基本思想:冒泡排序算法的运作如下:1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。最后一个元素已经有序。3.针对所有的元素重复以上的步骤,除了最后一个。4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。(重复以上步骤时每次都比上一次少重复一遍,因为每次交换都不需要比较最后一个元素)注:对于第四步中“直到没有任何一对数字需要比较原创 2020-07-12 22:25:21 · 1261 阅读 · 0 评论 -
【排序】经典排序算法动画详解----插入排序C语言实现
插入排序基本思想:每次选择一个元素,并且将这个元素和整个数组中的所有元素进行比较,然后插入到合适的位置。一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:⒈ 从第一个元素开始,该元素可以认为已经被排序(先假定第一个待排序元素已排好序)⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置⒋ 重复步骤3,直到...原创 2020-03-15 17:46:32 · 467 阅读 · 0 评论 -
【排序】经典排序算法动画详解——堆排序C语言实现
堆排序(Heap Sort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。动画详解平均复杂度O(nlog n + n) =O所谓堆排序就是每次取堆的根结点为最大值,然后将最后一个节点作为根节点,进行堆调整,堆排序的时间等于建堆和进行堆调整的时间,所以堆排序的时间复杂度是O(nlog ...原创 2020-03-29 21:04:30 · 423 阅读 · 0 评论 -
【图的建立】邻接矩阵/邻接表C语言实现
邻接矩阵表示图无权图实例:1.图基本结构#include<stdio.h>#include<malloc.h>#define MAXSIZE 100/******* 邻接矩阵 *******/typedef struct Gnode{ int nv ;//顶点 int ne ;//边 int G[MAXSIZE][MAXSIZE]; int data[20];//存顶点的数据}*graph;2.初始化一个有所有顶点原创 2020-07-12 11:07:34 · 1465 阅读 · 0 评论 -
并查集/路径压缩【C语言实现】
思路:结构体数组表示typedef struct treenode{ int data; int parent;}tree;数组中每个元素都是一个结构体,一个分量存该节点数值int data;,另一个分量int parent;存父结点的数组下标,实现了通过孩子结点找父结点的操作。特别的,对于根结点,不再有父结点,故分量int parent;设为-1.在优化并入操作时,我们希望有一个分量可以记录集合大小,这样能轻松实现将小的集合并入大的集合。对于这个特殊的分量,实际上只要根结点需要原创 2020-07-07 10:58:07 · 446 阅读 · 0 评论 -
【最大堆的操作】完全二叉树建立最大堆/插入/删除结点C语言实现
最大堆的插入步骤:1.将新插入元素放在size+1的位置2.向上过滤结点使之满足最大堆的特点最大堆的删除基本概念:对于一个完全二叉树,结点序号为i的左孩子是2i,右孩子是2i+1。步骤1.堆是否为空(为空则无法删除)2.若不为空,取出根结点的最大元素3.将数组下标最大的一个元素提出来,放在根结点位置4.从上到下过滤结点heap->Data[heap->size]待比较元素 过滤结点的具体操作4.1 parent*2<=heap->size//判别原创 2020-07-06 20:04:06 · 1137 阅读 · 0 评论 -
单链表反转第m个结点到第n个结点/非递归C语言实现
第m个结点到第n个结点反转单链表step1step2step3代码实现#include<stdio.h>#include<malloc.h>typedef struct node{ int data; struct node *next;}*list;list gen(){ list head,end,node; int num; head=(list)malloc(sizeof(struct node));原创 2020-07-06 11:50:43 · 535 阅读 · 0 评论 -
【AVL树】图解四种旋转/递归求树高/插入节点调整AVL树C语言实现
不平衡的二叉树四种类型:对应的四种调整方式:LL:LL失去平衡的情况下,可以通过一次旋转让AVL树恢复平衡。步骤如下:1.将根节点的左孩子作为新根节点。2.将新根节点的右孩子作为原根节点的左孩子。3.将原根节点作为新根节点的右孩子。RR:RR失去平衡的情况下,旋转方法与LL旋转对称,步骤如下:将根节点的右孩子作为新根节点。将新根节点的左孩子作为原根节点的右孩子。将原根节点作为新根节点的左孩子。LR:LR失去平衡的情况下,需要进行两次旋转,步骤如下:1.对根节点的左孩子进行RR旋原创 2020-07-04 18:31:54 · 1187 阅读 · 0 评论 -
二叉搜索树(BST)的插入和删除C语言
插入Bintree Insert(int X,Bintree BST){ if(!BST)//若原树为空,生成并返回一个只有一个结点的二叉树一个 { BST=malloc(sizeof(struct Binary));//有问题!!! BST->Data = X; BST->left=NULL; BST->right=NULL; } else if(X < BST->Data)原创 2020-07-03 20:13:11 · 1755 阅读 · 0 评论 -
PTA 7-18 银行业务队列简单模拟 (25分)
题目出处设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。输入格式:输入为一行正整数,其中第1个数字N(≤1000)为顾客总数,后面跟着N位顾客的编号。编号为奇数的顾客需要到A窗口办理业务,为偶数的顾客则去B窗口。数字间以空格分隔。输出格式:按业务处理完成的顺原创 2020-07-02 20:16:42 · 1287 阅读 · 0 评论 -
PTA 7-3 树的同构 C语言判断两棵树是否同构
程序框架int main(){ 建立二叉树1 建立二叉树2 判断同构并输出 return 0;}思考:注意判断树的同构时,要注意利用递归函数,使程序简洁。给出两个结点,判断同构时有几种情况:从自身结点考虑:两个结点都是空的,此时同构两个结点有一个是空的,另一个不是空的,此时一定不同构两结点都不空,但储存的值不一样,此时一定不同构考虑完自身,再考虑孩子(注意考虑孩子时只考虑左孩子):4. 两个结点都没有左孩子,递归判断右孩子(此时不需要把两个结点都没有右孩子,递归判断原创 2020-07-02 16:44:38 · 1504 阅读 · 1 评论 -
PTA7-16 一元多项式求导 (20分) 设计函数求一元多项式的导数
设计函数求一元多项式的导数。题目在此输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。输入样例::3 4 -5 2 6 1 -2 0输出样例:12 3 -10 1 6 0思考:一开始想用链表来存储数据结构,后来发现自己想复杂了,对于这道题,不需要存储数据!!!#include<stdio.h>#include<ma原创 2020-07-02 09:04:54 · 5744 阅读 · 2 评论 -
二叉树C语言基本定义+操作代码+注释详解(二叉树的递归/非递归遍历方法)
二叉树C语言基本定义+操作代码+注释详解1.树的基本特点1.1.儿子兄弟表示法2.二叉树定义性质即储存2.1.二叉树的基本性质2.2.数组表示方法2.3.链表的表示方法3.二叉树的遍历3.1.先序遍历3.2.中序遍历中序遍历非递归算法3.2.后序遍历1.树的基本特点子树不相交j结点的度:结点的子树个数叶节点:度为0的结点除根节点,每个结点有且仅有一个父结点一颗N个结点的树有N-1条边查找成功时查找次数不会超过判定树的深度(n个结点的判定树深度为结点的层次:规定根结原创 2020-07-01 17:28:19 · 2893 阅读 · 0 评论 -
PTA7-2 一元多项式的乘法与加法运算测试样例+代码详解
PTA7-2 一元多项式的乘法与加法运算测试样例:序号输入输出04 3 4 -5 2 6 1 -2 015 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 13 5 20 -7 4 3 15 20 -4 4 -5 2 9 1 -2 012 1 2 1 01 4 -1 02 1 2 -1 02 222 -1000 1000 1000 0-1000000 2000原创 2020-06-28 12:47:32 · 1809 阅读 · 1 评论 -
队列【链表】储存C语言代码+详解
队列的储存还可以用一个单链表来实现。链表最后一个元素不可当作front,因为单链表无法找到前一个元素,因此无法方便进行删除(出队)操作。由以上分析,front指向链表的第一个元素,rear指向链表最后一个元素。...原创 2020-06-27 17:52:42 · 631 阅读 · 0 评论 -
队列顺序【数组】储存C语言代码+详解
队列(Quene):具有一定约束关系的线性表。 插入和删除:只能在一段插入,在另一端删除。特点:1.先来先服务 2.先进先出(FIFO)。操作集:1.Quene CreatQuene(int Maxsize);//生成长度为Maxsize的空队列2.int IsFullQ(Quene Q,int Maxsize);//判断队列是否已满3.int IsEmptyQ(Quene Q);//判断队列是否为空4.void AddQ(Quene Q,ElementType item);//将数据item入原创 2020-06-27 10:27:19 · 682 阅读 · 0 评论 -
线性表堆栈的链表储存C语言代码+详解注释
当用单向链表结构储存堆栈时,top只能位于链表表头,此时插入和删除都很方便,如果top在链表的表尾,那么无法进行删除操作。1.基本结构typedef struct SNode *stack;struct SNode{ ElementType Data; struct SNode *Next;};2.创建空栈stack gen(){ stack s; s=(stack)malloc(sizeof(stack)); s->Next=NULL;原创 2020-06-26 12:09:01 · 203 阅读 · 0 评论 -
线性表堆栈的顺序储存C语言代码+详解注释
1.入栈void Push(stack ptrS,ElementType item){ if(ptrS->top==MAXSIZE-1) { printf("堆栈满"); return; } else{ ptrS->top++; ptrS->Data[ptrS->top]=item; /*等价于 ptrS->Data[++(ptrS->top)]=.原创 2020-06-25 23:36:55 · 220 阅读 · 0 评论 -
线性表的链表C语言实现基本操作 代码+注释详解 含头指针&不含头指针【求表长,初始化,插入,删除,遍历】
线性表的链表实现基本操作详解求链表表长查找元素插入元素删除元素求链表表长//1.求表长int Length(List Ptrl){ List p = Ptrl;//P是一个临时的指针,指向链表的头 int j=0;//计数器 while (p!=NULL)//while(p) { p=p->next; j++;//当前p指向第j个元素 } return j;}2.查找①按序原创 2020-06-24 23:32:13 · 1683 阅读 · 0 评论 -
线性表的数组实现基本操作 代码+注释详解
线性表的数组实现基本操作1.建立空表2.查找3.插入4,删除1. 建立空表2. 查找元素3. 插入元素4. 删除元素结构体typedef struct LNode *List;struct LNode{ ElementType Data [MAXSIZE]; int Last;//线性表最后一个元素位置};struct LNode L;List Ptrl;访问下标为i的元素:L.Data[i]或Ptrl->Data[i]线性表的长度 L.Last+1或Ptrl原创 2020-06-24 17:53:45 · 383 阅读 · 0 评论