- 博客(25)
- 收藏
- 关注
原创 C语言-数据结构-顺序表和链表的区别
1、头部中部插入删除时间效率低。O(N)2、连续的物理空间,空间不够了以后需要增容.a、增容有一定程度程度消耗。1、不支持随机访问。(用下标访问)意味着:一些排序,二分查找等在这种结构上不适用。需要随机访问结构支持算法可以很好的适用。2、链表存储一个值,同时要存储链接指针,也有一定的消耗。b、为了避免频繁增容,一般我们都按倍数去增。1、任意位置插入删除效率高。严格说,他两是相辅相成的两个结构。2、cpu高速缓存命中率更高。3、cpu高速缓存命中率更低。2、按需申请释放空间。优点:(用下标访问)
2024-04-11 21:24:32 258
原创 C语言-数据结构-带头结点的循环双向链表
当写出了pos插入删除函数之后,头插,头删,尾插,尾删便可以直接进行调用了,来简化函数。带头结点的循环双向链表看似复杂,但 实际结构操作起来要简单许多。
2024-04-11 21:20:55 175
原创 C语言-数据结构-复杂链表复制
因为将复制的节点插入每个节点的后面时,就可以根据被复制的节点的random所指的节点的下一个节点就是复制的节点所应该指向的random节点。每次复制一个节点,就将其插入到被复制的结点的后面,复制完成后,再根据原结点复制random指针,最后拆分链表,还原原链表。函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个。给定的链表为空(空指针),因此返回 null。指针指向下一个节点,还有一个。指针指向链表中的任意节点或者。此题的难点在于对随机对应的赋值。此题运用了一个巧妙的思路。
2024-04-10 21:07:46 184
原创 C语言-数据结构-环形链表二
L = N * C - X ----------> 一个指针从相遇点开始,一个指针从头开始,两个指针一起走,当两个指针相遇时就是环的入口点。思路一:运用快慢指针,slow和fast指针,slow一次走一步,fast一次走两步,一个指针从相遇点开始,一个指针从头开始,两个指针一起走,当两个指针相遇时就是环的入口点。追上相遇的过程中 慢指针走的距离:L+X 快指针走的距离 L + N * C + X (N >= 1) [N是他们相遇之前,fast在环里面走的圈数]如果链表无环,则返回。
2024-04-09 21:04:53 685
原创 C语言-数据结构-环形链表
第二步:随着slow进环,fast已经在环里面走了一段,走了多少跟环的大小有关系假设slow进环的时候,slow跟fast的距离是N,fast开始追slow,slow每次往前走1步,fast往前走2步,每追1次,判断一下相遇每追1次,fast和slow的距离变化:N->N-1->N-2->...->2->1->0。(-1 意味他们之间的距离变成C-1(C是环的长度)如果C-1是奇数,那么就永远追不上了,如果C - 1是偶数,那么就可以追上)快指针先走两步,慢指针先走一步,如果有环,则快慢指针一定会相遇;
2024-04-07 21:38:05 1348
原创 C语言-数据结构-相交链表
先假设A链表为长链表,B链表为短链表,然后判断A链表与B链表的长度,如果A链表长度小于B链表的长度,那就假设错误,将B链表重新改为长链表,A链表重新改为短链表,后面便只要用长链表和短链表来用就行了。因为要考虑到两个链表在相交前有可能长度不一样,所以我们要判断哪个链表长,长多少,让长的链表先走相差的步数,然后在一起走。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。
2024-04-07 21:27:47 1130
原创 C语言-数据结构-链表的回文结构
首先我们运用快慢指针法来找到中间节点,然后翻转后半的链表,最后将后半链表的节点与前半链表的节点进行一一比较。如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。我们将后半链表翻转,再与前半链表进行比较,以此来判断回文结构的链表。此题的思路需巧妙运用到翻转链表的思想,请判断其是否为回文链表。
2024-04-01 23:57:49 182
原创 C语言-数据结构-链表分割
此题思路: 新建两个链表,一个小于x的链表,一个大于等于x的链表,遍历原链表,将小于x的结点插入到小于x的链表中,将大于等于x的结点插入到大于等于x的链表中,最后将两个链表拼接起来。最后用一个新的指针指向小于x的链表,然后释放小于x的链表和大于等于x的链表。在最后要记得将大于等于x的链表的最后一个节点指向空。,请你对链表进行分隔,使得所有。每个分区中各节点的初始相对位置。给你一个链表的头节点。
2024-03-31 22:38:11 307 1
原创 C语言-数据结构-合并两个有序链表
此题思路: 新建一个空链表,将两个链表的节点依次比较,将较小的节点插入到新链表中,直到两个链表都为空。在比较完节点(循环退出后),要判断list1和list2是否有剩余节点直接接在其后面。如果list1为空,则直接返回list2;如果list2为空,则直接返回list1。新链表是通过拼接给定的两个链表的所有节点组成的。要注意先判断list1和list2是否为空。将两个升序链表合并为一个新的。
2024-03-31 22:31:21 315 1
原创 C语言-数据结构-链表中倒数第k个结点
或:快指针先走k-1步,然后快慢指针一起走,当快指针指向链表尾部时,慢指针指向倒数第k个结点。快指针先走k步,然后快慢指针一起走,当快指针为空时,慢指针指向倒数第k个结点。实现一种算法,找出单向链表中倒数第 k 个节点。1->2->3->4->5 和。对于此题,我们用快慢指针法,本题相对原题稍作改动。
2024-03-29 23:25:50 247 1
原创 C语言-数据结构-查找中间节点
快指针走两步,慢指针走一步,当快指针到达链表尾部时,慢指针指向链表的中间结点。该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。如果有两个中间结点,则返回第二个中间结点。,请你找出并返回链表的中间结点。链表只有一个中间结点,值为 3。对于此题,我们采用一个快慢指针法,
2024-03-29 23:20:25 251 1
原创 C语言-数据结构-反转链表
在循环中,我们定义一个指针next来指向cur的下一个指针,然后进行翻转操作,将prev赋值给 cur->next,使cur指向的节点的指向翻转,然后在将cur赋值给prev,next赋值给cur,使他们开始迭代。我们再定义一个指针next用来存放cur指向节点的下一个节点,然后将newhead赋值给cur指向节点的next,再将cur赋值给newhead,将next赋值给cur,使其迭代起来。我们定义一个工作指针cur来指向某个节点,用prev来指向其上一个节点,然后便开始遍历链表。
2024-03-28 23:34:11 242
原创 C语言-数据结构-移除链表元素
如果不是头节点,就将cur上一个节点的next直接指向cur下一个节点,然后释放cur,在将其迭代。此题因为链表为无哨兵位的链表,所以在删除节点时要去判断,要删除的链表是不是头结点。如果是头节点,那么直接将头指针head指向下一个节点,并释放原来的头节点。,请你删除链表中所有满足。给你一个链表的头节点。
2024-03-28 23:15:12 171
原创 C语言-数据结构-单链表的有关指定位置插入删除
如果不是,就需要定义一个工作指针posPrev来存放上一个节点的位置,来解决找pos上一个位置的问题,遍历链表,在找到pos位置后,posPrev便是pos上一个节点的位置,再将新的节点插入到pos的前一个位置上。如果不是,还是需要定义一个prev来存储前一个节点的位置,在遍历链表找到pos位置后,将pos前一个位置的节点prev和pos下一个节点pos->next连上,然后释放pos位置的节点,并将pos位置置空。需要判断pos位置是否是头结点 ,如果是,直接调用头删,关于在指定位置的插入删除操作。
2024-03-27 23:21:23 327
原创 C语言-数据结构-单链表的查找、打印和销毁
运用工作指针cur遍历列表,并在遍历中将cur的下一个节点用next指针进行储存,然后释放cur所指向的指针,再将next赋值给cur,以此循环,最后再将头指针指向空,以防野指针的出现。思路很简单,从头遍历链表,比较每一个节点所存放的数据,是就返回,不是就让工作cur指针往后移一下。打印链表的思路与查找类似,也是用工作指针cur进行链表遍历,并将每一个节点中的data打印出来。与查找算法一样,打印不需要改变链表,所以只需要传一级指针即可。因为查找并不改变链表,所以只要传一维指针就可以了。
2024-03-27 22:58:33 279
原创 C语言-数据结构-单链表的尾插和尾删
若链表有多个节点,我们便需要先找到尾节点,因为在最后我们需要将新的尾结点的next指向空指针(防止指向野指针),我们还需要知道原尾节点的上一个节点,因此,我们可以用两个指针prev和tail来完成,在遍历链表中,先将tail赋给prev,tail再向后移一个节点。若链表为非空,则需要我们先遍历链表,找到尾节点(这里可以用一个tail指针来找),最后将新节点接入尾部tail的next。同链表的尾插一样 ,对于只有一个节点的链表和有多个节点的链表来说,有些区别,因此我们需要进行讨论。
2024-03-26 23:16:46 214
原创 C语言-数据结构-单链表的头插和头删
在删除头结点时,我们需要先将下一个节点用next保存下来(以防止在我们删除头结点后找不到下一个节点,就无法连上链表),再将头结点*pphead用free进行释放,最后将保存的next重新作为新的头结点接入链表头指针。我们应该先处理新节点的指针newNode->next,让它指向头结点,再修改头指针*pphead让它指向我们的新节点。对于无哨兵位的链表,在进行插入删除操作时会修改头指针的值,因此我们应该用二级指针将头指针的地址传进来,这样就可以修改头指针的值了。
2024-03-26 23:00:00 165
原创 C语言-数据结构-单链表的基本结构(不带头的)
我们使用malloc进行对空间的申请,并判断是否申请成功,再将要存放的x放入新建的节点的data中,并将新节点的next指向空指针(这是一个良好的习惯),最后返回所构建的节点。对于节点中要存的数据,可以在之前同意用typedef将根据需求更换需要存放的数据的数据结构统一定义成SLTDataType(当然也可以改成其他的单词表达)它按需申请空间,不用了就释放空间(它更合理的使用了空间),每一个节点都含有一个数据和一个指向下一个节点的地址,但每一个数据都要存一个指针去连接后面的数据节点,
2024-03-26 22:44:36 165
原创 C语言-数据结构-顺序表的在指定位置下插入和删除数据
对于c顺序表的指定位置插入和删除,写出函数后便可将其运用到头插、头删、尾插、尾删中。当完成了在指定位置下插入和删除数据的函数代码时,头删等代码便可简化。因为存在pos位置,所以要考虑pos的越界问题。因为存在pos位置,所以要考虑pos的越界问题。尾删即为在pos为size-1是删除数据。尾插即为在pos为size的位置插入。插入前仍然需要考虑顺序表的容量问题。在插入后,记得要改变size的值。头删即为在pos为0时删除数据。头插即为在pos为0处插入数据。完成删除后要改变size的值。
2024-03-24 23:06:46 198
原创 C语言-数据结构-顺序表的打印、查找和销毁
销毁:(用free释放空间,并将size和capacity都赋值为0,)查找:(当找到了返回x位置下标,没有找到返回-1)将L->a赋值为空指针是为了防止其称为野指针。此为顺序表的简单操作。
2024-03-24 22:56:30 150
原创 C语言-数据结构-顺序表的尾插和尾删
顺序表中的尾插中细节的思考与其头插一样,要考虑顺序表容量问题,因此仍需要检查其容量的函数来判断其容量大小是否足够。对于assert--->需要头文件#include<assert.h> ,条件为真,没事;条件为假,终止程序。顺序表的尾插相对头插要简单,只需要管其最后一个数据,不需要挪动其他数据,但仍需记得要改变size的值。顺序表的尾删也更简单(相比于头删),只需要改变size的值,便达成了尾删。尾删仍需考虑越界问题,一下展示出两种方法判断是否越界。温柔的if判断和暴力的assert判断。
2024-03-24 22:51:31 137
原创 C语言-数据结构-顺序表的头插与头删
对于顺序表的操作,要时刻考虑操作是否越界,可以用assert方式暴力判断,越界,程序运行就直接报错,也可以用if条件判断来不去执行越界操作。在插入前需要检查顺序表中的容量是否够用,因此还要写一个函数来判断当前顺序表的容量是否充足,在一般情况下,顺序表容量的扩大以二倍的方式扩大。头插前要将每个数据都往后挪一下,并且得从最后一个数据开始挪动,防止前面挪动数据后,后面的数据被覆盖。头删时,直接将数据都往前挪动一下,记得要从第二个数据开始挪(第一个是头,要删除的数据)挪动完数据后要记得改变size的值。
2024-03-24 22:42:43 115
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人