![](https://img-blog.csdnimg.cn/8c20f4c6fa024bddb8a61b48359ac59c.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构
文章平均质量分 92
数据结构-C语言
悠闲小人物
当你凝视深渊的时候,深渊也在凝视你!
展开
-
希尔排序耗时代码
折半排序,插入排序,希尔排序。c++排序函数所用时间的比较,十万个随机数进行排序所耗时(一百万个随机数,我的电脑显示不出来)#include <iostream>#include <stdio.h>#include <stdlib.h>#include <time.h>using namespace std;#define MAXSI...原创 2018-12-03 16:15:58 · 312 阅读 · 0 评论 -
任意进制转换十进制 -- c语言
任意进制转换十进制 – 数据结构c语言队列操作实现代码也不算是任意进制,最高只能到十六进制。见谅!代码如下:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXSIZE 100 //静态顺序栈存储的最大空间 const char f[]="0123456789ABCDEF";//定义一个全局常量 ,方便导出十进制以上的不为数字形式的数据的显示 void Interrupt原创 2020-10-25 11:48:03 · 3963 阅读 · 0 评论 -
C语言 中序遍历二叉树--非递归算法
完整代码如下:#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct BiTNode//二叉树的结构体 { char ch;//二叉树的数据域 struct BiTNode *lchild,*rchild;//二叉树的指针域 }BiTNode ,*BiTree;typedef struct StackNode //栈的结构体 { BiTree data;//栈原创 2020-10-22 20:52:26 · 4783 阅读 · 1 评论 -
C语言 创建二叉树及对二叉树的操作
代码都是书上的。需要注意的是怎么输入。第一行 为自己输入的数据,在创建的二叉树中数据域为char型,故空格和enter键也会被存入二叉树数据中。‘#’号总比二叉树数据结点多一个,不然一直在输入,无法进入输出。输出是中序遍历打印的。根据上面的输入数据可以画出自己创建的二叉树(上图)。这是草稿纸上的操作,代码结果只输出中序遍历结果。完整代码如下:#include <stdio.h>#include <stdlib.h>#include <string.h>原创 2020-10-22 11:16:17 · 8604 阅读 · 12 评论 -
C语言 串的链式存储
串的链式存储:顺序串的插入和删除操作不方便,需要移动大量的字符。因此,可采用单链表方式存储串。由于串结构的特殊性一结构中的每个数据元素是 一个字符,则在用链表存储申值时,存在个“结点大小”的问题,即每个结点可以存放一个字符,也可以存放多个字符。例如,图中(a)所示为结点大小为4 (即每个结点存放4个字符)的链表,图中(b)所示为结点大小为1的链表。当结点大小大于1时,由于串长不一定是结点大小的整倍数, 则链表中的最后一个结点不一定全被串值占满,此时通常补上“#”或其他的非串值字符(通常“#”不属于串的字符原创 2020-10-22 10:05:47 · 2753 阅读 · 4 评论 -
十进制转换任意进制--链栈实现
首先,先了解一下c语言const用法:修饰局部变量,int const a = 9; const int b = 8;这两种写法是一样的,表示a和b都是常量,不可改变。需要注意的是,用const修饰变量时,一定要给变量初始化,否则之后就不能再进行赋值了。完整代码如下:#include <stdio.h>#include <stdlib.h>#include <string.h>const char f[]="0123456789ABCDEF";//定义一个全原创 2020-10-22 09:31:30 · 1417 阅读 · 2 评论 -
十进制转换二进制--栈实现
C语言十进制转换二进制,用顺序栈实现。完整代码如下:#include <stdio.h>#include <stdlib.h>#define MAXSIZE 20 //静态顺序栈存储的最大空间 typedef struct{ int data[MAXSIZE];//静态顺序栈可用的最大容量 int top;//栈顶}SqStack;void InitStack(SqStack &S)//栈的初始化 { S.top = -1;//静态顺序栈中,使S原创 2020-10-22 08:36:57 · 9061 阅读 · 0 评论 -
C语言动态顺序串实现--KMP算法
数据结构C语言动态顺序串,相比于静态顺序串只是多了能增加最大容纳量函数的操作。#include <stdio.h>#include <stdlib.h>#include <string.h>#define StrSize 20 //动态顺序串当前最大长度 typedef struct{ char *ch;//数据域 int length;//串长 int MaxSize;//最大容量 }SString;void InitSt原创 2020-10-20 15:54:12 · 409 阅读 · 1 评论 -
C语言顺序串--BF算法
数据结构C语言静态顺序串代码如下:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXSIZE 50 //静态顺序串的最大容纳量 typedef struct{ char ch[MAXSIZE];//数据域 int length;//串长 }SString;void InitString(SString &S)//初始化串,静态顺序串中,只让串原创 2020-10-20 15:44:12 · 1108 阅读 · 0 评论 -
数据结构 队列的实现--链式
数据结构c语言链式队列的实现与表示代码如下:#include <stdio.h>#include <stdlib.h>typedef struct QNode{ int data; struct QNode *next;}QNode,*QueuePtr;typedef struct{ QueuePtr front;//队头指针 QueuePtr rear;//队尾指针 }LinkQueue;void InitQueue(LinkQueue &原创 2020-10-10 18:06:59 · 130 阅读 · 0 评论 -
栈的链表实现 C语言
数据结构c语言链式栈代码如下:#include <stdio.h>#include <stdlib.h> typedef struct StackNode { int data; struct StackNode *next; }SqStack,*LinkStack;void InitStack(LinkStack &S)//栈的初始化,只有创建一个栈顶结点这一步 { S = (SqStack*)malloc(sizeof(SqStack));//原创 2020-10-09 09:18:05 · 175 阅读 · 0 评论 -
动态顺序栈 C语言
数据结构C语言动态顺序栈的实现和表达#include <stdio.h>#include <stdlib.h> #define Initsize 10 //静态顺序栈存储的最大空间 #define OVERFLOW 1 //定义栈的溢出 typedef struct { int *base;//栈低指针 int *top;//栈顶指针 int MaxSize;//栈当前最大容量 }SqStack;void InitStack(SqStack &原创 2020-10-07 20:28:32 · 549 阅读 · 0 评论 -
静态顺序栈 C语言实现
数据结构c语言静态顺序栈的实现和操作代码如下:#include <stdio.h>#include <stdlib.h> #define MAXSIZE 10 //静态顺序栈存储的最大空间 typedef struct { int data[MAXSIZE];//静态顺序栈可用的最大容量 int top;//栈顶 }SqStack;void InitStack(SqStack &S)//栈的初始化 { S.top = -1;//静态顺序栈中,使原创 2020-10-06 22:28:23 · 501 阅读 · 1 评论 -
集合的合并 C语言实现
数据结构c语言单链表对集合的合并首先初始化一个链表,并判断是否为空(这里就不写了)然后就是对链表的创建,将数据输入到链表中,但是不知道要输入的集合中有多少数据,所以改成直接插入数据,不用输入要输入多长的集合。LinkList CreatList(LinkList &L)//创建链表 { int a; LNode *s,*r=L; printf("请输入链表数据:"); while(1) { scanf("%d",&a);//输入要链表数据 s = (LNode原创 2020-10-05 22:23:44 · 2789 阅读 · 0 评论 -
双向循环链表的创建及基本操作
数据结构c语言双向循环链表双向循环链表在定义上类似于循环单链表,就多了个前指针,以方便于向前查找。在双向链表中需要同时修改两个方向的指针,是单向链表指针的两倍。完整代码如下:#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct DuLNode{ int data;//结点的数据域 struct DuLNode *prior;//结点的后指针域 struct D原创 2020-10-05 16:38:15 · 3255 阅读 · 2 评论 -
循环单链表的创建及基本操作 C语言
数据结构c语言循环单链表在单链表的基础上增加了循环,和单链表几乎是一样的,只是对链表头结点的定义和对链表结尾的判断,从NULL变成了指向头结点L。别的定义和单链表一样。代码如下:#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct LNode{ int data;//结点的数据域 struct LNode *next;//结点的指针域 }LNode,*LinkL原创 2020-10-04 18:00:54 · 1703 阅读 · 1 评论 -
c语言线性表-顺序表(完整版)
c语言线性表顺序存储表示这几天我尝试写写c语言顺序表,我是这样想的:在学链表之前,先搞懂顺序表。不喜勿喷,本人新手,大多代码借鉴书上。如有错误之处,请原谅!首先创建一个结构体:typedef struct{ ElemType *elem;//存储空间的基地址 int length;//当前长度 }Sqlist;//顺序表的结构类型为Sqlist 然后建立一个空表,并填上数据:Status InitList(Sqlist &L)//建立一个空表 { L.elem = new原创 2020-10-01 17:32:49 · 22245 阅读 · 19 评论 -
链表的创建及相应操作 C语言
数据结构c语言 链表通过上篇对线性表顺序存储表示的了解,今天进一步对线性表的链式表示进行尝试。本人小白,不喜勿喷。如有错误之处,还请原谅!完整代码如下:#include <stdio.h> #include <stdlib.h>#include <string.h> typedef struct LNode{ int data;//结点的数据域 struct LNode *next;//结点的指针域 }LNode,*LinkList;//LinkL原创 2020-10-03 09:35:09 · 619 阅读 · 0 评论 -
归并排序 C语言实现
归并排序( Merging Sort )就是将两个或两个以上的有序表合并成一-个有序表的过程。将两个有序表合并成个有序表的过程称为2-路归并,2-路归并最为简单和常用。算法思想:假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列;再两两归并,……,如此重复,直至得到一个长度为1的有序序列为止。书上的例子:时间复杂度O(nlog2log_2log2n)空间复杂度O(n)算法特点:1)是稳定排序。2)可用于原创 2020-11-20 21:55:03 · 589 阅读 · 0 评论 -
堆排序 C语言实现
堆排序(Heap Sort) 是一种树形选择排序,在排序过程中,将待排序的记录Data[1…n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩 子结点之间的内在关系,在当前无序的序列中选择关键字最大(或最小)的记录。时间复杂度O(nlog2log_2log2n)空间复杂度O(1)算法特点:1 ) 是不稳定排序。2 ) 只能用于顺序结构,不能用于链式结构。3 ) 初始建堆所需的比较次数较多,因此记录数较少时不宜采用。堆排序在最坏情况下时间复杂度为O(nlog2n),相对于原创 2020-11-20 16:42:37 · 938 阅读 · 1 评论 -
简单选择排序 C语言
简单选择排序(Simple Selection Sort)也称作直接选择排序。算法步骤:1) 设待排序的记录存放在数组Data[1…n]中。第一趟从Data[1]开始,通过n-1次比较,从n个记录中选出关键字最小的记录,记为Data[k],交换Data[1]和Data[k]。2) 第二趟从Data[2]开始,通过n- 2次比较,从n-1个记录中选出关键字最小的记录,记为Data[k],交换Data[2]和Data[k]。3) 依次类推,第i趟从Data[i]开始,通过 n - i 次比较,从n-i原创 2020-11-20 12:28:37 · 2053 阅读 · 2 评论 -
快速排序 C语言实现
快速排序快速排序(Quick Sort )是由冒泡排序改进而得的。在冒泡排序过程中,只对相邻的两个记录进行比较,因此每次交换两个相邻记录时只能消除一个逆序。 如果能通过两个(不相邻)记录的一次交换,消除多个逆序,则会大大加快排序的速度。快速排序方法中的一次交换可能消除多个逆序。课本上的例子:时间复杂度最好情况:O(nlog2log_2log2n)最坏情况:O(n2n^2n2)平均情况:O(nlog2log_2log2n)空间复杂度O(log2log_2log2n)算法特点:1)记原创 2020-11-19 22:06:22 · 1062 阅读 · 1 评论 -
冒泡排序 C语言
冒泡排序冒泡排序( Bubble Sort)是一种最简单的交换排序方法,它通过两两比较相邻记录的关键字,如果发生逆序,则进行交换,从而使关键字小的记录如气泡一般逐渐往上 “漂浮” (左移),或者使关键字大的记录如石块一样逐渐向下 “坠落”(右移)。算法步骤:(1)设待排序的记录存放在数组Data[1…n]中。首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序(即Data[1].key > Data[2].key),则交换两个记录。然后比较第二个记录和第三个记录的关键字。依次类推,直至原创 2020-11-19 19:16:44 · 534 阅读 · 1 评论 -
希尔排序 C语言实现
希尔排序希尔排序( Shell’s Sort)又称“缩小增量排序”( Diminishing Increment Sort),是插入排序的一种, 因D.L.Shell 于1959 年提出而得名。直接插人排序,当待排序的记录个数较少且待排序序列的关键字基本有序时,效率较高。希尔排序基于以上两点,从“减少记录个数”和“序列基本有序”两个方面对直接插入排序进行了改进。基本思想:先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。原创 2020-11-19 18:37:52 · 1907 阅读 · 0 评论 -
折半插入排序 C语言
折半插入排序 C语言直接插入排序采用顺序查找法查找当前记录在已排好序的序列中的插入位置,这个“查找”操作可利用“折半查找”来实现,由此进行的插人排序称之为折半插入排序( Binary Insertion Sort )。算法步骤:①设待排序的记录存放在数组Data[1…n]中,Data[1]是一个有序序列。② 循环n-1次,每次使用折半查找法,查找Data[ i ] ( i=2,…,n )在已排好序的序列DataI1…i-1]中的插入位置,然后将Data[ i ]插人表长为i-1的有序序列Data[1原创 2020-11-19 17:10:14 · 1790 阅读 · 0 评论 -
直接插入排序 C语言实现
直接插入排序是一种最简单的排序方法,其基本操作是将一条记录插入到已排好序的有序表中,从而得到一个新的、记录数量增1的有序表。算法步骤:(1)设待排序的记录存放在数组Data[1…n]中,Data[1]是一个有序序列。(2)循环n-1次,每次使用顺序查找法,查找Data[ ](i = 2,…,n)在已排好序的序列Data[ 1…i-1 ]中插入位置,然后将Data[i]插人表长为i-1的有序序列Data[ 1…i-1 ],直到将Data[n]插人表长为n-1的有序序列Data[ 1…n-1 ],最后原创 2020-11-19 16:21:03 · 832 阅读 · 0 评论 -
二叉排序树的创建,插入及删除 - C语言
这里的二叉排序树的创建是根据课本上写的,其中掺杂了递归思想,之前的写的二叉树的创建是为非递归的方法https://blog.csdn.net/qq_43402544/article/details/109228383。完整代码如下:#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct//关键字结构体 { int key;//关键字项 int otherinfo;//原创 2020-11-09 22:17:08 · 10072 阅读 · 4 评论 -
线性表的查找 C语言
还是书上的内容。(1)折半查找我这里先写折半查找(又名二分查找),是一种效率较高的查找方法,就是有个前提,查找数据的前提是数据本身是从小到大的有序排列的。只适用于有序表。时间复杂度为:代码如下:int SearchList3(SSTable ST,int key)//折半查找(二分查找),前提必须是从小到大的有序排序 { int mid, low = 1, high = ST.length;//初始化完成 while(low<high) { mid = (low+high原创 2020-11-09 10:44:50 · 2526 阅读 · 2 评论 -
图的关键路径 C语言
还是按照书上给的例子:图的关键路径必须了解的(以下都是自己理解的):(1)AOE-网:带权值的AOV-网。(AOV-网是不带权值且没有回路的有向图)(2)Ve(i):顶点V(i)的最早发生时间。这里开始只知道图的源点Ve(0)的值,初始点顶点Ve(0)为0,Ve(i)的值便是从V(0)开始沿着各种路径到达顶点V(i)的最长路径。例如:图中V(0)有两种路径到达V(4)选择最长的那条,故Ve(4) == 7。(3)Vl(i):顶点V(i)的最迟发生时间。只有求出所有Ve(i)才能开始求Vl(i),这原创 2020-11-08 21:02:45 · 973 阅读 · 1 评论 -
有向图的拓扑排序 C语言
这里使用我随便画的例子:这种用顶点表示活动,用弧表示活动间的优先关系的有向图称为顶点表示活动的网(Activity On Vertex Network),简称AOV-网。按照我的理解是:AOV-网是不带权值且没有回路的有向图。完整代码如下:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MVNum 100 //最大顶点数 #define MAXSIZE 100 //最大栈容量原创 2020-11-04 21:52:43 · 2987 阅读 · 7 评论 -
有向图的最短路径--弗洛伊德算法 C语言
这里有点懵!还是按书上的例子(这里用邻接矩阵表示)完整代码如下:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MaxInt 32767//无穷值设置 #define MVNum 100 //图的最大容量 ,也可以称为图的最大顶点数 void Interrupt(void)//创建一个中断函数 { while(1)//用于检测换行符,使函数脱离scanf的连续输出原创 2020-11-04 19:01:12 · 2497 阅读 · 2 评论 -
图的最短路径--迪杰斯特拉算法 c语言
还是按照书上的例子:完整代码如下:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MaxInt 32767//无穷值设置 #define MVNum 100 //图的最大容量 ,也可以称为图的最大顶点数 void Interrupt(void)//创建一个中断函数 { while(1)//用于检测换行符,使函数脱离scanf的连续输出 if(getchar()=='原创 2020-11-02 22:33:34 · 3770 阅读 · 3 评论 -
图的最小生成树--克鲁斯卡尔算法 C语言
克鲁斯卡尔算法构造最小生成树。还是根据书上的例子进行构造:步骤为(代码用邻接矩阵表示上图):完整代码如下:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MaxInt 32767//无穷值设置 #define MVNum 100 //图的最大容量 ,也可以称为图的最大顶点数 void Interrupt(void)//创建一个中断函数 { while(1)//用于检原创 2020-11-01 22:15:40 · 2782 阅读 · 0 评论 -
图的最小生成树 -普里姆算法 c语言
这里运用邻接矩阵来进行对普里姆算法的实现。还是按照课本上的例子:代码如下:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MaxInt 32767#define MVNum 100 //图的最大容量 ,也可以称为图的最大顶点数 void Interrupt(void)//创建一个中断函数 { while(1)//用于检测换行符,使函数脱离scanf的连续输出 if原创 2020-11-01 16:58:46 · 2423 阅读 · 2 评论 -
图的广度优先搜索遍历 -- c语言
图的广度优先搜索遍历,以我的理解是:先以一个顶点做起点,一层一层的进行输出打印。这里引用书上的一个例子。完整代码如下(邻接表的形式):#include <stdio.h>#include <stdlib.h>#include <string.h>#define MVNum 100 //最大顶点数 //创建一个中断函数 void Interrupt(void)//创建一个中断函数 { while(1)//用于检测换行符,使函数脱离scanf的连续输出原创 2020-10-31 16:36:25 · 4960 阅读 · 2 评论 -
图的深度优先搜索遍历 -- c语言
相比于我之前的邻接矩阵和邻接表的创建知识点多了个深度优先搜索函数。可以在两篇直接增加该函数,便是邻接矩阵或邻接表的深度优先搜索。首先是邻接矩阵的深度优先函数。都是书上的,只是多了几个变量的定义和初始化函数代码如下:bool visited[MVNum];//访问标志数组 ,其初始值为false void InitVisited(bool *visited)//标志数组初始化 { for(int i=0;i<MVNum;i++) visited[i] = false;} int原创 2020-10-30 22:30:31 · 1249 阅读 · 1 评论 -
无向图 邻接多重表的创建 - c语言
并不一定全,但是运行成功了。代码如下:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_VERTEX_NUM 20typedef enum{unvisited,visited} VisitIf;//变量名称转换 typedef struct EBox{ VisitIf mark;//变量mark只能取unvisited和visited;未访问和已访问 int iv原创 2020-10-30 16:50:31 · 865 阅读 · 0 评论 -
有向图 十字链表的创建 - C语言
代码还是要求严格的输入操作,没有判错能力。见谅!代码如下:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_VERTEX_NUM 20void Interrupt(void)//创建一个中断函数 { while(1)//用于检测换行符,使函数脱离scanf的连续输出 if(getchar()=='\n') break;} typedef struct.原创 2020-10-28 22:45:01 · 757 阅读 · 1 评论 -
无向图 邻接表的创建 - C语言
还是书上的。代码运行时的输入操作还是必须要严格进行。完整代码如下:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MVNum 100 //最大顶点数 void Interrupt(void)//创建一个中断函数 { while(1)//用于检测换行符,使函数脱离scanf的连续输出 if(getchar()=='\n') break;} typedef st原创 2020-10-27 22:09:35 · 3827 阅读 · 1 评论 -
图的邻接矩阵--C语言
由于没做输入挑选工作,所以只能按照写对。(无向图)完整代码如下:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MVNum 100void Interrupt(void)//创建一个中断函数 { while(1)//用于检测换行符,使函数脱离scanf的连续输出 if(getchar()=='\n') break;} typedef struct{ ch原创 2020-10-26 22:47:33 · 736 阅读 · 0 评论