自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(45)
  • 收藏
  • 关注

原创 希尔排序——C语言

希尔排序是插入排序的一种更高效的改进版本。希尔排序通过比较相距一定间隔的元素来进行排序,随着算法的进行,这个间隔逐渐减少,直到最后变为1,此时的排序其实就是一次插入排序。

2024-07-13 12:44:30 283

原创 插入排序——C语言

1.对于第一个数来说,一个数无法考虑顺序问题,所以要从第二个数开始进行插入,进行排序。2.排序的思想是:从头开始遍历,如果该数小于一个数,那么该数就插入到较大数的前面。

2024-07-07 22:50:34 383 1

原创 哈希表——C语言

哈希表的核心是哈希函数,哈希函数是一个将输入数据(通常称为“键”或“key”)转换为固定长度的整数的函数。这个整数通常用作哈希表(Hash Table)中的索引,用于快速查找数据。本质上就是根据输入的值确定值的位置。

2024-07-07 22:49:23 433

原创 关键路径——C语言(理论)

关键路径,是项目网络中从起始事件到终止事件的最长路径,决定了项目的最短完成时间。关键路径中的任务没有任何可调整的余地,如果任何一个任务被延迟,整个项目的完成时间也会被延迟。

2024-06-28 00:02:18 883

原创 关键路径——C语言(代码)

然后我们要来计算事件的最早开始和最晚开始时间,首先要遍历每两个事件之间的活动,得到活动的最大值(计算最早开始时间,因为要考虑事件前驱的所有活动都完成):

2024-06-28 00:01:03 363

原创 拓扑排序——C语言

1.计算每个顶点的入度,2.如果入度为 0 ,记录该顶点,输出。3.拿到入度为 0 的顶点,并且把该顶点的边都删除掉。4.重新计算入度,重复第2步,第3步操作。

2024-06-23 21:23:33 436

原创 弗洛伊德算法——C语言

弗洛伊德算法的基本思想是逐步考虑每一个顶点作为中间点,更新所有顶点对之间的最短路径。它通过以下三个步骤实现:

2024-06-16 21:51:34 636

原创 迪杰斯特拉算法——C语言

第一步,先寻找距离最小的顶点,这也是我们找到的第一个顶点,也就是顶点1,因为其他顶点距离一定大于12(未连接的顶点一定大于12,因为需要中转)。第二步,把最近顶点作为中转点(顶点1)标记已访问,遍历其他未访问顶点,更新到顶点0 的距离(将顶点1作为中转点更新距离)。第三步,重复第一步和第二步。

2024-06-11 21:55:16 345

原创 克鲁斯卡尔算法最小生成树--C语言

同样是最小生成树,普利姆算法是从一个起始顶点开始,逐步扩展生成树,每次选择连接生成树和未包含顶点的最小边。而克鲁斯卡尔算法是按权值排序的方式,从最小的边开始逐步添加到生成树中,确保不会形成环,直到生成树包含所有顶点。

2024-06-09 13:28:36 553

原创 普利姆算法最小生成树--C语言

所谓普利姆算法,就是随便取一个点,然后根据已知边的权值大小,去寻找下一个顶点的过程。例如取 0 为起始的最小树。对于 0 来说,权值最小的边是 1,所以我们把顶点 2 也纳入到最小树,在这些已知边中,4 为权值最小的边(以访问的顶点不再访问),所以把顶点 5 纳入到最小树中。

2024-06-09 13:28:11 856

原创 图的创建和BFS,DFS遍历

图是一种用于表示对象及其关系的抽象数据结构,由节点(也称为顶点)和连接节点的边组成。图可以分为有向图(Directed Graph)和无向图(Undirected Graph),以及加权图(Weighted Graph)和非加权图(Unweighted Graph)。

2024-06-07 18:09:36 821

原创 哈夫曼树的创建

1.先找到最小的两个点,构建他们的根节点。2.把这两个点从节点中去除,把他们的根节点加入进来。3.循环这个过程直到只有一个节点。

2024-06-07 18:09:09 588

原创 二维数组传参时不用二级指针接收

先放结论,二维数组数组名指向的类型是 int [x] 类型,int** 指针指向类型是 int* ,如果用二级指针接收会导致访问错误,因为 int [x] 类型和 int* 类型不同。

2024-05-31 22:49:20 1030

原创 平衡二叉树的构建(完整代码)

平衡二叉树就是二叉排序树的一种特殊情况,也就是说我们只需要在构建二叉排序树之后判断是否要执行:RR RL LL LR 操作就可以了。

2024-05-29 23:09:00 472

原创 平衡二叉树的构建(理论,部分函数代码)

平衡二叉树是二叉排序树的一种特殊情况,平衡二叉树(AVL)的特点是:每个节点的左右子树的高度差最多为 1 。那么如何实现左右子树的高度差只有 1 呢?这就需要引出文章的内容:四种操作,让普通排序二叉树变成平衡二叉树。

2024-05-28 11:20:30 676

原创 二叉排序树的创建

二叉排序树就是节点经过排序构建起的二叉树,其有以下性质:1. 若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值。2. 若它的右子树不为空,则右子树上所有节点的值均大于它的根节点的值。3. 它的左、右子树也分别为二叉排序树。

2024-05-25 19:41:57 360

原创 二叉树—先后序线索化和先后序线索遍历

后序遍历,递归操作在线索化之前,也就是说在改变左右孩子之前就已经遍历到目标节点,而先序的问题在于需要靠没有改变的左右节点遍历,但是中途有改变左右孩子的操作,所以遍历可能会出现问题。

2024-05-25 18:55:54 386

原创 二叉树中序线索化和中序线索遍历

既然是中序线索遍历,我们可以先回忆一下普通的中序遍历是怎么进行的

2024-05-22 21:00:01 613

原创 二叉树的前中后序非递归遍历

上个文章是关于二叉树的创建和递归遍历的,关于非递归遍历,我看了很多文章,但还是感觉很抽象,没有套路可循,我也总结出了一些规律帮助理解。

2024-05-20 20:51:34 410

原创 二叉树的创建和遍历

首先说明一下为什么这里是二级指针,而没用struct TreeNode* 类型的函数然后返回,在链表中我们可以那样使用是因为 p->next=XXX,是解引用找到地址来连接起每个节点的,而在二叉树中,如果struct TreeNode* 类型的函数然后返回,首先返回值用不上,其次是一级指针传值调用导致创建失败。

2024-05-16 21:32:31 958

原创 leetcode刷题——设计循环链表

通俗的来解释就是新增了一个节点,当队尾节点两次next后才找到队头节点说明容量满了,当队尾节点一次next后就找到队头节点就说明(队头节点一直出队列甚至把队尾节点出掉)队列空了。

2024-05-11 00:56:12 397

原创 用队列实现栈——leetcode刷题

题目的要求是用两个队列实现栈,首先我们要考虑队列的特点:先入先出,栈的特点:后入先出,所以我们的目标就是如何让先入栈的成员后出栈,后入栈的成员先出栈。

2024-05-05 00:38:51 1011 1

原创 用栈实现队列——leetcode刷题

我们可以把 栈1 理解为队列的真实情况,栈2 只是出队列时寻找队头的工具(负责逆序栈),每次出队列之后都要重新更新 栈1 ,更新队列。

2024-05-02 11:45:29 475

原创 C语言——队列的实现

队列按照先进先出(FIFO,First In First Out)的原则管理数据。这意味着最先进入队列的元素会被最先移出,类似于排队等候服务的情况。队列通常有两个主要操作:入队(enqueue),将元素添加到队列的尾部;出队(dequeue),从队列的头部移除元素。

2024-05-01 18:56:17 610 1

原创 C语言——栈的实现

栈(Stack)是一种基于先进后出(LIFO)原则的数据结构,类似于我们平常堆放书籍或者盘子的方式。栈通常是从高地址向低地址增长的,也就是说,栈顶位于较高的内存地址,而栈底位于较低的内存地址。这种结构通常被称为“向下生长的栈”或者“递减栈”。

2024-04-28 23:21:49 406

原创 双向循环链表(哨兵头节点)

双向循环链表的一大特点就是链表既可以向前找也可以向后找,循环意味着没有结束,这意味着如果遍历链表的指针与phead(哨兵位头节点)相等时链表结束(遍历指针为phead->next)。

2024-04-25 10:41:56 491 2

原创 链表带环问题——leetcode环形链表1 2

链表的带环问题指的是本该指向NULL的最后一个节点指向了之前的节点,导致链表成环,找不到尾结点的情况,那么我们该如何证明链表带环呢?知道了如何判断链表是否有环之后,如何找到入环的节点呢?

2024-04-19 22:37:18 1067 2

原创 链表传一级指针以及leetcode做题有感

上个文章说要传二级指针,经过一段时间的学习之后才知道可以传一级指针:之所以要传二级指针,是要改变一级指针的值,也就是把头节点的指针改变,如果头指针不发生改变,只改变中间链表的成员,那是否可以只传一级指针呢?答案是:可以。

2024-04-17 00:14:40 465

原创 链表的简单实现和为什么要传二级指针

而链表因为不是物理上连续存储的就可以充分利用内存空间,并简化了删除增加方面的操作。简单的来说,链表就是根据地址这条链,将元素串联到一起。例如:每个struct结构体中有两个成员,一个是要存放数据的类型,一个是结构体指针类型。

2024-04-14 12:27:22 1129 1

原创 leetcode刷题——只出现一次的数字123

1.两个相同的数字相异或结果是0(异或是指两个数字的二进制位相同为0,不同为1)2.0和任何数字异或都是那个数字

2024-04-11 21:06:31 556 1

原创 内存开辟函数

malloc函数接受要开辟空间的字节数,如果成功开辟,则返回指向刚开辟的内存空间首地址的指针,否则返回NULL。

2024-04-07 21:12:55 311

原创 文件读写函数

简单来说,就是fopen函数接收文件名和打开模式两个参数(都是字符串类型所以用const char *),返回一种叫流(steam)的东西,即(FILE *类型),打开失败返回空指针。我觉得可以把流理解为文件指针类型,因为感觉和指针很像。

2024-04-07 00:23:53 686

原创 柔性数组---C语言

在柔性数组的定义中:结构体的大小是除柔性数组外其他成员的内存大小之和。(上面的代码是4)柔性数组必须是结构体的最后一个成员。

2024-04-05 14:32:49 266 1

原创 枚举与联合

枚举适用于定义常量命名的,对于如何理解定义常量命名,可以参考 #define,即将100的命名替换成 MAX。这有利于提高代码的可读性。联合是一种特殊的数据类型,允许在同一内存位置存储不同的数据类型。与结构体类似,联合可以包含多个成员,但是在任何给定时间只有一个成员可以拥有值。

2024-04-04 19:04:06 475 1

原创 动态内存管理中的常见错误

动态内存是在程序运行时根据需要动态分配的内存,它在程序的堆(heap)区域中分配。malloc()、calloc() 和 realloc() 函数用于分配动态内存。free() 函数用于释放之前分配的动态内存。

2024-03-30 15:19:56 407 1

原创 结构体传参和空间存储

结构体是一种自定义类型,类似于整形 int ,浮点型 float,我们可以定义一种类型,其中包含我们想要这个类型包含的成员,成员可以是int float 等也可以是 struct XXX类型(这里struct stu叫做自定义类型的名字)。

2024-03-27 19:18:04 338

原创 函数指针和函数指针数组

1.函数指针=函数名,2.函数指针=&函数名,同样既可以用ptr来访问函数,也可以用*ptr来访问函数(我认为可以理解为函数的地址和函数名都可以用来访问函数)。

2024-03-24 21:43:05 417

原创 多级指针的理解与运用

1.*(p+1) = p[1]2.数组名也是首元素的地址,所以如果是一级指针数组,那么数组名就是二级指针(是一级指针的地址(指针)),同理,二级指针数组数组名就是三级指针。3.三级指针解引用得到二级指针,二级指针解引用得到一级指针。

2024-03-21 23:06:34 1086 1

原创 指针数组和数组指针

首先,顾名思义,指针数组是一个数组,其中存放的元素是指针类型,数组指针是一个指针,指向的是一个数组。

2024-03-16 20:11:47 465 1

原创 C语言中的数据存储(截断,整形提升)

1. 截断发生在多字节数据类型的数据放进低字节数据类型的变量中,2. 整形提升后的数据取决于变量的类型是 signed 还是 unsigned 。

2024-03-11 22:10:00 319

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除