自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(69)
  • 收藏
  • 关注

原创 【数据结构】二叉树经典算法题和选择题

后序遍历最后的结点是根结点,在中序遍历中,根结点左边是左子树,右边是右子树(只有b),在后序遍历中c在dec中排最后,所以c是右子树的根结点,再从中序遍历中看c,c的左边是左子树d,右边是右子树e,所以选D。证明上述性质: 假设⼀个⼆叉树有 a 个度为2的节点, b 个度为1的节点, c 个叶节点(二叉树的结点只有三种情况:度为0,1,2),则这个⼆叉树的边数是 2a+b。该完全⼆叉树的前序序列为( )1.某⼆叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该⼆叉树中的叶⼦结点数为( )

2025-12-27 14:37:40 698

原创 【数据结构】实现二叉树

设⼆叉树的根结点所在层数为1,层序遍历就是从所在⼆叉树的根结点出发,⾸先访问第⼀层的树根结点,然后从左到右访问第2层上的结点,接着是第三层的结点,以此类推,⾃上⽽下,⾃左⾄右逐层访问树的结点的过程就是层序遍历。通常的⽅法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别⽤来给出该结点左孩⼦和右孩⼦所在的链结点的存储地址, 其结构如下:。根结点的左⼦树和右⼦树分别⼜是由⼦树结点、⼦树结点的左⼦树、⼦树结点的右⼦树组成的,因此⼆叉树定义是递归式的,后序链式⼆叉树的操作中基本都是按照该概念实现的。

2025-12-25 20:03:49 836

原创 【数据结构】栈和队列及相关算法题

栈:⼀种特殊的线性表,其只允许在固定的⼀端进⾏插⼊和删除元素操作。概念:只允许在⼀端进⾏插⼊数据操作,在另⼀端进⾏删除数据操作的特殊线性表,队列具有先进先出FIFO(FirstInFirstOut)思路:如果是左括号就入栈,如果是右括号就取栈顶元素看是否匹配,若匹配成功,左括号出栈,继续查看下一个字符。出栈:把不为空的队列中前size-1个数据挪到另一个队列,再将最后一个数据出队列(此时相当于出栈)出队列:popST不为空直接出,否则将pushST中的数据先倒过去,再出数据。出栈:栈的删除操作叫做出栈。

2025-12-23 18:52:46 1801

原创 【数据结构】双向链表

链表的结构⾮常多样,以下情况组合起来就有8种(2x2x2)链表结构:链表说明:在后面讲解单链表时,有时候会表述为“头结点”,这个称呼只是为了方便大家理解。实际上单链表中把第一个结点称为头结点是错误的,只有“头结点”是哨兵位时才被称为头结点虽然有这么多的链表的结构,但是我们实际中最常⽤还是两种结构:单链表和双向带头循环链表1.⽆头单向⾮循环链表(单链表):结构简单,⼀般不会单独⽤来存数据。实际中更多是作为其他数据结构的⼦结构,如哈希桶、图的邻接表等等。另外这种结构在笔试⾯试中出现很多。

2025-11-10 17:11:15 828

原创 【数据结构】单链表的经典算法题

假设: 环的周⻓为C,头结点到slow结点的⻓度为L,slow⾛⼀步,fast⾛三步,当slow指针⼊环后, slow和fast指针在环中开始进⾏追逐,假设此时fast指针已经绕环x周。由于慢指针⾛⼀步,快指针要⾛三步,因此得出: 3 * 慢指针路程 = 快指针路程 ,即: 3L = L + C − N+ xC,所以2L = (x + 1)C − N。极端情况下,假设n=1,此时: L=R-X 即:⼀个指针从链表起始位置运⾏,⼀个指针从相遇点位置绕环,每次都⾛⼀步,两个指针最终会在⼊⼝点的位置相遇。

2025-11-10 17:10:13 1380

原创 【数据结构】单链表及单链表的实现

图中指针变量plist保存的是第⼀个结点的地址,我们称plist此时“指向”第⼀个结点,如果我们希望 plist“指向”第⼆个结点时,只需要修改plist保存的内容为0x0012FFA0。当我们想要保存⼀个整型数据时,实际是向操作系统申请了⼀块内存,这个内存不仅要保存整型数据,也需要保存下⼀个结点的地址(当下⼀个结点为空时保存的地址为空)。链表中每个结点都是独⽴申请的(即需要插⼊数据时才去申请⼀块结点的空间),我们需要通过指针 变量来保存下⼀个结点位置才能从当前结点找到下⼀个结点。

2025-11-08 17:24:08 946

原创 【数据结构】顺序表

因为连续的增容会让程序效率低下,成倍的增加空间,能够有效降低增容的次数,虽然存在空间的浪费,但是不会太多。l1先越界,此时nums1数组的元素已经放到正确的位置,但是nums2的数据还没放完,直接放到数组前面。思路一:申请新数组,遍历原数组,将不为val的值依次放入新数组中,再将新数组中的数据导入原数组中。思路一:创建新数组,遍历原数组,将不重复数据导入原数组中,再将新数组中的数据导入原数组中。顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝。• 增容需要申请新空间,拷⻉数据,释放旧空间。

2025-10-16 21:21:15 679

原创 【数据结构】一篇文章覆盖所有面试和笔试会考到的时间和空间复杂度相关知识!

数据结构(DataStructure)是计算机存储、组织数据的⽅式,指相互之间存在⼀种或多种特定关系的数据元素的集合。c语言中学过的数组就是一种数据结构,没有⼀种数据结构有所有⽤途,所以我们要学各式各样的数据结构, 如:线性表、树、图、哈希等。

2025-10-15 21:49:55 1078

原创 【易错题】C语言精品练习题,让你少走许多弯路!

指针的数组传递给子函数变为指针的指针,也就是二级指针。但是允许中括号写法,写成char **arr、char *arr[]、char * arr[5]都可。所以BD正确。

2025-10-14 07:30:00 592

原创 【C语言入门级教学】预处理详解(点击进来学习或重温超多知识点!)

许多C的编译器提供了⼀种能⼒,允许在命令⾏中定义符号。⽤于启动编译过程。例如:当我们根据同⼀个源⽂件要编译出⼀个程序的不同版本的时候,这个特性有点⽤处。(假定某个程序中声明了⼀个某个⻓度的数组,如果机器内存有限,我们需要⼀个很⼩的数组,但是另外⼀个 机器内存⼤些,我们需要⼀个数组能够⼤些。for(i = 0;i< SZ;i< SZ;//linux 环境演⽰。

2025-10-13 08:00:00 1575

原创 【C语言入门级教学】预处理(预定义符号和#define等)详解!

C语⾔设置了⼀些预定义符号,可以直接使⽤,预定义符号也是在预处理期间处理的。__FILE__ //进⾏编译的源⽂件__LINE__ //⽂件当前的⾏号__DATE__ //⽂件被编译的⽇期__TIME__ //⽂件被编译的时间__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义预定义符号在预处理阶段处理例如一个叫test.c的文件,它在预处理阶段就会将预定义符号直接替换成对应的内容在预处理阶段将“name”替换成“stuff例如。

2025-10-13 07:00:00 1748

原创 【C语言入门级教学】编译和链接

我们在 test.c ⽂件中每⼀次使⽤ Add 函数和 g_val 的时候必须确切的知道 Add 和 g_val 的地 址,但是由于每个⽂件是单独编译的,在编译器编译 test.c 的时候并不知道 Add 函数和 g_val 变量的地址,所以暂时把调⽤ Add 的指令的⽬标地址和 g_val 的地址搁置。前⾯我们⾮常简洁的讲解了⼀个C的程序是如何编译和链接,到最终⽣成可执⾏程序的过程,其实很多内部的细节⽆法展开讲解。• 处理#include预编译指令,将包含的头⽂件的内容插⼊到该预编译指令的位置。

2025-10-07 20:25:40 1262

原创 【C语言入门级教学】⽂件的随机读写和文件缓冲区

功能根据⽂件指针的位置和偏移量来定位⽂件指针(⽂件内容的光标参数FILE * stream:指向已打开文件的指针,类型为FILE*。long int offset:表示移动的字节数,类型为long。int origin:起始位置,指定偏移量的基准位置,​ 常见选项包括:​SEEK_SET:从文件开头开始计算偏移量。​SEEK_CUR:从当前位置开始计算偏移量。​SEEK_END:从文件末尾开始计算偏移量。返回值成功时:返回0,表示文件指针位置已成功调整。失败时:返回非零值(如-1。

2025-10-07 17:07:32 1915

原创 【C语言入门级教学】⽂件的顺序读写

上⾯说的适⽤于所有输⼊流⼀般指适⽤于标准输⼊流和其他输⼊流(如⽂件输⼊流);所有输出流⼀般指适⽤于标准输出流和其他输出流(如⽂件输出流)。

2025-09-27 13:10:38 1189

原创 【C语言入门级教学】文件操作

文件存储在电脑的磁盘(硬盘)上。在程序设计中,我们⼀般谈的⽂件有两种:程序⽂件、数据⽂件(从⽂件功能的⻆度来分类的)。

2025-09-26 07:15:00 1564

原创 【C语言入门级教学】柔性数组

第三个好处是:这样有利于访问速度. 连续的内存有益于提⾼访问速度,也有益于减少内存碎⽚。第二个好处是:malloc使用的次数越多,申请的多个空间之间有缝隙(也就是内存碎片)会越多,而内存碎片不可用,导致内存使用率不高。第⼀个好处是:⽅便内存释放,因为只使用了一次malloc函数,只需要释放一次,malloc使用的次数越多,越容易出错。C99中,结构体中的最后⼀个元素允许是未知⼤⼩的数组,这就叫做『柔性数组』成员。• 包含柔性数组成员的结构⽤malloc()函数进⾏内存的动态分配,并且。

2025-09-25 07:00:00 1165

原创 【C语言入门级教学】动态内存管理(图文并茂)

栈区(stack):在执⾏函数时,函数内局部变量的存储单元都可以在栈上创建,函数执⾏结束时这些存储单元⾃动被释放。栈内存分配运算内置于处理器的指令集中,效率很⾼,但是分配的内存容量有限。栈区主要存放运⾏函数⽽分配的局部变量、函数参数、返回数据、返回地址等。堆区(heap):⼀般由程序员分配释放,若程序员不释放,程序结束时可能由OS(操作系统)回收。分配⽅式类似于链表。数据段(静态区):(static)存放全局变量、静态数据。程序结束后由系统释放。

2025-09-24 07:00:00 2028

原创 【C语言入门级教学】联合体和枚举

所以我们就可以把公共属性单独写出来,剩余属于各种商品本⾝的属性使⽤联合体起来,这样就可以介绍所需的内存空间,⼀定程度上节省了内存。上述的结构其实设计的很简单,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。⽐如,我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐较严格。

2025-09-22 07:15:00 1430

原创 【C语言入门级教学】结构体实现位段

位段的声明和结构是类似的,有两个不同:位段的成员必须是 int、unsigned int 或signed int ,在C99中位段成员的类型也可以选择其他整型家族类型,比如char(ASCII码值是整数)。位段的成员名后边有⼀个冒号和⼀个数字。struct A//可以用下划线开头//数字表示这个成员要占用的比特位的数量int _a:2;int _b:5;int _c:10;int _d:30;A就是⼀个位段类型。那位段A所占内存的⼤⼩是多少?

2025-09-21 07:30:00 1758

原创 【数据结构基础】函数栈帧的创建与销毁,看懂直接通透!!!

我们在写C语言代码的时候,经常会把一个独立的功能抽象为函数,所以C程序是以函数为基本单位的。那函数是如何调用的?函数的返回值又是如何传回的?函数参数是如何传递的?这些问题都和函数栈帧有关系。函数参数和函数返回值临时变量(包括函数的非静态的局部变量以及编译器自动生产的其他临时变量)保存上下文信息(包括在函数调用前后需要保持不变的寄存器)栈(stack)是现代计算机程序里最为重要的概念之一,几乎每一个程序都使用了栈,没有栈就没有函数,没有局部变量,也就没有我们如今看到的所有的计算机语言。

2025-09-20 15:20:44 1463

原创 【C语言入门级教学】结构体类型的声明,结构体内存对齐,结构体传参

4.如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。如果传递⼀个结构体对象的时候,结构体过⼤,参数压栈的的系统开销⽐较⼤,所以会导致性能的下降。仔细分析,其实是不⾏的,因为⼀个结构体中包含自己又包含一个变量,这样结构体变量的⼤⼩就会⽆穷的⼤(包含的变量比自己大),是不合理的。原因:因为Node是对前⾯的匿名结构体类型的重命名产⽣的,但是在匿名结构体内部提前使⽤Node类型来创建成员变量,这是不⾏的。

2025-09-19 18:18:55 1844

原创 【C语言入门级教学】数据在内存中的存储

其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为⼤端字节序存储和⼩端字节序存储,下⾯是具体的概念:⼤端(存储)模式: 是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存在内存的低地址处,调试时大端字节序就是字节就是按顺序存储⼩端(存储)模式: 是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处,调试时小端字节序就是字节就是按倒序存储。

2025-09-09 20:40:26 1097

原创 【C语言入门级教学】内存函数

因为目标空间和源头空间重复,给arr[4]拷贝时arr[2]已经被拷贝为1了,所以arr[4]会被拷贝现在arr[2]的值,那怎么解决这个问题呢,可以用memmove函数(但是vs编译器的memcpy可以拷贝重叠空间,属于超额完成任务)value:要设置的值,函数将会把value值转换成unsigned char的数据进行设置的,也就是以字节为单位来设置内存块的。ptr:指针,指向要设置的内存空间,存放了要设置的内存空间的起始地址。• 从源头指向的内存块拷贝固定字节数的数据到目标指向的内存块。

2025-09-08 17:03:40 1450

原创 【C语言】猜凶手(题目很有趣)

真话值为1,假话值为0,所以((a!= 1) == 3) && (a + b + c + d == 1)日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。现在请根据这些信息,写一个程序来确定到底谁是凶手。分析:谁是凶手谁是1,所以a+b+c+d=1。已知3个人说了真话,1个人说的是假话。

2025-09-08 07:00:00 238

原创 【C语言】找单身狗2

例如1 2 3 4 1 2,异或完的结果应该是3^4得到的111,那么随便找一位就行了。例如找最低位,那么这一位是1的有1 3 1,是0的有2 4 2,由于是利用异或结果为1的某一位分的组,所以两个待查询数字一定分别在两组中。那么如果有两个数字都只出现了一次,那么如此得到的应该是两个数异或的结果。解析:找出一个只出现过一次的数字的问题处理方法就是找一个数字把里面所有的数字都异或一遍,利用异或两次等于没异或的特点来处理。有数组的元素是:1,2,3,4,5,1,2,3,4,6。

2025-09-07 22:40:21 226

原创 【C语言】杨氏矩阵

有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。要求:时间复杂度小于O(N);

2025-09-07 01:00:00 417

原创 【c++】缺省参数

在调⽤该函数时,如果没有指定实参则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。• 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值,• 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。• 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。也就是说函数声明给了缺省值,定义里就不用再写出缺省值了。依次连续缺省,不能间隔跳跃给缺省值。• 带缺省参数的函数调⽤,依次给实参,不能跳跃给实参。C++规定半缺省参数必须。

2025-09-06 08:15:00 363

原创 【c++】函数重载

C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同(可以是参数个数不同或者类型不同),这样C++函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同名函数的。

2025-09-06 08:00:00 1496

原创 【c++】c++输入和输出的简单介绍

• 使⽤C++输⼊输出更⽅便,不需要像printf/scanf输⼊输出时那样,需要⼿动指定格式,C++的输⼊输出可以⾃动识别变量类型(本质是通过函数重载实现的),其实最重要的是 C++的流能更好的⽀持⾃定义类型对象的输⼊输出。• cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要通过命名空间的使⽤⽅式去⽤他们。• 是InputOutputStream的缩写,是标准的输⼊、输出流库,定义了标准的输⼊、输出对象。

2025-09-05 20:57:58 222

原创 【c++】c++第一课:命名空间

• 定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。• namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不在冲突了• C++中域有函数局部域,全局域,命名空间域,类域;

2025-09-05 20:51:14 1977 1

原创 【C语言入门级教学】strncpy、strncat、strncmp、strstr、strtok、strerror、perror函数

• strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。:⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。• 如果source指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾。• strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标记。

2025-09-02 23:22:22 1747

原创 【C语言入门级教学】字符函数、strlen、strcpy、strcat、strcmp等函数

序言:在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了 ⼀系列库函数,接下来我们就学习⼀下这些函数。

2025-09-02 08:00:00 1078

原创 【C语言入门级教学】指针运算一些笔试题解析

(2) 逗号表达式作为一个整体,它的值为最后一个表达式(也即表达式n)的值。(1) 逗号表达式的运算过程为:从左往右逐个计算表达式。3.%d — 按照10进制的形式,打印有符号的整数。(3) 逗号运算符的优先级别在所有运算符中最低。表达式1,表达式2,表达式3,…1.随着数组下标的增长,地址是从低到高变化的。%d认为内存中存放的是有符号整数的补码。指针±是跳过指针指向的类型的字节数。%p — 按照16进制形式打印地址。%p认为内存中存放的补码就是地址。2.小地址-大地址==负数。

2025-09-01 08:00:00 205

原创 【C语言入门级教学】数组和指针一些笔试题解析

1. sizeof(数组名),这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩。2. &数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址.3. 除此之外所有的数组名都表⽰⾸元素的地址。char *p数组示意图。

2025-08-31 08:00:00 296

原创 【C语言入门级教学】回调函数和qsort函数

如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数时,被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应。当我们说"一个元素的地址"时,实际上是指这个元素在内存中起始位置的地址,也就是它的第一个字节的地址。功能:可以把调⽤的函数的地址以参数的形式传递过去,使⽤函数指针接收,函数指针指向什么函数就调⽤什么函数,这⾥其实使⽤的就是回调函数的功能。这是一个很好的问题。

2025-08-30 08:00:00 653

原创 【C语言入门级教学】sizeof和strlen的对⽐

sizeof 计算变量所占内存空间⼤⼩的,单位是字节,如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的⼤⼩。sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据。易错题。

2025-08-29 23:17:47 264

原创 【C语言】实现一个函数,可以左旋字符串中的k个字符。

代码解释得非常详细!!!快来看

2025-08-19 00:03:24 139

原创 【C语言】gets和getchar的区别

*如果在读取字符之前,输入流中有残留的换行符或其他字符,getchar会直接读取这些残留字符,而不会等待新的键盘输入。在上述代码中,gets会读取用户输入的整行字符串,直到按下回车键。如果在getchar之前用户已经按下了回车键,getchar会读取这个换行符,而不会等待用户输入新的字符。在实际使用中,gets由于不检查目标数组的大小,可能会导致缓冲区溢出,因此在安全性要求较高的场合不推荐使用。此外,gets在读取时会忽略换行符,而getchar会将换行符作为有效字符读取。

2025-08-18 19:28:41 885

原创 【易错题】C语言

易错点:sizeof的返回值类型实际为无符号整形,因此编译器会自动将左侧i自动转换为无符号整形的数据,-1对应的无符号整形是一个非常大的数字,超过4或者8,故输出>今日遇到的一道易错题。

2025-08-13 21:55:52 305

原创 【C语言入门级教学】函数指针变量与函数指针数组

parr1 先和 [] 结合,说明parr1是数组,数组的内容是什么呢?如果我们要将函数的地址存放起来,就得创建函数指针变量,函数指针变量的写法其实和数组指针⾮常类似。那要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组,函数指针的数组定义如下。函数名就是函数的地址,当然也可以通过&函数名的⽅式获得函数的地址。浅浅的补充一个知识:函数有三种用法:函数调用,函数声明,函数定义。typedef是⽤来类型重命名的,可以将复杂的类型简单化。确实打印出来了地址,所以函数是有地址的,那么函数是否有地址呢?

2025-08-11 22:44:32 1174

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除