自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 红黑树 学习笔记

如果c不是新插入的节点,那么就说明插入之前就存在红黑树符合规则,所以c和p不连续为红,此时就不符合所有路径黑色节点数量相等,因为g的右边为空,所以假设不成立,c一定是新插入的节点。我们学过AVL树都知道,尽管不变色,对于这种 < 类型的树,我们必须进行双旋,才能解决问题,< 进行 左右双旋,然后根据结果来看,我们只需要将c变为黑色,将p,g变为红色即可。:和情况1一样,这里的p必须变为黑色,才能解决连续红色节点的问题,u不存在或者存在且为黑,这里单纯的变色就无法解决问题,因此我们需要旋转+变色。

2024-10-24 23:30:18 606

原创 AVL树学习笔记

首先对于5节点来说,原来的平衡因子为0,因此原来的5左右子树高度均相等,当在a中插入了一个新节点,也就是5的左子树,那么5节点的平衡因子就需要--,变为了-1,我们之前说过,如果是变为了-1/1,就需要继续向上更新,那么直到根节点,变为-2,此时我们就需要进行旋转。这是右单旋的通用图(-2,-1),我们从中可以看到,a,b,c 三棵树的高度均为h,但是实际上,根节点的左子树多了一个节点5,所以对于10来说是左边高右边低,相差高度为1,因此我们在c插入不会影响整棵树的平衡(所以我们只讨论在a,b中插入。

2024-10-09 18:05:18 1056

原创 C++ set 和 map学习

set也是一种我们直接可以使用的容器,使用应该包含 #include <set> 这个头文件。此处暂且不讨论其底层,只探讨set如何使用即可。我们看到,set 的模板参数有三个,第一个就是其存储的数据类型,第二个是仿函数,决定到时候排序的逻辑,第三个是空间配置器,我们在使用中着重写第一个,而后两个我们目前的学习程度几乎用不到。我们可以看到,set的构造基本上和我们学的vector,list等容器的构造类似,因为set也是支持迭代器的,所以也是很简单的。

2024-09-23 20:00:40 728

原创 C++二叉搜索树学习

找到该节点(N)左子树的最大节点(L)或者右子树的最小节点(R)来替换该节点的值,因为这两个节点中的任意一个,放到N的位置,都不会破坏整个二叉搜索树的性质,然后我们删除交换后废弃的节点即可。然后我们就和插入一样,从根节点开始,将我们要查找的key值与此时节点的值比较,key小就向节点的左子树走,key大就向节点的右子树走,若相等就返回true即找到了。如果该节点的左子树为空,那么我们找到该节点后,并且记录了父节点,直接将父节点指向该节点的指针,指向该节点的右子树,然后直接删除该节点即可。

2024-09-17 21:44:00 773

原创 C++多态 学习

通过上图我们可以看到,满足多态条件之后,底层不再是编译时通过调用对象确定函数的地址,而是运行时到指向的对象的虚表中确定对应虚函数的地址,这样就实现了指针或引用指向基类就调用基类的虚函数,指向派生类就调用派生类的虚函数。:在重写基类的虚函数时,对于派生类,我们其实可以不加 virtual 关键字,因为继承基类后,虚函数也被继承了下来,在派生类中依旧保持虚函数的属性,但是这种写法看起来不是很一目了然,但是如果不写的话,也是构成重写/覆盖的。多态是一个继承关系下的类对象,去调用同意函数,产生了不同的行为。

2024-09-14 14:18:19 990

原创 C++栈和队列(容器适配器)

我们之前实现栈和队列,都是我们自己去实现相应的功能,那么今天我们可以使用容器适配器来实现我们的栈和队列,那么什么是适配器呢?我们日常生活中所见到的电源充电器,就是一种适配器,当我们使用的时候,会跟我们的插座相匹配,从而供我们使用。class lesspublic:public:仿函数本质上是一个类,它的使用就像是一个函数,它的里面必须要有operator() (括号)的重载,以上两个less 和 greater就是两个仿函数,里面有着判断数据大小的功能,也就是重载了() operator()

2024-08-01 14:13:35 921

原创 List基础功能实现C++

和 ==,解引用* ,->等操作,这些操作都比较简单,返回对应的结果即可,唯一要注意的是,->运算符重载时,是返回节点数据的地址。对于erase,我们需要找到pos位置的prev和next,然后delete[ ]掉pos位置的节点,然后将prev和next链接起来就行了,需要注意的只是删除的时候pos位置不能等于end(),因为我们不能删除头节点。我们使用模板来表示链表的一个节点,这一个节点里面有一个T类型的数据,并且有两个方向next和prev,两个节点的指针来存储另外两个节点的信息。

2024-07-30 15:43:07 922

原创 vector基础功能实现C++

但是我们要注意,如果是内置类型例如整形,这样写是不会出错的,但是我们别忘了,我们实现的vector里面也可以存其他的自定义类型例如 string,如果是自定义类型(拿string来举例),我们使用memcpy拷贝的是每个字节,每个string里面还有单独的一个_str指针,memcpy只是简单的浅拷贝,因此我们虽然delete了原来的_start,但是最后析构的时候就会报错。以上内容为自己对于vector学习后的理解,并且简单构造了基础的功能,如果有错误,欢迎批评指正!

2024-07-27 21:28:38 778

原创 C++ string类基础实现

erase的作用是,从pos位置开始,删除len个字符,所以我们判断如果 _size - pos

2024-07-24 00:54:39 899

原创 C++初识模板

函数重载确实给我们带来了一定的方便性,但是如果我们要交换另一种类型的数据例如 long,我们可能就需要再写一个Swap重载。那么我们能否告诉编译器一个模板,让编译器根据不同的类型利用这个模板来生成相应的代码呢?

2024-07-19 14:12:15 278

原创 C/C++内存管理笔记

new的原理1.调用的时operator new 函数申请空间。2.在申请空间上执行构造函数,完成对象的构造。delete的原理1.在空间上执行析构函数,完成对象中资源的清理工作2.调用operator delete函数释放对象空间。注意:new先开空间再构造,而delete是先析构再释放空间。new T[N]的原理1.调用operator new[ ]函数,在operator new[ ]中实际调用operator new 函数完成N个对象空间的申请。2.在申请的空间上执行N次构造函数。

2024-07-18 15:44:08 963

原创 日期类的实现C++(笔记)

我相信很多同学在写这个重载的时候,肯定都是一头雾水,想来想去也不知道该怎么计算,因为不仅有平年与闰年的区别,更复杂的是,每个月的天数也是不一样的。第一个操作数在左边,即为我们的this,第二个操作数在右边,即为我们的d,代码也很简单,最终返回*this的引用,因为this生命周期并不在这个函数里面,因此我们不用担心空引用问题。我们都知道,每个月的天数不一样,并且一旦天数达到了上限,我们就要给月+1,一旦月份加到了13,我们就要给年+1,并且将月份修改为1,因为12月+1就到了明年的1月。

2024-07-15 16:15:38 564

原创 C++类和对象基础笔记总结(默认成员函数)

Stack st1;,那么我们的程序就会报错,因为对于Stack类,在私有成员中有一个int* _a的成员,我们在初始化列表时已经初始化_a,如果我们不写拷贝构造函数,因为是浅拷贝,那么st2中的_a将与st1中的_a,是同一块地址,调用析构函数时,就会析构两遍,我们不可能将同一块地址free两次,因此就会报错。后两行代码分别创建了d1,d2对象,他们两个创建的方法是不一样的,d1去调用第一个构造函数,d2去调用拷贝构造函数,而我们函数实现功能就是创建一个和d1值一样的d2。以上内容如有错误欢迎批评指正!

2024-07-15 10:01:25 517

原创 C++类和对象学习笔记

我们可以通过类名来实例化一个d1,通过d1我们可以使用类中的公有数据,但是在类外我们不能访问类中的保护和私有数据。

2024-07-11 17:04:04 1051

原创 C++基础学习笔记

缺省参数是声明或定义函数时,为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省。例如:我们在定义func函数时,分别给b和c默认参数1和2,没有给a值,那么我们在main函数里面分别调用了三次func函数,分别给了不同的参数,输出的结果自然不一样。也就是说,在定义函数时,如果给了参数默认值,那么在我们调用函数时如果没有指定实参,那么就会按照默认值,例如上面的b和c,而a必须要传一个实参。

2024-07-11 00:04:56 640

原创 排序学习笔记

排序的概念其实非常简单,本质上就是将一堆记录按照从大到小(),从小到大()来进行排序。我们日常生活中每天都有着不同的排序,比如年龄大小排序,身高的排序等等。:假设在待排序的序列中,存在多个具有相同关键字的记录,若经过排序,这些记录顺序保持不变,即在原序列中,r[i] = r[j],且r[i]在r[j]之前,而在排序之后,r[i]仍在r[j]之前,则称这种算法是;否则称为例如(小明总成绩199,数学成绩100;

2024-07-07 15:22:48 789

原创 二叉树学习笔记

我们在日常生活中所见到的树,全都是左边这幅图,它的根在地下,自下而上生长产生分支。而我们将要学习的树,是右边这幅图,刚好和左边相反,它根节点在上边,自上而下生长产生分支。对于任何一颗树,都有以下概念:一个节点含有的子树的个数称为该节点的度;如上图:A的度为3,G的度为2:度为0的节点称为叶节点;如上图:J、F、K、L等为叶节点:也就是度不为0的节点;如上图:B、C、D等为分支节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;如上图:A是B的父节点:一个节点含有的子树的根节点称为该节点的子节点;

2024-06-30 11:04:50 578

原创 栈和队列的介绍

栈和队列的介绍以及实现。

2024-05-12 16:49:57 1447 2

原创 时间(空间)复杂度

当我们对于一个实际问题写出了一个或者多个函数,我们怎么来评估这些函数的好与坏呢?是通过在电脑上或其他计算机上运行一下看哪个函数的运行速度比较快呢、还是看哪个函数写的比较短呢等等?那我们说以上的方法都不是科学的方法,因为电脑各有差异,有的电脑比较好他运行的就快了,有的电脑较旧,运行的就比较慢了,因此我们使用时间(空间)复杂度来衡量一个算法的优缺点。例如:我想知道下面这个函数中count++到底运行了几次?那我们通过里面的算法,就可以简单的计算出这个算法的函数表达式为: N^2 + N + 10。

2024-05-03 11:08:12 675

原创 贪吃蛇的模拟实现

1.设置长和宽我们一般在运行C语言代码时弹出来的黑框其实就是控制台程序,我们可以通过cmd命令来设置有关控制台窗口的长和宽例如我们在cmd窗口中输入mode con cols = 100 lines = 30然后回车,控制台的大小就被我们设置为了30行、100列的大小。我们在实现贪吃蛇的游戏之前要把这个大小固定下来,不然就会对我们贪吃蛇代码实现产生一些影响。2.设置标题一般来说,此处会显示管理员三个字,那我们是贪吃蛇游戏,怎么把这个标题改为贪吃蛇呢?

2024-04-20 16:08:12 754

原创 编译和链接的笔记

因此经过链接两个目标文件我们就可以正常的使用Add函数,注意:Add函数在调用的过程中不能写成add或者ADD,因为这样虽然将两个目标文件链接起来,但是add和ADD找不到对应的函数,只有Add才能找到对应的函数完成对应的功能。处理#include预编译指令,将包含头文件的内容跟插入到该预编译指令的位置。在Windows环境下的目标文件后缀是 .obj, Linux环境下目标文件的后缀是 .o。处理所有的条件编译指令,如#if、#ifdef、#elif、#else、#endif。

2024-03-29 17:41:14 347 1

原创 C语言中文件的相关操作 笔记

首先我们的工程文件里面没有"text.txt"文件,但是我们是以“w”方式打开文件,因此就会创建一个"text.txt"文件。因为我们已经在"text.txt"文件中写入了相关格式化的数据,此时我们使用"r"来读出来,就如scanf,我们要读取的数据的类型,后面是一个地址:("%s %d %f", s.name, &(s.age), &(s.score)),但是fscanf要有一个参数p指向打开的文件,因此代码执行之后,结构体s里面就有了:张三 20 20.000000数据,此时就打印出了这个格式化数据。

2024-03-29 16:47:40 767 1

原创 C语言结构体的知识笔记

这里面最大的对齐数是4,我们必须满足时4的整数倍大小,所以8是不够的,因此最后结构体的大小就为12。首先第一个位置肯定放结构体第一个成员变量char a,占一个字节,然后是char c,也占一个字节,但是要对齐到其对齐数的整数倍处,2确实时1的整数倍,然后是最后一个int,他的对齐数为4,因此我们要找到4的倍数的地址,往下找到了4地址,从这个位置开始,一直到地址7,刚好四个字节放下了int,因此一共使用了0~7共8个字节,刚好为最大对齐数4的整数倍,因此这个结构体大小就为8,讲到这里你们明白了吗?

2024-03-19 17:50:07 1419

原创 扫雷游戏笔记

game()函数的大致内容也十分简洁,首先定义两个二维数组,mine和show,为什么要定义两个数组呢,因为我们在玩扫雷游戏的时候,展示出来的不是mine(雷)的样子,而是隐藏雷的位置,因此我们在mine中放置雷,我们用show数组到时打印出来覆盖之后的样子即可。首先test.c是我们的主程序,在主程序里面书写主要框架,然后游戏的玩法之类的我们可以在game.c中来书写。此时再统计1周围的雷的个数,我们只需将黄色的所有格子,设置为非雷即可,这样就能能统计出,每一个蓝色格子周围将会有多少个雷。

2024-03-17 11:13:32 1492 1

原创 C语言中数据在内存中的存储

9在计算机中的存储为: 00000000000000000000000000001001,所以使用%d打印出来就是9,但是float* p在使用的时候,它里面存储的还是00000000000000000000000000001001,但*p会以浮点数的存储方式来解读,首先第一位为0所以是个正数,但是接着的8位都为0,所以E的值就为1-127 = -126,因为E为指数,这个值将非常小,计算机就当为0处理,所以打印出了0.000000。并且存储的时候,M位小数点前面的1不用存储,只存储小数点后面的。

2024-03-16 16:31:46 604 1

原创 C语言部分库函数的使用和模拟实现

在使用memcpy时,若src与dest有任何的重叠,复制的结果都是未定义的,这时可以使用memmove函数,来处理重叠的内存,模拟实现过程中需要判断src和dest的大小,因为涉及到从前向后还是从后向前的顺序,对于1,2,3,4,5,6,7,8,9,10这十个数,如果我想把开始的1~5赋给3~7,那么当到3的时候此时3已经变为了1,就实现不了把开始的1~5赋给3~7,但是可以倒着判断,就不会出现这类情况。如果两个字符串一样,那么*p1和*p2同时会到'\0',此时只需return 0即可。

2024-03-16 14:54:09 810

原创 有关C语言指针

如此看来,如果代码为char* p = &b,这里假设b是一个字符串或字符,分析char* p, p在*后面,说明p是一个指针变量,指向的是*前面的char(字符)类型。整型数组里面肯定存放的是整形,所以指针数组里面存放的肯定也就是指针了。然后有两个循环,i 和 j,类比取出数组的元素,那么parr[0]就相当于取出了arr1,那么如果进行到了parr[1][2],parr[1]就是取出了arr2,所以parr[1][2]就相当于arr2[2],最终打印出来的就是arr2里面的第三个元素,也就是4。

2024-03-05 17:23:52 337

原创 C语言分支和循环

这个代码实现了打印出1000年到2000年中闰年是哪一年,并且同时也统计了这两个年份之间一共有多少个闰年,这就是简单的分支和循环并用的情况。还有这个判断输入的数字是几位数,使用了while循环,其实本质就是用输入的数 / 10 不断去除个位,然后为0就停止循环。while 循环和 for 循环都是循环,我自己比较喜欢使用for循环,因为for循环条件都在一块,容易理解。C语言的分支和循环,目前学习到了if 和 switch 语句,while,for,do while 循环。

2024-01-24 10:04:47 394 2

空空如也

空空如也

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

TA关注的人

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