- 博客(58)
- 收藏
- 关注
原创 【数据结构】二叉树练习
本文介绍了二叉树相关算法题的C语言实现,包括:1.单值二叉树判断(递归比较节点值);2.相同树判断(同步遍历比较结构);3.对称树判断(镜像比较子树);4.二叉树遍历(前序、中序、后序递归实现,返回数组形式);5.子树判断(递归匹配结构);6.二叉树构建与中序遍历(处理特殊输入格式)。这些算法均采用递归思路,时间复杂度为O(n),涉及树的基本操作和遍历技巧。
2025-08-07 21:27:16
358
原创 【数据结构】二叉树概念及代码
(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。
2025-07-31 17:17:37
274
原创 【数据结构】树的概念
完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K 的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对 应时称之为完全二叉树。:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是 说,如果一个二叉树的层数为K,且结点总数是2^k-1,则它就是满二叉树。6.高度为h的完全二叉树,结点数量的范围是【2^(h-1),2^h-1】2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树。
2025-07-26 15:27:14
346
原创 【数据结构】随机链表的复制(难题)
指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。节点组成,其中每个新节点的值都设为其对应的原节点的值。个节点组成的链表来表示输入/输出中的链表。的链表,每个节点包含一个额外增加的随机指针。,该指针可以指向链表中的任何节点或空节点。那么在复制链表中对应的两个节点。例如,如果原链表中有。返回复制链表的头节点。
2025-07-20 21:08:50
188
原创 【数据结构】单链表练习(有环)
结论:一个指针从相遇点开始走,另一个指针从起始点开始走,他们会在入口点相遇。fast走的路程:L+N*C+X。slow走的路程:L+X。
2025-07-15 18:52:48
290
原创 【数据结构】单链表练习
给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。将两个有序链表合并为一个新的有序链表并返回。现有一链表的头指针 ListNode*
2025-05-27 16:03:33
705
原创 【C语言】宏经典练习题,交换奇偶位
只需要对该二进制位进行按位与01010101即可,而01010101的十六进制数为0x55555555再向前移动一位就可变成偶数位。而偶数位同理,将二进制数与10101010进行按位与操作即可,10101010的十六进制数为0xaaaaaaaa再向后移动一位。奇数位01010101。写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。假设这个数的二进制是11111111。
2025-05-12 14:54:53
282
原创 【C语言】程序的预处理,#define详解
文章主要介绍了C语言中的预处理指令及其应用。首先,通过#define可以定义标识符和宏,标识符用于替换代码中的特定内容,而宏则可以进行简单的条件判断和参数替换。文章还介绍了#和##的用法,#将宏参数转换为字符串,##用于连接两个符号。接着,讨论了宏与函数的优缺点,宏在编译时展开,执行效率高,但可能导致代码膨胀和调试困难。此外,#undef用于移除宏定义。文章还介绍了条件编译,通过#if、#elif、#else和#endif实现选择性编译,并展示了如何判断宏是否定义。最后,提供了两种解决头文件多次包含问题的方
2025-05-11 15:52:19
262
原创 【C语言】单身狗问题or找不同问题用异或来解决
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。有数组的元素是:1,2,3,4,5,1,2,3,4,6。编写一个函数找出这两个只出现一次的数字。只有5和6只出现1次,要找出5和6.
2025-05-10 16:15:32
152
原创 【C语言】文本操作函数fseek、ftell、rewind
重新定位文件指针的位置,使其指向以origin为基准、偏移offset字节的位置。成功返回0,失败返回非零值(通常为-1。
2025-05-01 15:21:37
529
原创 【C语言】文本操作函数fgetc、fputc、fgets、fputs、fprintf、fscanf、fread、fwrite
从文件中读取信息,每次读取一个字符从建盘中输入信息到文件中,每次输入一个字符。
2025-04-23 19:42:20
1072
原创 【C语言】柔性数组
如果我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,并把整个结构体返回给用户。用户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你不能指望用户来发现这个事。所以,如果我们把结构体的内存以及其成员要的内存一次性分配好了,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存也给释放掉。这样柔性数组成员a,相当于获得了100个整型元素的连续空间。连续的内存有益于提高访问速度,也有益于减少内存碎片。第一个好处是:方便内存释放。大小不包括柔性数组的内存。
2025-03-30 16:40:13
195
原创 【C语言】动态内存管理用realloc管理更灵活
在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存地址。要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。由于上述的两种情况,realloc函数的使用就要注意一些。realloc——动态内存空间管理更灵活。
2025-03-16 14:32:55
329
原创 【C语言】动态内存开辟与释放函数malloc和free
所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。(要进行强制类型转化)如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。如果参数ptr指向的空间不是动态开辟的,那free函数的行为是未定义的。如果参数size为0,malloc的行为是标准是未定义的,取决于编译器。这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。如果参数ptr是NULL指针,则函数什么事都不做。如果开辟成功,则返回一个指向开辟好空间的指针。
2025-03-16 13:07:54
230
原创 【C语言】内存操作函数memcpy、memmove、memset(最最最好懂)
memmove( )比 memcpy( )更安全,在目标区域和源区域有重叠的情况下,memmove( )的拷贝确保源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改,但目标区域与源区域没有重叠情况时与memcy( )函数相同。将一块内存区域的每个字节设置为指定的值。memmove——重叠内存的拷贝。模拟实现my_memmove函数。模拟实现my_memcpy函数。memset——内存设置函数。memcpy——内存块复制。从源头指向的内存块拷贝固定。的数据到目标指向的内存块。
2025-03-12 16:27:19
378
原创 【C语言】寻找错误信息用strerror或perror函数(最最最好懂)
相当于perror = printf + strerror。直接打印错误信息,在打印错误信息前会先打印自定义信息。perror——返回错误码对应的错误信息更简单。strerror——返回错误码对应的错误信息。多使用strsrror查bug。把错误码翻译成错误信息。
2025-03-11 19:53:32
334
原创 【C语言】字符串的查找用strstr、strtok(最最最好懂)
返回一个指向haystack中第一次出现needle的指针。如果未找到子字符串,则返回NULL。strstr( )函数用于查找子字符串在主字符串中的第一次出现。自己写my_strstr函数实现字符串查找功能。strstr——字符串的查找。
2025-03-10 19:05:39
286
原创 【C语言】理解函数strncat、strncpy、strncmp使用方法(最最最好懂)
char* strncat(char* dest, const char* src, int n)中n的作用。strncpy函数用于将一个字符串复制到另一个字符串。设置为 5,这样函数最多只会复制 5 个字符到。中,只需要追加其中的一部分。剩余空间只能容纳 5 个字符,那么可以将。的值来控制追加的字符数量。,我们只需要追加前 3 个字符,就可以将。str1>str2 返回大于0的数。str1<str2 返回小于0的数。的剩余空间有限时,使用。结果为abcxxxxxxx。str1=str2 返回0。
2025-03-06 21:15:00
425
原创 【C语言】冒泡排序及使用回调函数方法
运用循环的方法,从左到右相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。一个通过函数指针调用的函数,如果把函数指针(地址)作为参数传递给另一个函数,这个指针被用来调用其指向的函数时,就叫回调函数。用回调函数模拟实现qsort,采用冒泡方式。
2025-02-26 18:25:57
233
原创 【C语言】查找字符串旋转结果(字符串左旋进阶版)两种方法
连用两个arr1,AABCDAABCD在这个字符串里面找是否有arr2。写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。例如:给定s1 = AABCD和s2 = BCDAA,返回1。给定s1 = abcd和s2 = ACBD,返回0.AABCD左旋一个字符得到ABCDA。AABCD左旋两个字符得到BCDAA。AABCD右旋一个字符得到DAABC。
2025-02-25 20:27:34
214
原创 【C语言】理解函数strcat、strcpy、strcmp、strstr使用方法(最最最好懂)
用于追加字符串的函数,即将一个字符串中的内容追加到另一个字符串后面(不会覆盖原字符串内容)。结果为DE(arr1中的ABC被arr2中的DE完全覆盖)比较的是两个字符串中对应位置字符的ASCII值。将一个字符串中的内容拷贝到另一个字符串中(结果为 hello world。比较两个字符串内容的函数。
2025-02-25 18:15:55
350
原创 【C语言】字符串左旋与字符串逆序大同小异
实现一个函数,可以左旋字符串中的k个字符。ABCD左旋一个字符得到BCDA。ABCD左旋两个字符得到CDAB。BA GFEDC 左逆序 右逆序。方法二:部分左旋再整体左旋。CDEFGAB 整体逆序。方法一:利用循环进行左旋。
2025-02-25 17:03:40
197
原创 【C语言】在杨氏矩阵中查找一个数是否存在
杨氏矩阵:有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。可以运用数组,也可以运用指针进行查找。要求:时间复杂度小于O(N);
2025-02-25 16:00:57
143
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅