- 博客(34)
- 收藏
- 关注
原创 链式二叉树,递归的暴力美学
分析一下这两个终止条件,root==NULL,这个结点已经是空指针了没有加上去的意义,那肯定会有人有疑问了,根结点的左右结点是空指针了,怎么会向下递归呢,那就大错特错了,如果一个结点只有一个子结点的话,两个结点都进入,空结点返回0,非空返回1,这是其中一个终止条件的意义,另一个就很明显了,就是左右结点是空就返回1,没有什么过多需要解释的,如果这个结点不符合上述两个终止条件的话,就返回他的左子树+他的右子树。同样,这里也是用到了递归的思想,仅仅需要简单的几行代码,就实现了结点的计算。
2025-01-09 10:30:04 1251 21
原创 堆排序+选择排序详解
选择排序(SelectSort),以第一个为开始值,从下一个元素开始,依次寻找比开始值大/小的元素,当找到最大/小的下标,此时将开始值与找到的元素进行交换,这样就实现了最大/小元素的正确去向。既然选择排序是从第一个开始寻找最大/小的,那么可不可以同时寻找最大和最小,并且将他们放到正确的位置,这样就可以大大提升了选择排序的时间复杂度了。如果没有这个代码的话,第一个是最大的,当交换一次之后,最小值到了begin,然后最大值还是begin与end交换就错误了。4.优化后的选择排序的实现。2.选择排序的优缺点。
2025-01-09 10:29:57 537 10
原创 数据结构-二叉树_堆
对于深度为 K 的,有 n 个 结点的⼆叉树,当且仅当其每⼀个结点都与深度为K的满⼆叉树中编号从 1 ⾄ n 的结点⼀⼀对应时称 之为完全⼆叉树。孩⼦兄弟表⽰法: 树结构相对线性表就⽐较复杂了,要存储表⽰起来就⽐较⿇烦了,既然保存值域,也要保存结点和结 点之间的关系,实际中树有很多种表⽰⽅式如:双亲表⽰法,孩⼦表⽰法、孩⼦双亲表⽰法以及孩⼦ 兄弟表⽰法等。在树形结构中,我们最常⽤的就是⼆叉树,⼀棵⼆叉树是结点的⼀个有限集合,该集合由⼀个根结点 加上两棵别称为左⼦树和右⼦树的⼆叉树组成或者为空。
2024-11-21 17:17:56 2941 52
原创 鸿蒙生态崛起
并且,开发者之间要加强合作,形成良好的社区氛围,共同应对挑战,推动鸿蒙生态下应用的高质量发展。例如,在理解和运用鸿蒙的跨设备通信机制时,要深入学习分布式软总线等概念,这需要我们参加大量的官方培训课程和技术论坛,与其他开发者交流心得,逐步掌握其精髓。开发者可以针对智能家居的场景化需求,开发出自动化程度更高的应用,如根据不同的时间和环境自动调整家居设备状态的应用。开发者要勇于创新,深入了解用户需求,利用鸿蒙生态的优势,开发出更多高质量、具有创新性的应用,共同推动鸿蒙生态向着更繁荣的方向发展。
2024-11-21 17:17:51 1722 6
原创 Linux入门(1)
在Linux中,目录存储是多叉树结构,即每个目录只有一个父类,但是可以有多个子类,任何一个目录都有.和..命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件。这样只能创建一个目录,但是想要连续创建目录,这时可以用-p递归来创建目录。把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同。没有-f的话会依次确认,依次删除,当加上-f就一样了,将目录象文件一样显示,而不是显示其下的文件。使用指定的日期时间,而非现在的时间。使用指定的日期时间,而非现在的时间。
2024-10-12 00:22:28 994 11
原创 C++入门(1)
定义命名空间需要用到关键字namespace,需要给命名空间起一个名字,名字是可以随便起的,将需要定义的变量封存到命名空间里面,这样就和全局和局部 变量隔离开来,命名空间中可以定义函数/类型/变量等等。并且namespace是支持嵌套定义的命名空间域不会影响变量生命周期项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。•C++标准库都放在⼀个叫std(standard)的命名空间中。
2024-09-27 01:33:42 1395 29
原创 每日算法2(翻转链表)
接着进入循环,我们选不探讨循环条件,先研究循环语句,n2的next要存储n1,就是为了使最后的链表的next的空,n1=n2,n2=n3,if(n3)n3=n3->, n1是整个链表,n2=n3是为了指向后面的元素,在将后面的元素插入到n1前面,然后再让n1是指向头节点,最后5就是新的头节点。先来讲下最简单的算法,创建一个新链表,将原链表的元素挨个头插到新链表上,就实现了顺序表的逆转,这里就不示例代码了,在之前的链表有提及。让n1指向空,n2指向头,n3指向head->next。
2024-09-25 23:58:26 270 6
原创 算法复杂度
数据结构是计算机存储数据,组织数据的方式,指相互之间存在⼀种或多种特定关系的数据元素的集合。常见的数据结构有线性表,树,图,哈希等。
2024-09-25 22:49:06 1486 7
原创 每日算法1(快慢指针)
那么这样写对吗,答案是对的,那么如果将他们翻转过来,写成fast->next&&fast还对吗,那就不对了,如果fast为空指针,对空指针进行解引用就会报错,还是要写成fast&&fast->next,因为当fast为空指针就结束了,不会进行fast的解引用,因此就不会发生报错。这是一道力扣的算法题,首先来读题,是删除链表的中间元素,先来分析一下题,链表一共有三种可能,第一种是空链表,第二种链表的个数是偶数,第三种是链表的个数是奇数,我们分别来对这三种情况讨论。另一种就是快慢指针,首先我们先定义两个指针,
2024-09-24 22:16:06 500 10
原创 单链表初阶
在了解链表之前我们都或多或少的了解过顺序表,但是仔细想想,顺序表在进行增删的时候经常设计到数据的移动,就导致了运算速率底下,有没有一种结构,可以存储数据,并且增删时不用调用很多数据,兼容这些优点的就是链表。plist是链表,指向的是第一个节点,然后第一个节点存储他的数据和第二个节点的地址,这样就可以通过上一个节点来找到第二个节点。和这个图一样,很多个数据之间存在某种关系,把链表的头比作火车头,链表的每个节点是火车的每个车厢,车厢内存储数据。1、链式机构在逻辑上是连续的,在物理结构上不⼀定连续。
2024-09-22 00:32:19 213 2
原创 C语言实现汉诺塔
这是一个古典的数学问题,是一个只有用递归方法解决的问题。问题是这样的:古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到B座,但每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。其目的是让A中的盘子通过C全部移动到B上面,A为起始,B为终止,C是中转。目的是等下在递归中频繁调用打印操作,从而建去了一系列的操作。这里只针对汉诺塔进行分析,详细递归还需大家慢慢积累,其次是实现核心代码,
2024-09-19 00:51:55 402 1
原创 顺序表专题
当我们想要使⽤⼤量使⽤同⼀类型的数据时,通过⼿动定义⼤量的独⽴的变量对于程序来说,可读性⾮常差,我们可以借助数组这样的数据结构将⼤量的数据组织在⼀起,结构也可以理解为组织数据的⽅式。常⻅的数值1、2、3、4.....、教务系统⾥保存的⽤⼾信息(姓名、性别、年龄、学历等等)、⽹⻚⾥⾁眼可以看到的信息(⽂字、图⽚、视频等等),这些都是数据。求数组的⻓度,求数组的有效数据个数,向下标为数据有效个数的位置插⼊数据(注意:这⾥是否要判断数组是否满了,满了还能继续插⼊吗).....案例:蔬菜分为绿叶类、⽠类、菌菇类。
2024-08-10 22:07:31 384
原创 C语言预处理详解
(假定某个程序中声明了⼀个某个⻓度的数组,如果机器内存有限,我们需要⼀个很⼩的数组,但是另外⼀个机器内存⼤些,我们需要⼀个数组能够⼤些。结果是11,为什么呢,因为我们传入的是5+1,#define的优先级很高,所以直接进行了预处理,就是5+1*5+1,结果显而易见就是11,当我们使用宏的时候要注意优先级的问题,此时我们可以用()将a保护起来,此时就可以得到正确的结果了,结果是55,还是因为优先级问题,double将两个数相加,直接替换成了5+5,但是并不会进行计算,10*+5==55,结果由此而得。
2024-08-07 00:01:51 1138
原创 c语言编译和链接
我们在 test.c ⽂件中每⼀次使⽤ Add 函数和 g_val 的时候必须确切的知道 Add 和 g_val 的地址,但是由于每个⽂件是单独编译的,在编译器编译 test.c 的时候并不知道 Add 函数和 g_val变量的地址,所以暂时把调⽤ Add 的指令的⽬标地址和 g_val 的地址搁置。词法分析就是将源码逐个分析,例如int arr[] = {0},int是定义整数类型,arr是一个标识符,[是左括号]是右括号,=是等号,{是左花括号,0是一个整数,}是右花括号,机器就是逐个进行分析的,
2024-08-06 14:40:10 607
原创 C语言文件操作
如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们可以使⽤⽂件。在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了指针和⽂件的关系。⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件。每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名。
2024-08-06 14:14:34 584
原创 c语言动态内存管理
C/C++程序内存分配的⼏个区域:1. 栈区(stack):在执⾏函数时,函数内局部变量的存储单元都可以在栈上创建,函数执⾏结束时这些存储单元⾃动被释放。栈内存分配运算内置于处理器的指令集中,效率很⾼,但是分配的内存容量有限。栈区主要存放运⾏函数⽽分配的局部变量、函数参数、返回数据、返回地址等。2. 堆区(heap):⼀般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。分配⽅式类似于链表。3. 数据段(静态区)(static)存放全局变量、静态数据。程序结束后由系统释放。
2024-07-23 00:21:53 1017 1
原创 联合和枚举
联合体和结构体类似,但是又结构体又不同,结构体中的每个成员都是独立的,修改其中任意一个值不会影响另外一个值,但是在联合体中,修改其中一个值,一定会有另一个值跟随他发生改变,联合体中所有值都共用同一块内存空间。第一个输出8,因为char型数组的对齐数是1,而大小是5,int型对齐数是4,大小是4,所以联合体大小应该是其中最大的成员大小5,但是5并不是最大对齐数的整数倍,因此内存大小变成了8.我们仔细分析就可以画出,un的内存布局图。在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐较严格。
2024-07-19 01:30:50 894
原创 C语言结构体
1. 位段的成员必须是 int、unsigned int 或signed int ,在C99中位段成员的类型也可以选择其他类型。2. 位段的成员名后边有⼀个冒号和⼀个数字。int b :4;A就是⼀个位段类型。那位段A所占内存的⼤⼩是多少?
2024-07-19 00:03:22 921
原创 c语言内存函数
• 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。这个函数在遇到 '\0' 的时候并不会停下来。• 如果source和destination有任何的重叠,复制的结果都是未定义的。对于重叠的内存,交给memmove来处理。memcpy的模拟实现。
2024-07-07 00:51:57 260
原创 字符串函数和字符函数
C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h。
2024-07-02 23:00:24 463
原创 手撕指针(四)
本质上是一个数组,每一个元素是函数指针parr先和[]结合,先成为一个数组,然后每个元素是函数指针,是int (*函数名)()类型的函数指针。
2024-03-27 23:14:26 342
原创 手撕指针(三)
指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪⾥?二级指针就是再次将指针的地址存放到指针里面。对于⼆级指针的运算有:*ppa 通过对ppa中的地址进⾏解引⽤,这样找到的是 pa , *ppa 其实访问的就是 pa .**ppa 先通过 *ppa 找到 pa ,然后对 pa 进⾏解引⽤操作: *pa ,那找到的是 a .
2024-03-10 20:14:16 987 2
原创 手撕指针(二)
一般情况下数名是数组首元素的地址特殊情况但在sizeof()中,数组名是数组整个整个数组的⼤⼩&取地址操作符是取出的数组的整个地址当计算一个数字的长度时,&取出的是整个数组的整个的大小,是40个字节,而arr【0】只是一个数组元素的地址大小,由此可以计算出整个数组有10个元素。此时不难发现,arr[0]和arr的地址一样,区别就在于二者进行计算时一个加减只变化了4个字节,而arr一次变化了40个字节,arr+1一次跳过的是他本身的字节大小而&arr+1一次跳过的是整个数组的大小的字节。
2024-03-01 13:41:18 422 1
原创 手撕指针(一)
先用一个简单的实例引入内存的概念,例如在生活当中宿舍楼宿舍楼里的每一个房间都是有房间号的,例如101,501,519等等,每个房间都是有对应的数字号,并且这些数字号不会重复,有了房间号,你的朋友就能快速找到你,可以提高效率。我们知道计算上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,那我们买电脑的时候,电脑上内存是8GB/16GB/32GB等,那这些内存空间如何⾼效的管理呢?其实也是把内存划分为⼀个个的内存单元,每个内存单元的⼤⼩取1个字节。
2024-02-06 21:18:06 967 10
原创 操作符详解
代码1:变量的定义int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2//代码2:初始化。struct Stu //类型声明//名字int age;//年龄//初始化//指定顺序初始化//代码3int data;//结构体嵌套初始化struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化。
2024-01-25 16:01:05 876
原创 函数和数组实现扫雷游戏
在继续分析,当我们点击一个位置之后,这个位置附近的8个方块的1和0的个数应该被存储起来并且打印出,被我们看到,这样才能进行下一步的游戏,但是,如果单单一个数组,雷,雷的个数,存储类型太多,容易产生歧义,因此,可以创建两个数组,为了保持神秘感,在扫雷之前,各个位置应该存放‘*’并打印出来,为了保持两个数组的一致,可以使用两套相同类型的数组,雷和非雷可以用'1'和'0'表示。(1)扫雷的过程中,布置的雷和排查出的雷的信息都需要存储,所以我们需要⼀定的数据结构来存储这些信息。因此,这一步骤的设计到二维数组。
2024-01-15 12:08:13 588
原创 函数的递归
要想完成1234的分离,首先把4分离出来,其次在分离3,一直分离到1,传递参数进入子函数,1234>9,在进入123,,123也大于9,进入12,还是大于9,在进入1,1
2024-01-12 17:21:59 493 1
原创 输入输出中一些小秘密第一章
在输出中,n表示输出的数子宽度至少为n,如果输出的数小于n则自动在前面补0,大于n则直接输出实际数,类似于输出的%d。当大于四位数时则只读取前面的四位数。当小于等于4位数时则读取实际数。最后预祝每一个努力的人都能成功。此时是实际数宽度小于n。
2023-12-30 01:13:35 436
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人