- 博客(54)
- 收藏
- 关注
原创 一文讲懂fork函数(c语言&linux)
如果fork创建子进程成功,会有两个返回值,父进程得到子进程的PID的值(大于0),子进程得到等于0的返回值.它需要完成的功能有:申请新的pcb→拷贝父进程给子进程→将子进程pcb放进进程的清单,甚至放进调度队列.在子进程已经被创建甚至调度的情况下,子进程和父进程都会执行fork的return语句.因此有两个返回值.如果父进程或者子进程要修改数据,操作系统就会把要修改的数据拷贝一份新的,让目标进程修改这份拷贝的.子进程中的代码和数据与父进程的一致(共享父进程的代码和数据),没有自己的代码和数据.
2025-05-29 11:44:42
240
原创 AVL树c++实现
_bf(0){}//指向左节点//指向右节点//指向父节点T _data;//存放数据int _bf;// 节点的平衡因子,采用右子树高度-左子树高度public://初始化树AVLTree(){}//......中间有很多函数private://根节点。
2025-05-29 11:44:06
1048
原创 c++ 模拟实现 string 这种数据类型
模拟实现c++的string首先要有一个string类,为了避免和c++自带的string撞上,我们要把我们自己写的string类放到一个新的命名空间。
2025-01-23 11:53:43
225
原创 二叉搜索树(BST)的介绍和实现(c++)
二叉搜索树的英文名是Binary Search Tree,简称为BST看名字就知道二叉搜索树是二叉树,但是和普通的二叉树不一样,二叉搜索数的特点是:有一个根节点R,它有左子树和右子树,左子树的值全都小于结点R的值,右子树的值全都大于节点R的值.如下图所示:8的左子树的节点都比8小,右子树节点都比8大;6的左子树的节点都比6小,右子树节点都比6大;10的左子树的节点都比10小,右子树节点都比10大;......这就是二叉搜索树的特点,但是二叉搜索树不一定是完全二叉树.
2025-01-23 11:53:33
1100
原创 c++数据内存分布简介
主要用于存储局部变量和函数调用的相关信息(如返回地址、参数等):用于动态分配内存,程序员可以在程序运行时根据需要请求分配内存。用于存储全局变量、静态变量和常量字符串(在某些实现中)。用于存储常量数据,如字符串常量、数值常量等。
2025-01-19 14:00:17
274
原创 c++模版详解(不涉及编译原理)
先看看下面的代码感受一下模版的作用吧在上面的代码中,我们可以发现Swap函数有2个,而且构成了重载.这两个Swap函数结构及其相似,有点冗余.我们开始思考,是否可以只写一个函数来实现交换功能呢?答案是可以.我们使用模版就可以轻松缩短代码!
2025-01-19 13:59:24
670
原创 选择排序详解
选择排序有循环, 每一次循环都会把最小的元素放到数组的头部, 把最大的元素放到数组的尾部, 然后数组遍历的范围缩小, 继续选出最小和最大的元素, 直到数组有序为止.
2024-11-30 19:50:08
193
原创 循环队列的实现(力扣622)
拟定用数组实现循环队列.但是数组的大小比元素个数多1个.(下文解释原因)头指针和尾指针不是我们常说的存放节点地址的指针,而是存放数组下标.插入元素时,尾指针+1,不断插入,直到数组的尾部时,尾指针又会重新回到下标为0的地方,重新开始.删除元素时,头指针+1,直到数组的尾部时,头指针又会重新回到下标为0的地方,重新开始.
2024-11-28 17:14:02
297
原创 归并排序详解
归并排序的总思想是分而治之,把数组分成一小块一小块排序,然后再有序地排成一个大数组。它的分块有点像二分查找那样,从中间分开数组,然后在剩下一半的数组中继续分,直到分成二个元素为止,就开始比较这两个元素,从小到大排列。两个元素排列完之后又回到4个元素的状态,继续排序,直到慢慢恢复成整个数组排序.在排序的时候,有序的部分会先放到临时的temp数组,然后再放回原数组.
2024-11-28 17:13:40
382
原创 对称二叉树(力扣101)
二叉树的根结点(最上面的那个),它会单独用isSymmetric判断一下,第一个是isSymmetric,第二个是judge.judge则用来判断根节点的左右两边结点的对称.对于这道题, 我会采用递归的解法.代码中有具体注释,请大家看代码.因为这里会考虑到一种特殊情况,写下判断对称的条件,代码中会有两个函数,
2024-11-07 17:05:51
422
原创 插入排序详解
把后面的值(temp)与前面的值(end)做对比,若temp位置的值小于end位置的值,end位置的值给end+1位置。。语言难以描述,请大家看下图。
2024-09-19 20:39:21
449
原创 二叉树前、中、后序遍历(指针、递归)
当二叉树不使用数组实现,而是使用链式结构,用指针将节点相连时,二叉树便会衍生出很多问题,如前序遍历、中序遍历、后序遍历、层序遍历。下面我将用递归的方法完成二叉树的遍历。但在这之前,我们还得构造链式结构的二叉树。
2024-09-16 11:16:03
451
原创 C++类和对象(6)——初始化列表
当然,我们可以在声明时就写 const int _b = 3,这样也可以初始化。初始化的顺序是按成员变量的声明的顺序,而不是按在初始化列表里的顺序。类名 + (形参)+ ‘ :’ + 变量名(形参) + {}此时a未初始化,是一个随机值,赋给了_b,导致 _b 是随机值;初始化的顺序是:_a(a), _b(a).初始化的顺序是:_b(a),_a(a).当成员变量是以下两种情况时,但还是推荐下面这种,格式为。声明的顺序是:_a, _b;声明的顺序是:_b,_a;随后_a正常初始化为1。
2024-08-31 12:15:03
416
原创 C++类和对象(7)——友元
Get_a函数想访问A里面的_a,但由于_a是私有成员,外部不能访问。友元用于解决外部函数无法访问类内私有成员的问题。我们只需在A类内的任意一处加上友元函数声明即可。friend + 函数定义 + ‘;为了解决这个问题,产生了友元。
2024-08-31 12:14:53
189
原创 C++类和对象(5)——运算符重载(以日期类为例)
假设我们此时实现了日期类的运算符重载,我们就可以实现如图的很多功能,完成日期计算器的底层代码。
2024-08-30 22:24:20
1209
原创 C++类和对象(3)——this指针
在类中,有着指向对象自身的this指针。当你调用类的成员函数时,都会有this指针占据着第一个形参的位置,但是this指针是隐藏的,而且this指针在实参和形参的位置不能写出来。我们将以下面这个类为例子讲解this指针。
2024-08-27 18:01:04
196
原创 C++类和对象(2)——拷贝构造函数
拷贝构造函数是构造函数的重载,用于这种情况:用已经构造好的对象去给另一个对象初始化。我们以Date类为例子讲解一下。语法格式为:类名 + ‘(’ + const + 类名 + 引用符号& + 形参名字 + ‘)’ + { }。{}里面就让成员变量等于传入的对象d的成员变量。说人话就是,1:1复刻传入的对象d.拷贝构造函数的实用之处d1和d2的成员变量的地址是一样的,让我们给Date类增加一个变量调试时就会发现两个指针变量a地址一样,析构函数释放同一块空间2次,程序就会崩掉。
2024-08-25 22:14:48
259
原创 C++类和对象的基础介绍(1)
C++类的关键字是class,学过c的朋友们可能会觉得和结构体struct有点像。在C++中struct也可以定义类,但和class定义的有所区别。我们还是推荐使用class。类里面会有成员变量、成员函数的定义和声明、构造函数、拷贝构造函数、析构函数、运算符重载函数等等。。待会你就知道啦.下面以日期类为例讲解类。
2024-08-25 22:14:35
609
原创 C++的函数重载
在c++中,函数重载的意思就是函数可以同名,可以有很多个名字一样的函数,但这些函数传参的类型、个数、顺序必须不同。返回值不同不构成函数重载。
2024-08-17 13:38:06
259
原创 二叉树建堆全过程(数组实现)
/用数组存数据int size;//当前数组存放数据的数量//数组容量}HP;即将要实现的功能//初始化//堆尾插入数据(数组尾部插入)//删除根结点//销毁堆//获取根结点//判断堆是否为空//交换*p1和*p2的值//向上调整建堆//向下调整建堆。
2024-08-09 17:58:02
445
原创 队列及其应用(用队列实现栈 力扣225)
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头。
2024-07-20 14:37:01
527
原创 栈及栈的应用(有效的括号 力扣20)
栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。咱们可以观察到,进出数据只在栈顶进行。
2024-07-20 12:17:38
372
原创 判断链表中是否有环(力扣141.环形链表)
如果该链表有环,快慢指针最终会在环中相遇;如果没有环,fast指针走到尾节点就结束循环。下面我将用数学工具证明一下(其实就是简单的追及问题而已啦)快慢指针有两个指针,走得慢的是慢指针,走得快的是快指针。在这道题,我们规定慢指针一次走一步,快指针一次走2步。先解释一下什么是快慢指针。这道题要用到快慢指针。
2024-07-11 20:29:12
389
1
原创 相交链表(力扣160)
总的思路是,得到长链表与短链表长度的差值L(长链表比短链表多了多少个节点),然后让长链表向前走L个节点,停下。此时长链表与短链表的长度就一样了,让它们同时走,直到相遇,走到第一个节点。如上图所示,搞两个指针。两个指针同时出发,直到两个指针相等为止,就找到了第一个相交节点c1。关键点就在于如何找到B链表的b2结点,意思就是说,这两个链表的长度不一样,怎么让它们 从长度相同的地方开始走。这道题首先要判断有没有环,没环返回NULL,有环返回第一个相交节点。判断有没有环,只需要判断链表A和B的尾节点是不是同一个。
2024-07-11 20:06:56
594
原创 结构体是什么
在c语言中,咱们的数据类型有int ,float, char等等,但是这些类型不足以让我们描述一个具体的类型。比如我们想描述一个人,会提及ta的性别、名字、年龄等等,这时我们创建一个结构体来描述人会很方便。在这个例子中介绍了结构体的具体用法,打印结果为。
2024-04-01 21:06:33
304
原创 结构体的内存对齐
结构体的内存必须是最大对齐数的整数倍,这个例子中最大的对齐数是int 的4字节,int类型放数据的时候,要从4的倍数的位置开始放,即从起始偏移量为12时开始放,有个东西叫对齐数,结构体内存按对齐数来放,从起始偏移量为0的地方开始放,那么4+1+1=6,还差的2字节从哪里冒出来的呢?char类型对齐数是1,承接上面的内存放下来即可。short类型对齐数是2,要从2的倍数开始放.8是4的倍数,而6不是,故内存为8字节。同理char类型,对齐数是1,放1.答案是4,因为4比8小,谁小放谁。
2024-04-01 21:06:17
206
原创 浮点数在内存中的存储
对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M。1.首先我们得学会如何把一个十进制的浮点数化为二进制。注:上图中的-110是二进制数,化为十进制数为-6。
2024-03-28 21:58:48
231
1
原创 什么是大小端字节序?以及如何判断大小端字节序
1.先明确整数在内存中以补码的形式存放,超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题。
2024-03-28 21:39:27
369
1
原创 什么是指针(初学者版)
1.指针是拿来存放地址的,指针是地址,地址是指针。2.指针变量自身也有地址二级指针存放一级指针地址三级指针存放二级指针地址……
2024-03-24 15:50:02
160
1
原创 memcpy函数的模拟实现
当然,我们模拟实现的memcpy函数也可以是void类型,无需传参,因为我们用的是指针,直接对内存下手了。比如有两个字符串s1,s2,我们想用字符串s2覆盖s1,这时就可以使用memcpy函数啦。首先介绍memcpy函数的作用和参数。让我们开始实现一个简单的模拟实现。改变参数,看看有何效果。
2024-03-22 00:03:50
258
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人