C语言
any_ways
这个作者很懒,什么都没留下…
展开
-
数据结构之红黑树的生成、添加以及删除详解(附代码)
要了解红黑树,那必须得了解它的。原创 2022-12-28 19:53:27 · 1444 阅读 · 1 评论 -
数据结构之二叉排序树的生成以及增删改查(C语言的实现)
定义:二叉排序树或是空树,或是满足如下性质的二叉树:1,若其左子树非空,则左子树上所有的结点的值均小于根结点的值;2,若其右子树非空,则右子树上所有的结点的值均大于等于根结点的值;3,其左右子树本身又各是一棵二叉排序树例如:这就是一棵二叉排序树,左子树小于根结点,右子树大于等于根结点,再比如下面:这就不是一个二叉排序树了,因为左子树上面的48大于根结点45二叉排序树的特点:中序遍历下面二叉排序树得到的结果是:3 12 24 37 45 53 61 78 9原创 2022-06-02 12:25:10 · 3823 阅读 · 5 评论 -
有向无环图的应用之拓扑排序(C语言)
有向无环图:无环的有向图,简称DAG图(Directed Acycline Gragh),不存在回路有向无环图常用来描述一个工程或系统的进行过程.(通常把计划,施工,生产,程序流程等当成是一个工程)一个工程可以分为若干个子工程,只要完成了这些子工程(活动),就可以使整个工程完成.AOV网:用一个有向图表示一个工程的各子工程及其相互制约的关系,其中以顶点表示活动,弧表示活动之间的优先制约关系,称这种有向图为顶点表示活动的网,简称AOV网(Activity on Vertex network)原创 2022-05-22 09:47:05 · 1444 阅读 · 0 评论 -
最短路径之Floyd(弗洛伊德)算法,以及显示完整路径
简介:Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。我的上一篇文章讲的dijjstra算法,是图中某一个顶点,到其它顶点之间的最短路径.时间复杂度为O(n2),是单源最短路径而Floyd算法,是图中每一个顶点,到其它顶点之间的最短路径.时间复杂度为O(n3).也被称为多源最短路径问题.算法思想:1,逐个顶点试探2原创 2022-05-20 12:23:15 · 6311 阅读 · 5 评论 -
图的最短路径之(迪克斯特拉)Dijkstra算法代码实现
一,Dijkstra算法1,初始化:先找出从源V0到各终点Vk的直达路径(V0,Vk),即通过一条弧到达的路径.如果一条弧不能到达的点记为 无穷大2,选择:从这些路径中找出一条长度最短的路径(V0,U).3,更新:然后从其余各条路径进行适当调整:若在图中存在弧(U,Vk),且(V0,U) + (U,Vk) < (V0,Vk),则以路径(V0,U,Vk)代替(V0,Vk)4,在调整后的各条路径中,再找长度最短的路径(依此类推).具体的操作为:1,把V(顶点)分成两组:..原创 2022-05-15 13:50:16 · 2921 阅读 · 0 评论 -
数据结构之生成树,最小生成树,普里姆(Prim)算法与克鲁斯卡尔(Kruskal)算法,以及C语言的实现
一,生成树生成树:所有顶点均由边连接在一起,但不存在回路的图.一个图可以有许多棵不同的生成树,所有生成树具有以下共同特点:1,生成树的顶点个数与图的顶点个数相同;2,生成树是图的极小连通子图,去掉一条边则非连通;3,一个有n个顶点的连通图的生成树有n-1条边;4,在生成树中再加一条边必然形成回路;5,生成树中任意两个顶点间的路径是唯一的;6,含n个顶点n-1条边的图不一定是生成树.用深度优先遍历无向图,而得到的生成树称为深度优先生成树用广度优先遍历无向图,而得到的生成原创 2022-05-08 22:51:03 · 2498 阅读 · 0 评论 -
图的遍历(深度优先遍历DFS,广度优先遍历BFS)以及C语言的实现
遍历的定义:从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算.一:深度优先遍历(DFS)1,在访问图中某一起始顶点V后,由V出发,访问它的任一邻接顶点W12,再从W1出发,访问与W1邻接但还未被访问过的顶点W2;3,然后再从W2出发,进行类似的访问......4,如此进行下去,直至到达所有的邻接顶点都被访问过的顶点U为止.5,接着,退回一步,退到前一次刚访问过的顶点,看是否还有其它没有被访问过的邻接点6,如原创 2022-05-01 17:28:16 · 24932 阅读 · 7 评论 -
数据结构 图的存储结构(邻接矩阵,邻接表,十字链表,邻接多重表)的实现
图的逻辑结构是多对多,所以图没有顺序存储结构,但可以借助二维数组来表示元素间的关系,这就是数组表示法(邻接矩阵)链式存储结构:可以用多重链表(邻接表,邻接多重表,十字链表)来表示重点:邻接矩阵(数组)表示法 和 邻接表(链式)表示法一:数组(邻接矩阵)表示法1,先建立一个顶点表(记录各个顶点的信息)和一个邻接矩阵(表示各个顶点之间的关系).顶点表是一个一维数组Vexs[n]无向图邻接矩阵是一个二维数组arcs[n][n],如果两个顶点间有边相连,那么arcs[n][n] = 1,否则原创 2022-04-27 12:10:46 · 4942 阅读 · 0 评论 -
哈夫曼树详解及其应用(哈夫曼编码)
一,哈夫曼树的基本概念路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的路径结点的路径长度:两结点之间路径上的分支数树的路径长度:从树根到每一个结点的路径长度之和.记作:TL权(weight):将树中结点赋给一个有着某种含义的数值,则这个数值秒针为该结点的权结点的带权路径长度:从根结点到该结点之间的路径长度与该结点的权的乘积.树的带权路径长度:树中所有叶子结点的带权路径长度之和.记作:WPL(Weighted Path Length)哈夫曼树:最优树(带权路径长度(WP原创 2022-04-22 20:09:37 · 22328 阅读 · 8 评论 -
树和森林,树的存储结构
一,定义树的定义:树是n(n>=0)个结点的有限集.若n = 0,称为空树;若n > 0 则:1,有且仅有一个特定的称为根的结点,2,其余结点可分为m(m>=0)个互不相交的有限集T1,T2,T3.....,Tm,森林的定义:是m(m>=0)棵互不相交的树的集合.二,树的存储结构1:双亲表示法实现:定义结构数组,存放树的结点,每个结点含两个域,数据域(存放结点本身信息),双亲域(指示本结点的双亲结点在数组中的位置)双亲域-1表示根结点,B,C,D的双亲原创 2022-04-15 16:36:10 · 1193 阅读 · 0 评论 -
二叉树的一些常用方法(求结点数,叶子数,深度,复制,打印)
下面介绍一下,二叉树的一些常用方法,结合前面写的二叉树的创建和遍历,那么二叉树的基本知识也就差不多了#include <stdio.h>#include <stdlib.h>#define MAXSIZE 10#include <string.h>typedef struct BinaryTree{ char data; struct BinaryTree* lchild; struct BinaryTree* rchild;}B原创 2022-04-12 12:18:14 · 2565 阅读 · 0 评论 -
二叉树的创建以及先序,中序,后序递归法遍历,普通循环遍历
一:创建既然有先序法遍历,那应该也有先序法创建.二叉链的数据模型是:typedef struct BinaryTree{ char data;struct BinaryTree* lchild;struct BinaryTree* rchild;}BT;下面就用二叉链的数据类型,创建一个二叉树...原创 2022-04-10 18:02:38 · 2816 阅读 · 2 评论 -
二叉树的性质和存储结构
定义:二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树性质1:在二叉树的第i层上最多有2^i-1个结点(i>=1)这个不用多说,满二叉树,第一层1个结点,第二层2个结点,第三层4个性质2:深度为K的二叉树最多有(2^k)-1个结点(k>=1),最少K个结点这个就是.原创 2022-04-09 17:57:02 · 555 阅读 · 0 评论 -
广义表的创建和操作(C语言)
定义:广义表是n(n≥0)个元素a1,a2,…,ai,…,an的有限序列。其中:①ai--或者是原子或者是一个广义表。②广义表通常记作:Ls=( a1,a2,…,ai,…,an)。③Ls是广义表的名字,n为它的长度。④若ai是广义表,则称它为Ls的子表。注意:①广义表通常用圆括号括起来,用逗号分隔其中的元素。②为了区分原子和广义表,书写时用大写字母表示广义表,用小写字母表示原子。③若广义表Ls非空(n≥1),则al是Ls的表头,其余元素组成的表(a2,a3,…,a原创 2022-04-08 23:01:24 · 3162 阅读 · 2 评论 -
数据结构之压缩矩阵(三角矩阵,对角矩阵,稀疏式矩阵)
1,三角矩阵是对称矩阵的一种,对称矩阵的最大特点就是a[m][n] = a[n][m]那既然是这样,我们在内存中,就没有必要把这个矩阵全部保存,只要保存一半就可以了,余下的一半就用a[m][n] = a[n][m],来表示,这样就节省下来一半的内存.那么这个三角矩阵在内存中是怎么存储的呢我们看到这个是有规律的,第一行1个元素,第二行2个元素,第N行就用N个元素那么我们就可以计算出,在内存中的位置是:i*(i-1)/2+j-12,对角矩阵(带状矩阵)在一般的矩阵中,数据全部..原创 2022-04-05 15:58:25 · 3591 阅读 · 0 评论 -
字符串匹配之BF算法和KMP算法(看不懂算我输),j = next(j)的原理
网上关于这个算法,五花八门,看得我是眼花瞭乱,脑抽筋,都说包会,可能是我确实脑细胞不够用,各种版本看了一整天,通过自己的理解和实践,总结出我这种小白都能理解的方法来,以供我以后忘记了,还能通过看一遍就能理解首先先来一断BF暴力穷举法:#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){ char Primary[100] = "abcdabccabcbabca";原创 2022-04-04 17:34:43 · 510 阅读 · 0 评论 -
队列的顺序结构和链结构的实现和操作
1,顺序结构的队列队列的特点,只能在尾部进入,头部出去,所以也叫做first in first out 简称FIFO结构这个我们也称之为循环对列,就是当头指针或者尾指针,在插入元素或删除元素时,如果自身的位置就在下标为n-1处,那么它们插入元素或删除元素后,下标+1时,就会回到队列的起点,下标变成0#include <stdio.h>#include <stdlib.h>#define MAXSIZE 10typedef struct SequenceQueue/原创 2022-04-02 17:30:45 · 1450 阅读 · 0 评论 -
栈的顺序结构和链结构的实现和操作
一,栈的顺序结构的实现利用结构体的成员来定义栈的底部指针和顶部指针,以及栈的大小#include <stdio.h>#include <stdlib.h>#define MAX(X,Y) (X>Y?X:Y)#define MAXSIZE 10typedef struct Sq//创建栈的结构体{ int* top;//栈顶 int* base;//栈底 int sz;//栈的大小}Sq;void Creat_stack(Sq* p原创 2022-04-01 21:29:04 · 352 阅读 · 0 评论 -
顺序表和链表的归并,归并排序
1,顺序表的归并#include <stdio.h>#include <stdlib.h>#define MAX(X,Y) (X>Y?X:Y)#define MAXSIZE 10typedef struct List//创建一个顺序表类型{ int arr[MAXSIZE]; int size;}List;int check(int a, List*b)//检查顺序表里是否包含某个整型{ int i = 0; for(i =原创 2022-03-30 23:00:17 · 1528 阅读 · 0 评论 -
单循环链表和双向循环链表
循环链表就是普通的单链表,最后一个元素存的地址本来是NULL,现在改成头结点的地址,从而形成循环.#include <stdio.h>#include <stdlib.h>#define MAX(X,Y) (X>Y?X:Y)#include <math.h>//尾部插入法创建一个包含5个元素的循环链表,从一个开始元素依次插入到头部typedef struct S//创建一个链表元素{ int data;//数据域 struct S*原创 2022-03-28 20:47:08 · 1932 阅读 · 0 评论 -
创建一个链表
1,用头部插入法创建一个链表:#include <stdio.h>#include <stdlib.h>#define MAX(X,Y) (X>Y?X:Y)#include <math.h>//头部插入法创建一个包含5个元素的链表,从最后一个元素开始依次插入到头部typedef struct S//创建一个链表元素{ int data;//数据域 struct S* p;//地址域,指向下一个元素的地址}S;int main()原创 2022-03-27 17:02:14 · 4396 阅读 · 0 评论 -
动态内存管理 malloc calloc realloc
malloc(size_t size):向内存空间申请指定大小的内存,并把该申请的内存以指针的形式返回#include <stdio.h>#include <stdlib.h>#define MAX(X,Y) (X>Y?X:Y)#include <math.h>struct S{ int a; char* b;};int main(){ struct S* ps = malloc(sizeof(struct S));//原创 2022-03-25 19:30:44 · 1311 阅读 · 0 评论 -
C语言 扫雷游戏 可以递归展开空白处
初学C语言十多天,写个扫雷游戏,查找自身不足main.c#include <stdio.h>#include <stdlib.h>#include <string.h>#include "game.h"void game(void){ char game_board[ROWS][COLS] = {'*'};//定义玩家显示的面板 int mine_board[ROWS][COLS] = {0}; //定义雷的信息的面板原创 2022-03-24 15:37:50 · 1697 阅读 · 0 评论 -
结构体,位段,枚举,联合体 内存分布浅解
1:结构体#include <stdio.h>#include <stdlib.h>#include <string.h>//系统默认对齐数为8,成员对齐数和默认对齐数,取较小值//总的字节数必须为最大对齐数的整数倍struct A{ int a; // 对齐数为4(位置顺序必须为4的倍数才能放) char b;//对齐数为1(位置顺序必须为1的倍数才能放) int c;//c的位置本来应该是5,但5不是4的倍数,所以不行原创 2022-03-22 13:02:09 · 414 阅读 · 0 评论 -
my memcpy 编写,解决复制过程中覆盖问题
#include <stdio.h>#include <stdlib.h>#include <string.h>void* my_memcopy(void* dest, void* rct, size_t num){ void* ret = dest; while(num--) { if(rct > dest) { *(char*)dest = *(char*)rct; .原创 2022-03-21 17:31:37 · 148 阅读 · 0 评论 -
字符串旋转算法
1,普通算法:#include <stdio.h>#include <stdlib.h>#include <string.h>void rotate_str(char* arr, int sz, int k){ while(k>0) //循环一次旋转一个字符 { int i = 0; char tmp = arr[0];//保存首字符 for(i = 0; i<sz-1;i++)原创 2022-03-19 20:43:51 · 233 阅读 · 0 评论 -
sizeof 看看你都对了吗
int main(){ int arr[3][4] = {0}; printf("%d\n",sizeof(arr)); printf("%d\n",sizeof(arr+1)); printf("%d\n",sizeof(*(arr+1))); printf("%d\n",sizeof(arr[0])); printf("%d\n",sizeof(arr[0]+1)); printf("%d\n",sizeof(arr[0][0])); .原创 2022-03-19 10:11:41 · 69 阅读 · 0 评论 -
通用型冒泡排序
#include <stdio.h>#include <stdlib.h>#include <string.h>int cmp(void* e1, void* e2) //比较两个元素的大小函数{ if(*(char*)e1 - *(char*)e2 > 0) //这个cmp函数要自己写,只要把(char*)换成你传入的要比较 //的数.原创 2022-03-19 09:25:26 · 261 阅读 · 0 评论 -
指针类型表达式
int* p; 指向整形的指针变量p p是指针变量,int*是指针类型char* str;指向字符的指针变量,也是字符串的表达形式float* p和double* p 这些都是比较简单的指针指针数组和数组指针:指针数组: 是一个数组->存放指针的数组int a = 1;int b = 2;int c = 3;int* arr[3] = {&a,&b,&c};数组指针:是一个指针,指针指向一个数组的地址int arr[3] = {1,2,3原创 2022-03-16 20:53:35 · 644 阅读 · 0 评论 -
小数在内存中的存储
大家都知道,整数在内存中的存储,就是把整数转换成16进制,存放在相应的位置,但是float,double类型的存储是以完全不同的方式存储的,以下是存储方式:(32位操作系统)(-1)^x * e * 2^yx y+127 e -10 00000000 00000000000000000000000(32bit二进制)第一位:(-1)^0,当第一位是0时,表示正数,当第一位是1时,表示是负数中间8bit,表示无符号:y...原创 2022-03-14 21:04:46 · 1088 阅读 · 0 评论 -
关于函数传参调用函数,栈是怎么工作的
用一段比较简单的代码来演示一下:#include <stdio.h>#include <stdlib.h>#include "game.h"int sum(int x,int y){ int z = 0; z = x + y; return z;}int main(){ int a = 10; int b = 20; int ret = 0; ret = sum(a,b); printf("%d",r原创 2022-03-10 21:56:03 · 253 阅读 · 0 评论 -
简单三子棋小游戏
main.c#include <stdio.h>#include <stdlib.h>#include "game.h"void menu(){ printf("****************************************************\n"); printf("*************1.开始游戏 0.退出游戏**************\n"); printf("*******************原创 2022-03-09 13:59:41 · 4868 阅读 · 0 评论 -
C语言 冒泡排序优化
#include <stdio.h>#include <stdlib.h>#define MAX(X,Y) (X>Y?X:Y)#include <math.h>int main(){ int arra[10] = {1,2,3,4,5,6,7,8,9,10}; int i = 0; int j = 0; int len = sizeof(arra)/sizeof(arra[0]); for(i = 0;i <.原创 2022-03-08 13:39:26 · 1067 阅读 · 0 评论 -
C语言 汉诺塔
新手可以理解的汉诺塔原创 2022-03-07 18:12:57 · 361 阅读 · 0 评论 -
二分法查找算法,容易出错的地方
#include <stdio.h>#include <stdlib.h>#define MAX(X,Y) (X>Y?X:Y)#include <math.h>int binary(int s, int arr[]){ int len = sizeof(arra)/sizeof(arra[0]);//计算数组长度 int left_index = 0; int right_index = len -1; while...原创 2022-03-05 22:52:52 · 310 阅读 · 0 评论 -
C语言 猜数字小游戏
#include <stdio.h>#include <stdlib.h>#define MAX(X,Y) (X>Y?X:Y)#include <math.h>void start(){ int out = 0; int num = rand()%100; int again = 0; while(1) { printf("猜数字游戏:请输入一个你猜的数字:>"); scanf("%d"..原创 2022-03-05 20:11:20 · 3424 阅读 · 0 评论 -
求素数代码优化版
第一种:最普通的#include <stdio.h>#include <stdlib.h>#define MAX(X,Y) (X>Y?X:Y)int main(){ int m = 0; int n = 0; for(m=100;m<=200;m++) { for(n=2;n<m;n++) { if(m%n==0) break;原创 2022-03-04 22:18:51 · 116 阅读 · 0 评论 -
C语言函数结束后,关于栈的问题
书上说,函数结束出栈后,栈里面存的变量和数据,会全部销毁但是我感觉这应该只是逻辑上面的销毁,只是把栈顶标记SP改动,从低位变动到高位.并不是物理销毁.原来的数据还是存在的,至少在主函数再次引用函数之前数据还是存在的.#include <stdio.h>#include <stdlib.h>#define MAX(X,Y) (X>Y?X:Y)int* i = 0;int show(){ int a[] = {1,2,3}; printf("%d",原创 2022-03-04 19:43:35 · 789 阅读 · 0 评论 -
C语言创建结构体
#include <stdio.h>#include <stdlib.h>#define MAX(X,Y) (X>Y?X:Y)struct Person{ char name[20]; short age;};int main(){ struct Person b1 = {"xiaoming", 15}; struct Person* pb = &b1; //创建指针变量 printf("%d\n",pb->..原创 2022-03-03 22:23:56 · 966 阅读 · 0 评论