C语言数据结构练习
文章平均质量分 50
学习练习
XYLoveBarbecue
中科院研究生在读,未来想当技术大佬~~~
展开
-
八种排序算法(C语言)
各种排序在各种情况下的时间复杂度和空间复杂度,以及稳定性原创 2024-08-14 10:51:10 · 949 阅读 · 0 评论 -
归并排序(递归与非递归实现,C语言)
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有 序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。1. 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。2. 时间复杂度:O(N*logN)3. 空间复杂度:O(N)原创 2024-08-14 10:46:20 · 297 阅读 · 0 评论 -
计数排序(C语言)
思想:计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。操作步骤: 1. 统计相同元素出现次数 2. 根据统计的结果将序列回收到原来的序列中。1. 计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。2. 时间复杂度:O(MAX(N,范围))3. 空间复杂度:O(范围)原创 2024-08-14 10:31:07 · 155 阅读 · 0 评论 -
快速排序(三种方法,非递归快排,C语言)
快速排序的思想:任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右 子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。原创 2024-08-14 10:23:28 · 211 阅读 · 0 评论 -
堆排序(C语言)
【代码】堆排序(C语言)原创 2024-08-14 10:01:51 · 133 阅读 · 0 评论 -
选择排序(C语言)以及选择排序优化
【代码】选择排序(C语言)以及选择排序优化。原创 2024-08-14 09:59:21 · 153 阅读 · 0 评论 -
冒泡排序(C语言)
【代码】冒泡排序(C语言)原创 2024-08-14 09:56:29 · 453 阅读 · 0 评论 -
希尔排序( 缩小增量排序 )(C语言)
希尔排序的特性总结: 1. 希尔排序是对直接插入排序的优化。2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就 会很快。3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些书中给出的 希尔排序的时间复杂度都不固定。希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个 组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工 作。原创 2024-08-14 09:55:13 · 178 阅读 · 0 评论 -
直接插入排序(C语言)
【代码】直接插入排序(C语言)原创 2024-08-14 09:48:01 · 150 阅读 · 0 评论 -
二叉树遍历_牛客网(根据前序遍历) C语言
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。原创 2024-08-04 20:32:32 · 345 阅读 · 0 评论 -
平衡二叉树 - 力扣(LeetCode) C语言
(点击前面链接即可查看题目)给定一个二叉树,判断它是否是是指该树所有节点的左右子树的深度相差不超过 1。原创 2024-08-04 19:56:09 · 483 阅读 · 0 评论 -
另一棵树的子树 - 力扣(LeetCode)C语言
给你两棵二叉树root和subRoot。检验root中是否包含和subRoot具有相同结构和节点值的子树。如果存在,返回true;否则,返回false。二叉树tree的一棵子树包括tree的某个节点和这个节点的所有后代节点。tree也可以看做它自身的一棵子树。原创 2024-08-04 19:37:13 · 379 阅读 · 0 评论 -
对称二叉树 - 力扣(LeetCode)C语言
首先先看是不是空树,空树也是对称的返回true,然后他才有子树q,p,q,p都为空返回true,两个有一个为空一个不为空,返回fasle,两个子树的根(q,p)不相等。返回false,此时到这个两个根(q,p)都相同,要看他们的左右子树是不是继续相等,所以一个传q->left和->right。另一个传q->right和p->left。(点击前面链接即可查看题目)给你一个二叉树的根节点。, 检查它是否轴对称。原创 2024-08-04 18:29:08 · 329 阅读 · 0 评论 -
相同的树 - 力扣(LeetCode)C语言
(点击前面链接即可查看题目)原创 2024-08-04 18:09:36 · 211 阅读 · 0 评论 -
翻转二叉树 - 力扣(LeetCode)C语言
给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。原创 2024-08-04 17:37:09 · 389 阅读 · 0 评论 -
二叉树的最大深度 - 力扣(LeetCode)C语言
求一个根的最大深度,就是求其孩子的最大深度,依次往下找,找到NULL,返回0,是指从根节点到最远叶子节点的最长路径上的节点数。看看这个根左边深还是右边深,返回更深的就可以。(点击前面链接即可查看)原创 2024-08-04 17:28:16 · 431 阅读 · 0 评论 -
单值二叉树 - 力扣(LeetCode)C语言
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回true;否则返回false。原创 2024-08-04 17:14:22 · 366 阅读 · 0 评论 -
二叉树的前序遍历 - 力扣(LeetCode)C语言
注:本题中returnSize,指的是二叉树的结点数,返回的必须是malloc开辟的。递归算法很简单,你可以通过迭代算法完成吗?原创 2024-08-03 18:27:52 · 402 阅读 · 0 评论 -
二叉树的实现 c语言
// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树// 二叉树销毁// 二叉树节点个数// 二叉树叶子节点个数// 二叉树第k层节点个数// 二叉树查找值为x的节点// 二叉树前序遍历// 二叉树中序遍历// 二叉树后序遍// 层序遍历// 判断二叉树是否是完全二叉树原创 2024-08-03 17:21:21 · 341 阅读 · 0 评论 -
二叉树节点问题
n0 + n1 + n2 = n 和 0*n0 + 1*n2 + 2*n2 = n - 1。设 度为0的结点有n0, 度为1的结点有n1, 度为2的结点有n2,一共有个结点,则有n-1条边。设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为( )个。可以得到 n2 = n0 - 1 = 2 所以一共有3+8+2 = 13个结点。原创 2024-08-01 21:40:26 · 151 阅读 · 0 评论 -
树与二叉树
树是一种非线性的数据结构,,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。(1)有一个特殊的结点,称为根结点,根节点没有前驱结点(2)除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1原创 2024-08-01 21:14:40 · 576 阅读 · 0 评论 -
堆的实现-向上调整算法-向下调整算法-堆排序-TopK问题 C语言
注意:循环条件不可写parent > 0。原创 2024-08-02 02:27:45 · 241 阅读 · 0 评论 -
设计循环队列 - 力扣(LeetCode)C语言
(点击前面链接即可查看)一、题目设计你的循环队列实现。循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。FrontReardeQueue()isEmpty()isFull()// 设置长度为 3// 返回 true。原创 2024-07-31 17:51:07 · 326 阅读 · 0 评论 -
C语言 实现栈(顺序表)和队列(链表)
实现栈唯一要注意的就是初始化栈的top值,若top = -1;有元素时top指向最后一个元素.若top = 0;有元素时top指向最后一个元素的下一个位置.原创 2024-07-31 17:17:09 · 207 阅读 · 0 评论 -
用栈实现队列 - 力扣(LeetCode)C语言
栈先进后出,队列先进先出,那么可以让一个栈只负责进队列,另一个栈只负责出队列即可,因为要出队列时,将进队列栈的值放入到出队列栈之中(相当于把进队列栈的值放着放进去了,刚好符合出队列顺序)队列:1 2 3 4 5 进队列栈此时为: 空 出队列栈为: (底)5 4 3 2 1 (顶)队列:1 2 3 4 5 进队列栈此时为: (底)1 2 3 4 5 (顶) 出队列栈为空。A在进队列栈:要先将出队列栈清空,再将进队列栈放入出队列栈.然后一直pop到A。原创 2024-07-31 16:31:30 · 454 阅读 · 0 评论 -
用队列实现栈 - 力扣(LeetCode) C语言
栈是先进后出,队列是先进先出,那么我们只需要保持一个队列是空的,当栈进元素时,进到非空队列的队尾,栈出元素时,将非空队列的元素进入到空队列直到,非空队列剩余一个元素,将这个元素pop,就完成了出栈,此时非空队列变为空队列,空队列变为非空队列.请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(注:代码110之后为本题求解, 110行之前为队列实现;// 返回 False。原创 2024-07-31 16:01:04 · 300 阅读 · 0 评论 -
有效的括号 - 力扣(LeetCode)C语言(栈实现)
遍历字符串,将遇到右括号之前的全部放入栈,然后将栈顶元素与字符串进行比较,若不匹配,直接return false,反之继续遍历.注: 代码75函数 isvaild 是判断括号是否匹配的函数,75行以前为栈(使用顺序表构造),判断字符串是否有效。原创 2024-07-31 15:13:09 · 295 阅读 · 0 评论 -
循环双向带头链表
此部分函数内注释的代码均为不使用任意位置插入、删除的函数。原创 2024-07-30 01:04:34 · 120 阅读 · 0 评论 -
(详细)删除链表中重复的结点-牛客网 C语音
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5数据范围:链表长度满足 0≤n≤1000 0≤n≤1000 ,链表中的值满足 1≤val≤1000 1≤val≤1000进阶:空间复杂度 O(n) O(n) ,时间复杂度 O(n) O(n)原创 2024-07-29 21:58:55 · 355 阅读 · 0 评论 -
对链表进行插入排序 - 力扣(LeetCode)C语言
将链表排序可引入哨兵位,这样可以减少考虑空指针问题,先将第一个放入哨兵位后,然后将剩余的结点依次去和哨兵位后的比较大小,如果哨兵后面不存在比原链表还大的值,那么直接尾插在哨兵所在链表的尾部,其余总是可以找到比原链表值大的结点,插入到前面即可.原创 2024-07-29 19:22:40 · 197 阅读 · 0 评论 -
随机链表的复制 - 力扣(LeetCode)C语言
指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。节点组成,其中每个新节点的值都设为其对应的原节点的值。个节点组成的链表来表示输入/输出中的链表。的链表,每个节点包含一个额外增加的随机指针。,该指针可以指向链表中的任何节点或空节点。那么在复制链表中对应的两个节点。(点击前方链接即可查看题目)例如,如果原链表中有。返回复制链表的头节点。原创 2024-07-29 16:05:13 · 383 阅读 · 0 评论 -
环形链表 II - 力扣(LeetCode)C语言
一、解法一一、解法一看完判断有环之后,就只剩下寻找环的第一个结点: (C为圆环长度)fast和slow在环相遇时,slow走了L+X, fast走了L+nC+X(n >= 1, 因为环可能大可能小, 若为大环, fast追击一圈即可追上slow, 若为小环,slow还没有进环时,fast已经转了好几圈了)因为slow走一步,fast走两步,所以距离关系如下:化简得:即:其中: (C-X) 是相遇时未走完一圈的剩余路程, 所以将slow重新从head走到环的第一个结点时,原创 2024-07-29 14:20:57 · 304 阅读 · 0 评论 -
环形链表 - 力扣(LeetCode) C语言
结论:fast为一次两步一定可以追上,但是fast>2步时,不一定能追上,如果第一次错过以后,此时的距离为C-1 (C为环长),C为奇数就追不上了,C为偶数就可以追上。原创 2024-07-29 12:53:30 · 310 阅读 · 0 评论 -
相交链表 - 力扣(LeetCode)C语言
先分别求出两个链表的长度,长链表比短链表多k个结点,先让长链表走k个结点,此时她们的剩余链表长度相等,此时同时向后走,走到第一个相同的地址,就是相交的第一个结点.两个链表相交,那么尾结点必然相同,反之,尾结点不相同,必然不相交.原创 2024-07-28 23:27:02 · 219 阅读 · 0 评论 -
链表的回文结构 C语言
先找到中间结点, 也就是3,然后反转3->2->1,但是要注意标红的。->3原创 2024-07-28 00:03:03 · 125 阅读 · 0 评论 -
链表分割 C语言
( 点击前面链接即可查看题目)原创 2024-07-27 23:38:50 · 261 阅读 · 0 评论 -
合并两个有序链表 - 力扣(LeetCode)C语言
合并两个有序链表 - 力扣(LeetCode)( 点击前面链接即可查看题目)原创 2024-07-27 22:54:52 · 198 阅读 · 0 评论 -
链表的中间结点 - 力扣(LeetCode)C语言
链表的中间结点 - 力扣(LeetCode)原创 2024-07-27 21:52:30 · 283 阅读 · 0 评论 -
返回倒数第 k 个节点 - 力扣(LeetCode)C语言
【代码】返回倒数第 k 个节点 - 力扣(LeetCode)原创 2024-07-23 23:38:08 · 332 阅读 · 0 评论 -
反转链表 - 力扣(LeetCode)C语言
【代码】反转链表 - 力扣(LeetCode)原创 2024-07-23 23:09:21 · 416 阅读 · 0 评论