- 博客(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语言
第一步,先寻找距离最小的顶点,这也是我们找到的第一个顶点,也就是顶点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
原创 二维数组传参时不用二级指针接收
先放结论,二维数组数组名指向的类型是 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-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
原创 文件读写函数
简单来说,就是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
原创 C语言中的数据存储(截断,整形提升)
1. 截断发生在多字节数据类型的数据放进低字节数据类型的变量中,2. 整形提升后的数据取决于变量的类型是 signed 还是 unsigned 。
2024-03-11 22:10:00
319
空空如也
学习率设置对于损失值的影响
2024-02-15
TA创建的收藏夹 TA关注的收藏夹
TA关注的人