自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 时间,空间复杂度讲解——夯实根基

时间复杂度与空间复杂度讲解!!

2024-04-25 23:49:12 1635 71

原创 贪吃蛇项目实战——学习详解

使用c语言实现贪吃蛇小游戏——详解

2024-04-20 15:20:30 3640 129

原创 详解运算符重载——探索运算符重载的应用

c++运算符重载,c++中非常重要的板块

2024-04-15 23:38:14 1526 114

原创 顺序表实战——基于顺序表的通讯录

定义结构体, 我们要知道我们的联系人的成员变量应该有什么。首先, 联系人一定要有姓名;其次, 联系人要有性别和电话。而且, 我们可以加上一个地址,还有年龄。那么基本的联系人的结构体里面的成员变量我们就考虑清楚了。现在我们来进行定义结构体#define NAME_MAX 20//最大的名字长度#define GENDER_MAX 10//最大的性别长度#define ADRESS_MAX 30//最大的地址长度#define TEL_MAX 12//电话的长度是11, 最后一个留给字符零。

2024-04-08 15:50:19 1635 124

原创 预处理指令——一些比较少见的概念

define可以定义常量, 具体做法如下#define MAX 10//定义常量int main()i < MAX;这里就是#define定义常量, 常量值应该在常量名后边。#define定义常量的本质其实就是一种替换, 预处理阶段, 编译器会将源代码中的#define定义的常量进行替换。什么意思?如下:现在我们还是看上面一串代码:int main()i < 10;这里的MAX进行了替换。

2024-04-01 12:05:23 1904 73

原创 程序的编译和链接

前言:C语言的源代码到我们在屏幕上输出结果要经过两大环境,一个是翻译环境,一个是执行环境。其中翻译环境是由编译器控制, 执行环境是由操作系统控制。本篇内容指向我们的C语言源代码是如何到在屏幕上输出结果,通过解析两大环境来进行说明。两大环境要做的大致内容如下我们自己写的C语言源代码是.c文件。翻译环境有两大工序, 一个是编译, 一个是链接。然后就生成了我们的可执行程序, 也就是.exe文件,注意, 这些都是帮我们做的。

2024-03-30 23:38:14 1038 25

原创 我的创作纪念日

这个问题困扰了我好久,我还问过学校的老师, 但是学校的老师显然不相信我的理解能力, 不肯告诉我答案, 只是敷衍的告诉我——让我把形参和实参看成一个数组就行。但是我很清楚当时我是不相信我能够一直进行创作, 并且收获这么多的粉丝的。我在大概1000粉丝的时候认识了一群非常厉害的人, 他们有的占据着周榜前几, 有的几万粉丝, 有的隶属名校, 还有的已经步入社会, 参加工作。即便现在没有掌握, 但我还在完善我的博客, 只要我在完善我的博客, 我总会复习我的博客之中的知识点,最终掌握它。下面为我写的红黑树贴图。

2024-03-29 19:52:30 1390 21

原创 总结虚函数表机制——c++多态底层原理

对于多态的缺省值, 我们要特殊关照。如果构成了多态, 那么这个时候调用的虚函数的缺省值应该是父类的缺省值。对于如下代码进行测试class Apublic:private://这里初始化使用十六进制是为了好观察public:int main()C cc;return 0;这是A类中的func这是C类中的func请问。测试中的代码, 打印结果是什么呢?我们看一下vs的结果:这里之所以不是Cfunc()3的原因是因为这里的缺省值使用的时父类的缺省值。

2024-03-25 22:36:46 3171 75

原创 const,static深度总结——c++穿透式分析

编译不通过。这是因为使用const修饰的变量相当于放在了常量区。

2024-03-18 23:45:34 3640 122

原创 【图文结合c++】一篇文章解析c++默认函数规则,带你深度学习构造函数

调用自己相应的构造函数。

2024-03-11 18:19:46 3320 122

原创 探索c++——了解c++的魅力

那么这个被调用的函数就会。

2024-03-06 23:35:11 3831 65

原创 排序——希尔排序、插入排序

本节复习排序中的希尔排序,希尔排序属于插入排序。希尔排序的代码和插入排序非常类似。思想却相对于插入排序来说复杂。在复习希尔排序之前, 我们需要先复习一下插入排序。

2024-03-04 20:22:16 1166 22

原创 排序——堆排序

在复习堆排序之前, 首先我们需要回顾一下什么是堆。堆的本质其实是一个数组。它的物理结构本质上是一个数组。但是它的逻辑结构是一棵完全二叉树。我们在判断一个数组是否是一个堆的时候根据的就是它的逻辑结构。那么怎么根据它的逻辑结构判断是否是一个堆。首先堆的逻辑结构的二叉树的每一个孩子节点都大于它的每一个父亲, 就是堆。这种堆叫做小堆。如果它的逻辑结构的每一个孩子节点都小于它的父亲节点。它同样是个堆, 同时这种堆叫做大堆。

2024-03-04 19:45:55 1018 5

原创 vs报错1168链接错误——关于:LNK1168 无法打开 E:\VS\文件名\x64\Debug\文件名. 进行写入问题的解决方法

有的时候报错1168是因为你没有关这个东西然后就大改了你的代码后重新进行编译。如果你说你这个程序关了还是报错了,那可能后台在运行程序。第四种方法就是我在没有发现我的方法之前一直在用的方法:将当前项目的exe文件删掉。这种方法虽然也很不方便, 但是比起上面的不是很麻烦就是解决不了问题已经很好了。有些方法解决了这个问题, 但是有点麻烦, 有些方法可能不能解决问题。这个方法一定能解决你的问题。第二种方法就是重启vs(这种方法我也很少能解决问题)。以上, 就是我知道的解决1168问题的全部方法.

2024-03-03 22:47:26 620 10

原创 排序——归并排序

归并排序和快排一样, 都是一种利用二叉树分治思想实现的排序。同时归并排序也和快排一样有递归归并排序和非递归归并排序两种。本节主要复习归并排序, 并且两种实现方式都会复习到。

2024-03-03 22:24:45 1079 1

原创 排序——手撕快排

找到后将值放到左边的坑里,这里的坑被填了。然后右指针指向的位置的值相当于没了, 就让坑指向该位置。往复, 直到两指针相遇, 将保存的key的值放到坑里。这个key的值就是排好的单趟的值。这里为代码。

2024-03-02 23:00:49 1125 7

原创 堆——c语言实现堆结构

本节复习堆, 堆分为逻辑结构和物理结构, 堆的物理结构是一个数组。堆的逻辑结构是一个二叉树。其中堆又分为大堆和小堆。那么如何分辨大堆和小堆?分辨大堆和小堆我们要看堆的逻辑结构,对于一棵二叉树。每个非叶子节点都可能有一个左孩子或者右孩子, 或者两个孩子全部都有。而堆是一个完全二叉树。也就是说, 每个非叶子节点都有两个孩子或者有一个左孩子。那么, 大堆就是每个父亲节点的值都大于左孩子和右孩子的值。小堆就是每个父亲节点的值都小于左孩子和右孩子的值。现在我们来实现一下堆的结构。

2024-03-01 23:35:10 752 4

原创 文件操作知识点

这节主要复习文件操作的知识。首先我们应该知道文件操作有利于我们储存信息, 假如我们运行程序计算出数据但是没有保存, 那么这些数据就丢失了, 而使用文件我们就能让数据进行长久的保存。

2024-02-29 20:47:26 893 1

原创 二叉树的增删查改

本节复习二叉树的增删查改, 二叉树的知识相对于前面的循序表, 链表, 以及栈和队列都要多一些。同时二叉树的增删查改理解起来相对来说要困难一些。本节来好好复习一下二叉树的增删查改。

2024-02-29 20:32:41 677 2

原创 单词倒排——c语言解法

以下是题目:这个题中有三个点, 一个是将非字母的字符转换为空格, 第二是如果有两个连续的空格, 那么就可以将这两个连续的空格变成一个空格。第三个点就是让单词倒排。那么我们就可以将这三个点分别封装成三个函数。还有就是, 三个函数执行顺序的问题。这里需要想到连续的空格变成一个空格函数应该是放在非字符字符变成空格之后的。然后单词倒排放在最后可以完成操作。

2024-02-29 11:21:01 569 2

原创 线性表——单链表的增删查改

本节复习链表的增删查改首先, 链表不是连续的, 而是通过指针联系起来的。如图:这四个节点不是连续的内存空间, 但是彼此之间使用了一个指针来连接。这就是链表。现在我们来实现链表的增删查改。

2024-02-28 21:52:09 1673 3

原创 栈和队列——c语言实现队列

本节复习队列。首先回顾队列的性质:先入先出。 队列的特点就是先入先出, 先入队列的在队列的头部, 后入队列的在队列的尾部。目录队列的全部接口准备文件创建队列的结构体蓝图队列的初始化队尾入队列对头出队列获取队列头部元素获取队列尾部元素获取队列中有效元素个数判断队列是否为空销毁队列队列的全部接口//队列的初始化void QueueInit(Queue* pq);//队尾入队列void QueuePush(Que

2024-02-28 19:28:43 838 3

原创 栈和队列——c语言实现栈

本节复习栈和队列中栈的增删查改。首先回顾一下栈的性质: 栈的存储数据的原则是“后入先出”, 先入的在栈底, 后入的在栈顶。弹出数据时在栈顶弹出。开始实现栈的接口//栈的初始化//入栈//出栈//获取栈顶元素//获取栈中有效元素的个数//检测栈是否为空//销毁栈。

2024-02-28 17:07:11 944 1

原创 指针的运算

这节主要解析几个指针运算的题加深对指针的理解。

2024-02-28 12:11:56 914

原创 线性表——带头循环双向链表的增删查改

本节复习带头循环双向链表的增删查改。带头循环双向链表的结构很完美, 是我们日常生活中使用最多的一种链表的形式。但是考的频率要少于单链表。

2024-02-27 21:10:29 951

原创 顺序表知识点——顺序表的增删查改

从本节开始, 复习数据结构。空间复杂度还有时间复杂度之后利用例题学习。这节先学习顺序表的增删查改。首先, 顺序表有点类似于数组, 都是一块连续的内存空间。如图:这就是顺序表。顺序表又分固态的顺序表和动态的顺序表。但是固态的顺序表实用性不大,在实际生活中我们很难把握数据的数量。固态的顺序表可能导致开辟的空间过大或者过小, 所以动态的顺序表就是我们的首选。现在我们主要以动态的顺序表为例, 学习一下顺序表的增删查改。

2024-02-25 22:44:45 1309 1

原创 柔性数组知识点

什么是柔性数组?柔性数组其实也是动态内存管理部分的内容。这节主要来复习柔性数组的知识点。当结构体的最后一个成员为数组, 且这个数组的大小未确定时, 我们就称它是柔性数组。如:struct stuint age;这里的adress就是一个柔性数组。(写成char adress[0] 可能报错)

2024-02-21 23:02:27 448 4

原创 动态内存管理(下)

(malloc,, calloc, free函数的用法以及注意事项等知识点)(常见的内存出错问题)---------------------------------------------------------------------------------------------------------------------------------前两节复习了动态内存函数和常见内存出错的问题。这节主要分析几个容易出错的问题加深印象。

2024-02-21 22:03:25 981

原创 动态内存管理(中)

(malloc, realloc, calloc, free函数的用法以及注意事项等知识点)另外动态内存管理因为涉及到了内存的问题, 所以很容易出错,本节回顾容易出错的点。

2024-02-20 22:08:40 368

原创 动态内存管理(上)

这节主要复习动态内存管理中的malloc, realloc, calloc, 以及free。

2024-02-20 21:40:27 853

原创 const 知识点解析

这个方法我们绕过了a变量, 直接操作地址,虽然没有语法错误, 但是不建议这样写, 因为容易出错。这个方法可以理解为,使用const 修饰 a, 虽然对于a这个变量名来说, 不能直接使用a这个变量名直接进行修改。当我们在c语言中碰到这么一种情况:我们现在有一个变量, 这个变量呢,我们指向访问它, 但不会修改它。p2是const在int* 后修饰, const修饰在int* 后的意思是p2这个变量不能修改指向。p1是const 在int* 前修饰, const 修饰在int* 前意思是p1指向的值不能修改。

2024-02-18 23:26:57 457

原创 c语言实现扫雷

1.对于扫雷游戏,我们首先应该思考一下扫雷可能是怎么实现的,我们在网页上玩的扫雷,我们对某一个坐标进行排查,如果这个坐标后面是雷,那么游戏失败,而如果不是雷,那么就会展开。那么,我们就可以想到,这里可能会用到两个棋盘,一个是展示给我们看的游戏棋盘,一个是棋盘背后的雷区。这里我们就可以想到,这个游戏我们最基本的应该创建两个棋盘,一个用来展示,一个用来判断是否触发了雷。2.然后,我们要想,我们应该怎么创建这两个棋盘,其次,创建完这两个棋盘之后要做什么。怎么创建这两个棋盘?

2024-02-17 23:43:21 1492

原创 结构体实现位段

下面是一个定义的位段这里成员后面的数字代表比特位。int a : 1;代表a只占一个比特位。位段中的元素只能是int, char, 或者unsigned char 等等。

2024-02-16 23:54:19 718

原创 枚举知识点解析

枚举是什么?枚举就是列举, 将东西一一列举出来。生活中有许多地方需要用到枚举, 比如一年有12个月,一星期有7天, 这些都需要进行枚举。那么, 如何进行枚举的定义呢?如下枚举中的值是一种常量。而这个常量的值可以修改, 规则如下:枚举中的元素如果不进行赋值的话, 第一个默认为0, 第二个元素为1, 以此类推。但是如果将第一个元素进行赋值, 假如复制成为1, 那么第二个元素就会是2, 以此类推。如果枚举中的每个元素都不是连续的话, 那么也可以将其进行分别赋值。

2024-02-14 23:32:13 782

原创 联合体知识点解析

联合体:联合体也是一种自定义类型, 特点是成员变量公用一块空间。所以也叫共用体。

2024-02-09 22:58:17 683

原创 结构体的大小以及内存对齐问题

结构体的对齐 就是 结构体类型数据在内存中按照一定的对齐规律储存。结构体的对齐归根结底其实就是用空间换取时间的做法。至于为什么可以用空间换取时间呢?请看这么一张图:假如一个结构体的数据像图中这样摆放。如果一个cpu读取数据, 是按照8个字节8个字节的规律进行读取。那么他从a的首地址开始读取,第一次读取可以将int读完, 但是此时只读取了一半的double 类型的b, 想要完全读取b还要再多读取一次,这就造成了时间的浪费。但是, 如果按照结构体对其规律进行数据存储呢?

2024-02-08 23:26:35 1458

原创 结构体的特殊声明和自引用

结构体我们通常是这么声明的:int age;int num;或者int age;int num;}s1, s2;这是我们正常的声明方式, 也是正规的声明方式, 第二种是声明的同时创建了变量s1, s2。但是结构体的声明方式也包括一种特殊的声明方式——不完全声明。下面是不完全声明:structint a;int b;int c;}a, b, c;这种结构体只能在创建该结构体蓝图时创建变量。之后这个蓝图就再也无法使用。

2024-02-06 22:11:25 732

原创 typedef

而P_int就不会发生这种情况, 因为typedef重定义int* 后, 已经将P_int类型作为新的一种类型, 这个类型的类型名是P_int,类型和int* 一样。我们可以看到, 这里的pd并不是int * 类型, 而是一个int类型, 那么为什么会是这样呢, 因为宏会在预处理阶段将定义重现转化为原来的东西。在预处理阶段,P_INT被转换成立int*, 但是我们直到, 这个int* 是不能作用于pd的, 想要令pd也是指针必须在pd前面加*。增加了程序的可维护性。P_int_ 5就是我们要的类型名。

2024-02-03 22:28:03 763

原创 转移表实现计算器

通过函数指针数组, 可以将需要计算的函数地址保存下来, 这样就算多加许多需要计算的函数,也能使代码显得不是过于荣冗余。以上就是一个简易的计算机。函数主体部分可见有些冗余。如果使用转移表的话,就会优化很多。do while循环是为了多次进行计算,只有输入为0时才会推出。而switch有利于这种选择类问题。

2024-02-02 21:32:08 426

原创 指针的深入理解(四)

sizeof(&arr) : 上面已经说过,arr只有在两种情况下表示的不是首地址(首地址是个常量,常量无法进行取地址),一种sizeof,一种&arr, &arr的值仍旧是arr常量的值, 但是类型不同。可以理解为arr本身就是一个数组的首地址,可以进行整数加减运算,进行加一运算后仍是一个地址,这个时候的arr + 1只是一个地址,没有别的特别意义。) : arr只有在两种情况下不是数组的首地址,一种情况就是sizeof运算符操作时,也就是这种情况,这总情况下arr代表的是整个数组, 是一个对象。

2024-02-01 20:32:56 1103

c语言贪吃蛇-项目实战

贪吃蛇游戏代码

2024-04-20

基于顺序表的通讯录, 属于小型的实战项目, 巩固顺序表

基于链表的通讯录, 属于小型的实战项目, 巩固顺序表

2024-04-07

哈希map以及set的封装

哈希map以及set的封装 使用的是开散列也就是哈希桶的方法设计的哈希表, 然后封装的map以及set

2024-04-05

map与set的底层大概框架-红黑树

这是一个红黑树大框架, 红黑树之中比较重要的就是旋转操作。 在本文件中, 两个旋转操作都包含在内。 接口主要有插入, 寻找, 判断是否为一棵红黑树等等的代码。 一共五百行左右。 学习map和set的友友们如果对红黑树的底层框架很模糊。 可以借鉴一下本文件中的红黑树。 虽然有些地方写的不够全不够好, 但是基本的迭代器功能都已经实现。其实红黑树的学习主要就是学习它的插入, 最重要的就是根据红黑树的插入操作了解红黑树是如何进行旋转的, 可以根据情况将红黑树的旋转分为三个情况。具体的情况分析, 文件中都进行了讨论。 相较于AVL树的旋转, 红黑树的旋转要更加简单一些。 思路不变, 但是不用像AVL树一样检查平衡因子。另外一个难点就是红黑树的迭代器的自增自减操作, 红黑树的自增操作需要用到二叉树的非递归遍历思想,主要是一个非递归的中序遍历。 看不懂的友友可以去力扣搜一搜相应的二叉树非递归题目。做一做, 就可以很好的理解红黑树迭代器的加加和减减。 只要懂了加加, 减减也就懂了。 另外, 带头红黑树的加加和减减和普通红黑树的注意点有些不同。 要注意的是本文件实现的是带头的红黑树。

2024-04-04

空空如也

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

TA关注的人

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