
C语言
文章平均质量分 85
_周游
老师我太想进步了
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【数据结构】_堆的向上调整和向下调整建堆法
使以该结点为根结点的子树满足小根堆或大根堆特性。,然后调用向上调整方法使其满足大根堆或小根堆特性;原创 2025-02-11 12:07:01 · 474 阅读 · 0 评论 -
【数据结构】_堆排序问题
对于实现堆排序:1、若采用先建堆再排序的方法,则建大根堆实现降序,建小根堆实现升序;(通常不用)(1)这种方式需要调用HPPush方法,HPPush方法内部自行调用AdjustUp方法,并使用HPTop方法获取堆顶元素并逐个pop以实现降序或升序输出;(2)这种方式的空间复杂度为O(N);(较高)2、若采用不建堆直接排序的方法,则建大根堆实现升序,小根堆实现降序;(常用)原创 2025-02-10 14:26:02 · 1444 阅读 · 0 评论 -
【数据结构】_堆的实现
专栏前文中,已经介绍了入堆及向上调整算法,出堆及向下调整算法,详情见下文:实际对于整除运算parent = (child - 1) / 2,parent并不会小于0,但当parent=0时,若a[parent] > a[child],则再次进行child与parent的更新,使得parent与child均为0。当parent=0时,若若a[parent] > a[child],则再次进行child与parent的更新,使得child更新为0,下次则无法进入while循环;原创 2025-02-10 10:32:36 · 998 阅读 · 0 评论 -
【数据结构】_堆的结构及向上、向下调整算法
实际对于整除运算parent = (child - 1) / 2,parent并不会小于0,但当parent=0时,若a[parent] > a[child],则再次进行child与parent的更新,使得parent与child均为0。当parent=0时,若若a[parent] > a[child],则再次进行child与parent的更新,使得child更新为0,下次则无法进入while循环;,删除最后一个结点后,再逐层调整父结点与子结点的大小关系,使其满足小根堆特性;(1)堆是完全二叉树;原创 2025-02-09 11:16:36 · 811 阅读 · 0 评论 -
【数据结构】_树与二叉树
2、除根节点外,其叶结点被分为M(M>0)个互不相交的集合T1,T2,T3...Tm,其中每一个集合Ti(1<=i<=m)又是一棵结构与树类型相似的子树,每棵树的根节点有且仅有一个前驱,可以有0个或多个后继;(11)结点的祖先:从根到该结点所经分支上的所有结点,如A是所有结点的祖先;(8)结点的层次:从根开始定义,根为第一层,根的子结点为第二层,以此类推;:含有子结点的结点,称该结点为其子结点的父结点,如A是B的父结点;:一个结点含有的子树的根节点称为该结点的子结点,如B是A的子结点;原创 2025-02-08 14:28:35 · 1129 阅读 · 0 评论 -
【数据结构】_栈与队列经典算法OJ:栈与队列的互相实现
队列:只允许在一端进行数据的插入操作,在另一端进行数据的删除操作的特殊线性表,队列具有先进先出FIFO(First In First Out)的特点。若top表示栈顶元素的下标,则初始化时(栈内无元素),top=-1,插入时在a[top++]处入栈元素;令要实现的队列入队列5、6,将其入栈到第一个栈,而后将第一个栈视为push栈,仅用于入数据;思路:依次从第一个栈出栈4、3、2,并令其入栈第二个栈,再出栈第一个栈的元素1即可;令第一个栈入栈1、2、3、4四个元素,此时队列要求出队1,但当前栈只能出栈4,原创 2025-02-08 11:28:19 · 1120 阅读 · 0 评论 -
【数据结构】_队列经典算法OJ:循环队列
目录1. 题目描述及链接2. 解题思路2.1 循环队列的设计2.2 关于循环队列的假溢出问题3. 程序注:部分方法实现细节题目链接:622. 设计循环队列 - 力扣(LeetCode)题目描述:设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,原创 2025-02-07 13:02:28 · 774 阅读 · 0 评论 -
【数据结构】_栈与队列经典算法OJ:有效的括号
若top表示栈顶元素的下标,则初始化时(栈内无元素),top=-1,插入时在a[top++]处入栈元素;若top表示栈顶元素的下一个元素的下标,则初始化时top为0,插入时在a[top]处入栈元素。说明字符串中左括号比右括号多,则需对栈是否为空进行判断,若栈不为空,即字符串已遍历完毕,仍然有括号不匹配,返回false;给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。遍历字符串,将左括号入栈,对于右括号则出栈顶的左括号进行匹配。左括号必须以正确的顺序闭合。原创 2025-02-07 09:48:59 · 560 阅读 · 0 评论 -
【数据结构】_队列的结构与实现
队列:只允许在一端进行数据的插入操作,在另一端进行数据的删除操作的特殊线性表,队列具有先进先出FIFO(First In First Out)的特点。(2)若队列仅剩一个元素,按当前无特殊情况处理的方法实现,则pq->ptail未置空,使得其成为野指针,故需对其进行单独处理。注:若采取设有头结点的单链表,可传一级指针,但仍然需传队尾结点指针,仍需要传递两个参数,总体而言依然较为麻烦。若将数组头视为队头,数组尾视为队尾,则插入对应尾插实现方便,但删除对应头删实现麻烦;出队列:进行删除操作的一端称为队头;原创 2025-02-06 13:22:46 · 778 阅读 · 0 评论 -
【数据结构】_栈的结构与实现
若top表示栈顶元素的下标,则初始化时(栈内无元素),top=-1,插入时在a[top++]处入栈元素;若top表示栈顶元素的下一个元素的下标,则初始化时top为0,插入时在a[top]处入栈元素。1、若采用数组实现栈,则可将数组头视为栈底,数组尾视为栈顶,出入栈都在数组尾进行操作。3、若采用双链表实现栈,则无论将哪端视为栈底,出栈、入栈等方法的实现都非常方便;1、栈:一种特殊的线性表,只允许在固定的一端插入和删除数据;2、压栈:栈的插入操作叫做进栈、压栈、入栈。3、出栈:栈的删除操作叫做出栈。原创 2025-02-04 19:44:58 · 457 阅读 · 0 评论 -
【数据结构】_链表经典算法OJ:复杂链表的复制
新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。第三步:从原链表中逐个拆解拷贝结点,将其逐个尾插构成一个新链表,记新链表的第一个结点为copyHead,返回copyHead即可;依次拷贝原链表的每一个结点,将拷贝结点插入在源结点的后面,则random指向的结点与拷贝后的结点对应的相对距离是相同的。第一步:遍历原链表,逐个拷贝结点,并将拷贝结点插入原结点的后面(此步需处理每个结点的next域);返回复制链表的头节点。原创 2025-02-03 09:47:39 · 849 阅读 · 0 评论 -
【数据结构】_链表经典算法OJ:链表判环问题
假设slow进环时,slow与fast距离为N,由于快指针步长为2,慢指针步长为1,则fast追击slow时,二者距离依次减1,则N经N-1、N-2、N-3...2、1、0,即快指针追上慢指针。对于上文得出的,当N为奇数且C为偶数时快指针永远追不上慢指针的情况,可知(x+1)*C必为偶数,N为奇数,则(x+1)*C-N为奇数。② 当C为偶数,C-1为奇数,则快慢指针距离经C-3、C-5...3、1、-1...,即出现快指针将慢指针套圈,-1表示快指针与慢指针的距离变为C-1,此时快指针永远无法追上慢指针。原创 2025-02-02 12:30:40 · 992 阅读 · 0 评论 -
【数据结构】_链表经典算法OJ:相交链表
由于需定位到两个链表的尾结点,故循环判断条件应为curNodeX->next而非curNodeX,但当遍历至尾结点时不进入循环,如果将链表长度变量lenX初始值设为0,就会导致链表长度计算少算了尾结点,故而在设定链表长度变量lenX时,将其初始值均设为1;为两个链表分别创建结构体指针curNodeA和curNodeB,用第二个链表的每一个结点依次把第一个链表的所有结点都比一遍,直至交点结点处会相等;注:两个指针不可同时走,若相交结点前两个链表长度不同,则会导致即使相交也被判定为不相交的情况;原创 2025-02-02 12:20:48 · 912 阅读 · 0 评论 -
【数据结构】_链表经典算法OJ(力扣/牛客第二弹)
新创建一个数组,遍历单链表,依次将链表的结点值记录到数组中,假设计得链表结点数为n,结点值分别记录到数组下标0~n-1的位置,返回下标为n-k的数组元素值即可;遍历单链表计数,假设计得链表结点数为n,倒数第k个元素即正数第n-k个元素,再遍历返回第n-k个结点的值即可;对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。创建两个指针,一个指针指向链表第一个结点,称为慢指针;第三步:创建两个指针,一个指向链表第一个结点,一个指向链表的中间结点,两个同时向后走;原创 2025-02-01 12:12:26 · 1280 阅读 · 0 评论 -
【数据结构】_时间复杂度相关OJ(力扣版)
对于N个元素向右轮转k个位置的轮转,先将前n-k个逆置,再将后k个逆置,最后再整体逆置,即可达到预期轮转效果。因为异或与顺序无关,存在的数字都异或了两次,最终结果都是0(同0异1),只有那个0—N之间存在然而数组中不存在的数字经过两次异或后结果为1,这个数就是缺失的数字。若不考虑轮转的周期性,则时间复杂度为O(K*N),(准确为O(K*(N-1)))最坏的情况为k%N==N-1(量级为N),故时间复杂度为O(N^2);最好的情况为旋转N的倍数次,即k%N==0,相当于没有旋转;真实旋转次数为k%=N,原创 2025-02-01 09:35:29 · 938 阅读 · 0 评论 -
【数据结构】_复杂度
strstr函数功能:在str1中查找str2;② 查找的最坏情况为查找区间只剩一个数或没找到,即 N/2/2/.../2=1,假设查找了x次,即2^x=N,求得最坏情况为O(log N) ,故时间复杂度为O(log N);二分查找用于有序数组的查找,查找区间变化为N -> N/2 -> N/2/2 -> N/2/2/2 -> ... -> N/2/2/.../2。时间复杂度准确函数式式F(N) = N-1+N-2+...+2+1=((N-1+1)*(N-1))/2=(N*(N-1))/2;原创 2025-01-31 21:19:38 · 1372 阅读 · 0 评论 -
【数据结构】_C语言实现带头双向循环链表
本文介绍带头双向循环链表(简称双链表)。原创 2025-01-31 13:05:06 · 1504 阅读 · 0 评论 -
【数据结构】_链表经典算法OJ:分割链表(力扣—中等)
(4)注意由于哨兵位并不存放实际有效的值,故大链表链接到小链表尾部时,实际链接的大链表第一个结点是greaterHead->next;(5)考虑特殊情况,若原链表为空,则大小链表仅有哨兵位,即greaterHead->next为NULL,lessTail->next也为NULL,直接返回NULL即可。给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。当curNode的val值大于给定的X时,将该结点尾插后释放该结点;原创 2025-01-27 13:55:09 · 1413 阅读 · 0 评论 -
【数据结构】_链表经典算法OJ:环形链表的约瑟夫问题
创建计数变量count对应遍历的结点,每遍历一个结点则count自增1。为了销毁curNode且保证环形链表的链接,还需记录curNode的前驱结点,记为prevCurNode,每销毁当前的curNode,就令prevCurNode->next=curNode->next;由于只求最后一个留下的人的编号,故最后一轮时,整个环形链表只剩一个结点。(1)关于创建环形链表的返回值问题,由于要求的m为未知数,故对于每一个遍历的结点都需保留其前驱结点。从编号为 1 的人开始报数,报到 m 的人离开。原创 2025-01-27 10:56:06 · 541 阅读 · 0 评论 -
【数据结构】_链表经典算法OJ:合并两个有序链表
(4)考虑特殊情况:链表1为空或链表2为空时,根据当前代码逻辑,l1或l2其中一个为NULL,则newTail为空,若执行newTail->next会导致对空指针的解引用,故需单独讨论处理。(3)直至对链表1或链表2完成遍历,即l1或l2为空,则此时将不为空的链表后续的若干结点直接拼接到新链表的newTail之后即可。(1)由于需要依次对比两链表结点的大小值,故创建两个指针变量l1与l2分别用于指向链表1和链表2的当前比较的结点。且需返回新链表的头结点,故需创建指针变量newTail指向新链表的尾结点。原创 2025-01-26 13:11:07 · 540 阅读 · 0 评论 -
【数据结构】_链表经典算法OJ(力扣版)
4、考虑特殊情况及相应处理:(1)原链表为空:即head=NULL,导致curNode=NULL,不会进入第一个while循环,但在newTail->next=NULL 时会导致空指针解引用操作,出现错误。故需对newTail是否为空进行单独讨论处理。(2)新链表为空:即原链表所有结点数据域的值都等于val,导致newTail->next=NULL 时会导致空指针解引用操作,出现错误。同(1):需对newTail是否为空进行单独讨论处理。处理逻辑为:原创 2025-01-26 11:08:19 · 1530 阅读 · 0 评论 -
【数据结构】_以单链表为例分析各种方法实现的特殊情况考虑思路
对于每一种方法的具体实现,都不能仅简单考虑链表具有多个结点的情况,对于空链表等特殊情况都需特殊情况特殊分析,才能保证不出现空指针解引用等情况。现以某几个方法为例,分析特殊情况的考虑思路。原创 2025-01-25 11:53:57 · 1229 阅读 · 0 评论 -
【数据结构】_以SLTPushBack(尾插)为例理解单链表的二级指针传参
但对于部分方法如尾插、头插、任意位置前插入、任意位置前删除的相关实现,其形参均采用了二级结构体指针类型。本文以尾插为例,分析单链表的二级指针传参方法的实现逻辑。原创 2025-01-25 11:16:27 · 988 阅读 · 0 评论 -
【数据结构】_C语言实现不带头非循环单向链表
本文介绍链表;基于顺序表的特点,思考改善方案:按需申请释放空间,不再将数据存储于连续的一整块空间中,而是需要一个数据开辟一个小空间。为了方便访问数据,首先创建一个头指针(头结点)指向存放第一个数据的内存位置处,而在该位置处,除了存储该数据本身,再分配一块空间用于存放下一个数据的地址,直至某位置存放的下一个位置的指针为空则数据截止。同时,这种存储方式也有效地提高了插入删除数据时的效率,无需再大量挪动数据。这种数据结构就称为链表。原创 2025-01-24 20:46:04 · 570 阅读 · 0 评论 -
【数据结构】_顺序表经典算法OJ(力扣版)
若src指向的值不为val,则令nums[dst]=nums[src],并令src++,dst++;创建两个变量l1和l2分别用于从后往前依次遍历数组num1和num2,初始时l1和l2分别指向数组num1和num2最后一个有效元素。给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。比较num[l1]与num[l2],将较大的赋值给num1[l3],并令其指向的位置前移,直至l2指向位置越出num2界限;原创 2025-01-24 12:49:49 · 1087 阅读 · 0 评论 -
【数据结构】_基于顺序表实现通讯录
int age;}peoInfo;原创 2025-01-23 15:31:43 · 1167 阅读 · 0 评论 -
【数据结构】_顺序表
线性表是n个具有相同特性的数据元素的有限序列。常见的线性表有:顺序表、链表、栈、队列、字符串等;。线性表在物理上存储时,通常以数组和链式结构的形式存储,分别称之为顺序表和链表。本文介绍顺序表。原创 2025-01-22 20:24:16 · 886 阅读 · 0 评论 -
【C语言】_柔性数组
称之为柔性数组成员;原创 2025-01-22 11:18:50 · 673 阅读 · 0 评论 -
【C语言】_动态内存笔试题
2、在main函数内部,strcpy函数实现"hello world"字符串向str(空指针)指向空间的拷贝,会对str指针变量进行解引用,从而导致对空指针的解引用。将getmemory函数设计为返回类型为char*,并在main函数中使用str接收,从而实现str指向动态开辟的空间;free(str),即释放了str指向的空间,但并未释放变量str所占空间,故str≠NULL,但str为野指针。程序逻辑没有问题,二级指针p接收str地址,*p实现令str指向开辟的空间。存在问题:没有free;原创 2025-01-21 14:23:55 · 1085 阅读 · 0 评论 -
【C语言】_常见动态内存错误
关于动态内存,已介绍4个动态内存管理函数,详见下文:【C语言】_4个动态内存管理函数-优快云博客本文列举常见的动态内存错误;原创 2025-01-21 12:29:59 · 1157 阅读 · 0 评论 -
【C语言】_4个动态内存管理函数
取决于编译器;4、malloc函数声明在。原创 2025-01-20 12:35:05 · 1042 阅读 · 0 评论 -
【C语言】_自定义类型:枚举
常见自定义类型:结构体、联合体\共同体、枚举;已介绍结构体,相关文章链接:【C语言】_结构体的声明及传参问题-优快云博客https://blog.youkuaiyun.com/m0_63299495/article/details/145224494。原创 2025-01-20 10:15:32 · 1021 阅读 · 0 评论 -
【C语言】_自定义类型:联合体
若采用纯结构体作为商品的自定义类型,则由于特殊属性的存在须在结构体内包含所有商品所需的所有属性,造成一定空间浪费;假设当前有图书、杯子、衬衫三种商品,对于每种商品都有库存量、价格、商品类型属性;对于每一个商品,它只属于一种商品类型,故而一种商品只会有一组特殊属性;先列出公共属性,将各商品的特殊属性设计为结构体,再作为联合体的成员变量。unionUn2大小至少为14,且须为4的整数倍,故大小为16;unionUn1大小至少为5,且须为4的整数倍,故大小为8;1、联合体的大小至少是最大成员的大小;原创 2025-01-19 15:15:01 · 1310 阅读 · 0 评论 -
【C语言】_结构体实现位段
charb:4;charc:5;chard:4;q.a=10;q.b=12;q.c=3;q.d=4;return0;运行结果如下:分析如下:写出10、12、3、4的二进制序列,并根据位段限制进行截断:structB{int_a:2;int_b:5;return0;原创 2025-01-19 13:48:36 · 850 阅读 · 0 评论 -
【C语言】_结构体的内存对齐
charc1;inti;charc2;测试其大小:内存分布如下:charc1;charc2;inti;原创 2025-01-19 10:42:49 · 830 阅读 · 0 评论 -
【C语言】_结构体的声明及传参问题
结构是一些值的集合,这些值称为成员变量。结构体的每个成员可以是不同类型的变量;原创 2025-01-18 15:18:57 · 467 阅读 · 0 评论 -
【C语言】_内存设置函数memset与内存比较函数memcmp
【代码】【C语言】_内存设置函数memset与内存比较函数memcmp。原创 2025-01-18 11:11:02 · 425 阅读 · 0 评论 -
【C语言】_内存拷贝函数memcpy与memmove
3、memcpy虽然为内存拷贝函数,但使用时。原创 2025-01-17 15:23:22 · 1456 阅读 · 0 评论 -
【C语言】_字符串函数strtok与strerror
2、strtok函数的第一个参数str不为NULL时:函数从str首部开始查询,找到str中的第一个分割字符,并保存它在字符串中的位置;,只是程序启动时,errno为0,表⽰没有错误。3、若strtok函数的第一个参数str为NULL时,函数将在同一个字符串中。的错误码,存放在errno中,每⼀个错误码的整数对应一组错误信息。,并返回一个指向这个分片的指针,且保存下一个分片的首地址();,并返回一个指向这个分片的指针,且保存下一个分片的首地址();1、由于strtok函数找到str中的一个分割字符后,会。原创 2025-01-17 11:14:47 · 756 阅读 · 0 评论 -
【C语言】_字符串查找函数strstr
注:关于上文strstr函数的模拟实现,还有很大优化空间,包括但不限于KMP算法,本篇仅实现简单的匹配功能,暂不考虑效率。(2)待匹配字符串str2需逐字符在str1中进行对应查找匹配,将用于遍历str2的指针变量记为s2,类型为char*;(3)str2需与str1中的字符逐字符进行匹配,需设遍历str1的指针变量,记为s1,类型为char*;(1)返回值为第一次匹配的str2在str1中的位置,记为cur,类型为char*;strstr函数功能:在str1中查找str2;若未找到,则返回空指针;原创 2025-01-16 14:25:53 · 351 阅读 · 0 评论