自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++初阶:模版初阶【范式编程】【函数模板】【类模板】

/ 类模版public:_size = 0;// 模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误// 扩容++_size;

2024-07-20 19:58:39 103

原创 C++初阶:类和对象(下)【再探构造函数】【类型转换】【static成员】【友元函数】【内部类】【匿名对象】

(1)之前我们实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有⼀种方式,就是初始化列表,初始化列表的使用方式是以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟⼀个放在括号中的初始值或表达式。public里就是初始化列表。(2)每个成员变量在初始化列表中只能出现一次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地方。因为初始化列表被认为是成员变量初始化定义的地方,且成员变量只能定义一次,所以成员变量只能出现一次。(3)

2024-07-15 20:27:39 838

原创 C++初阶:类和对象(中)【类的默认成员函数】【构造函数】【析构函数】【拷贝构造函数】【赋值运算符重载】【取地址运算符重载】

默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。⼀个类,我们不写的情况下编译器会默认生成以下6个默认成员函数。

2024-07-14 18:38:10 727

原创 C++初阶:类和对象(上)【类的定义】【实例化】【this指针】

(1)class为定义类的关键字,后面跟类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。(2)为了区分成员变量,一般习惯上成员变量会加一个特殊标识,如成员变量前面或者后面加_ 或者m开头,注意C++中这个并不是强制的,只是些惯例,具体看要求。(3)

2024-07-11 20:56:20 568

原创 初识C++【引用】【inline】【nullptr】

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同⼀块内存空间。比如:水浒传中李逵,宋江叫"铁牛",江湖上人称"黑旋风 ";林冲,外号豹子头。简单来说,引用就是起外号。打印出来是这样的:也就是说,引用其实就是给一个变量在起一个名字,并不会重新创建额外空间。

2024-07-10 18:40:05 1036

原创 初识C++【命名空间】【输入输出】【缺省参数】【函数重载】

1.定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员(值得注意的是在{}后面不加;命名空间中可以定义变量/函数/类型等。//在命名空间里可以是变量、函数和类型int* a;int main()// 这里默认是访问的是全局的rand函数指针// 这里指定lwz命名空间中的randreturn 0;

2024-07-09 18:52:39 739

原创 排序(3)【归并排序】【计数排序】【排序算法度及其稳定性分析】

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有 序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

2024-06-19 13:05:09 626 2

原创 排序(2)【选择排序】【快速排序】

选择排序就是选择一个数组的最大的数字或者最小的数字,放在一整个数组的最后或者开头的位置。

2024-06-17 10:35:47 1071 4

原创 数据结构:排序(1)【冒泡排序】【插入排序】【堆排序】【希尔排序】

排序的时间复杂度: 在建堆完成后,堆顶元素一定是最大的元素,将堆顶元素与最后一个元素交换,然后对剩下n-1个元素进行堆调整,再将堆顶元素与倒数第二个元素交换,以此类推。根据动图我们可以看出冒泡排序和插入排序的差别,冒泡排序是旁边的两个元素两两比较,而这个插入排序是不断的往左比较,遇到比自己大的就交换。在最坏的情况下,整个数组都是逆序排列的,这个时候排列的次数最多,时间最长。我们依然是假如我们的数据刚好是逆序的,每个元素都需要和前面的所有元素进行比较交换,此时我们需要排列的的次数最多,时间最长。

2024-05-30 21:35:06 723

原创 二叉树OJ题目

有这样的一个思路:我既然要求第k层的结点个数,我肯定是要用到递归,那么当我在递归到第k层的时候我就开始判断,这一层是不是我所需要的那一层,如果是,就计数有几个节点,如果不是,就继续递归。就像这个图:我们在往下递归的时候,我们的k也随之递减,当k为1的时候,这里就是我们要求的那一层。

2024-05-25 18:56:27 903

原创 数据结构:树(3)【二叉树链式结构实现】【二叉树的前序,中序,后序遍历】【求二叉树全部结点个数】【求二叉树叶子结点个数】【求二叉树的深度】【单值二叉树】

二叉树的链式结构的实现相对于顺序结构的实现就没有那么多的讲究了。就是普通的链表,只不过多了一个指向的指针。我们其实就可以直接简单的手搓一个链式结构的二叉树了。然后就可以弄成二叉树了:逻辑结构就是这样的:这里链式结构比较简单,就不过多的介绍了。主要是后面的遍历,那些题目需要用到递归思想,有些难。

2024-05-23 14:39:06 1052 1

原创 数据结构:树(2)【堆排序】【堆排序的时间复杂度】【topk】

之后的就是什么说的为什么上面代码for循环里的i等于(n-1-1)/2。其实这句话的意思就是从第一个非叶子节点开始向下调整。比如上图中的,如果要调整的话,我们就会从30这个数的位置开始调整。n代表堆里有多少个数据,n-1就是最后一个节点的下标,n-1-1除以2就是最后一个节点的父亲节点,然后在进行向下调整。

2024-05-21 20:07:41 579

原创 数据结构:树(1)【树的概念及结构】【二叉树的概念及存储结构】【二叉树的顺序结构及实现】

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。我们所看到的最上方的那个节点称为根结点,根节点没有前驱结点除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继注意:在子树中,子树之间不能有交集。否则就不是树形结构。关于树的一些名词大家还是要了解一下的。结点的度。

2024-05-17 21:38:32 856 1

原创 栈与队列OJ题【括号适配问题】【用队列实现栈】【用栈实现队列】【设计循环队列】

这一道题我们就可以用栈来解决:不了解栈的可以看我的上一篇博客。这个题主要需要注意的地方就是我们入栈入的都是左括号,右括号就单独的一个一个的与栈里的左括号相匹配。总的来说不算难,就是让我们了解一下栈的应用。

2024-05-13 22:51:20 293

原创 数据结构:栈和队列

栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除的一端称为栈顶,另一端称为栈底。栈里的元素遵循后进先出的原则。简单的说就相当于一个羽毛球筒,我们把羽毛球放进羽毛球筒,当我们想要把羽毛球一个一个的拿出来,那么我们第一个放进去的羽毛球就是我们最后拿出来的。

2024-05-10 21:00:58 774

原创 链表OJ:【环形链表】【环形链表二(找环形链表的头)】【随机链表的复制】

简单的说一下这个题要表达的意思,其实就是判断我们的链表里有没有环形。这种链表我们是不能遍历的,因为我们判断出循环的条件是为NULL,用这个条件的话会导致死循环。解决这个题的思想就是要清楚如果是环形我们需要什么条件(因为我们都是在一个圆圈里面循环的走,用快慢指针一直在圆圈里面转圈,如果存在相等那么这个链表就存在循环链表)。在这里给大家画个图:这里的直线就代表不是环形链表的一部分,圆就代表是环形链表的一部分。

2024-04-30 18:29:22 1003 2

原创 项目实践:贪吃蛇

Windows这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外,它同时也是⼀个很大的服务中心,调用这个服务中心的各种服务(每⼀种服务就是⼀个函数),可以帮应用程序达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序(Application),所以便称之为Application Programming Interface,简称 API 函数。WIN32 API也就是Microsoft Windows 32位平台的应用程序编程接口。

2024-04-20 23:03:04 1070

原创 游戏实践:扫雷

虽然很多人玩过这个游戏,但还是介绍一下。在下面的格子里,埋的有10颗雷,我们通过鼠标点击的方式,点出你认为不是雷的地方,等到把所有没有雷的格子点完之后,及视为游戏胜利。上面的数字的意思就是它的一圈的格子有几颗雷。明白了游戏的玩法,那么我们就可以来写一下这个游戏。

2024-04-15 21:13:33 865 2

原创 数据结构:双向链表

最常用的链表就是单链表和双向链表。我们首先要知道,链表有八种分类。单链表是不带头单向不循环链表。而此篇博客要讲的是带头双向循环链表。结构如下:注意:带头链表里的头节点,实际为“哨兵位”,哨兵位节点不存储任何有效元素,只是站在这里“放哨的”。它存在的意义就是遍历循环链表避免死循环。我们所说的双向链表为空,跟单链表不同,双向链表就是只存在哨兵位。双向链表的实现就比单链表简单的多了。

2024-04-13 19:33:22 609 1

原创 单链表的一些练习【移除数组元素】【反转链表】【链表的中间节点】【合并两个有序链表】【约瑟夫问题】【分割链表】

下面是三种测试结果,分别对应三种情况: 这个就是需要单独判断一下传参过去的链表为NULL的情况。然后通过三个指针的移动来实现链表的反转。四.合并两个有序链表五.环形链表的约瑟夫问题 六.分割链表 做完这些题关于链表的知识我们基本上也有了一定的认识。感谢大家的观看,如有错误,请大家多多指出。

2024-04-12 22:52:05 495 1

原创 数据结构:单链表

因为我要改变第一个结点的指针,所以我们要用二级指针来改变它(如果用一级指针的话,在函数中会创建一个指针叫pphead,我们在之后给pphead赋值的时候,改变的就只是pphead,pphead指向了新节点,而不是我们真正的头结点)。提醒一下,后面在找尾的时候,其实就不需要用到二级指针了,因为我们进行的尾插操作,不再需要改变头节点,此时我们改变的是结构体内部的数据next。上面的*pphead=NULL的操作,如果是一级指针,我们只把pphead置为NULL了 ,而原来指向的头结点的指针没有置为NULL。

2024-04-10 21:59:01 1766 3

原创 题目:【序列中删除指定数字】【变种水仙花数】【数组串联】【交换奇偶位】【offsetof宏的实现】

(((s*)0)->m)),我们知道&的作用是拿地址,拿到的是相较于0号地址->m的地址(m的地址号其实就是偏移量,所以我们下面就需要一个强转的东西)。0000 0000 0000 0000 0000 0000 0000 1101我们就需要把奇数位给提取出来,这里我们需要用到&操作符。得出来的结果就是 : 0000 0000 0000 0000 0000 0000 0000 1000。得出来的结果就是 : 0000 0000 0000 0000 0000 0000 0000 0101。

2024-04-07 22:10:50 679 1

原创 数据结构(顺序表)

顺序表是线性表的一种。线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储。案例:蔬菜分为绿叶类、瓜类、菌菇类。线性表指的是具有部分相同特性的⼀类数据结构的集合 如何理解逻辑结构和物理结构?

2024-04-05 16:21:39 1230

原创 预处理详解

define reg register //为 register这个关键字,创建⼀个简短的名字;) //⽤更形象的符号来替换⼀种实现,这里是把forever定义为了一个死循环的for循环,以后在使用的时候这就是一个死循环case //在写case语句的时候⾃动把 break写上。// 如果定义的 stuff过⻓,可以分成⼏⾏写,除了最后⼀⾏外,每⾏的后⾯都加⼀个反斜杠(续⾏符)。在进行预编译的时候,#define定义的东西会被完全替换掉。

2024-04-04 22:09:03 1600

原创 编译和链接

我们平时写的所有的代码,其实都是文本信息,我们的代码是不能直接执行C语言代码的,计算机所能执行的是二进制的指令。想让计算机读懂我想要干什么,就需要把我们写的代码转化为二进制的指令(就是编译器的作用)。

2024-04-03 22:14:58 1476

原创 文件操作(2)【文件的随机读写】【文件读取结束的判定】

这个函数可以根据文件指针的位置和偏移量来定位文件指针(文件内容的光标)。当我把第一个字符a给读取出来后,光标就移动到了b的位置,但是我这里使用了fseek,SEEK_CUR是从当前位置开始,偏移量为4,直接走到了f这里。如果是用另外两中的话,只需要改变偏移量就可以随便读取我们想要的地方。

2024-04-02 16:00:00 805 1

原创 文件操作(1)【文件打开和关闭】【文件的顺序读写(各种函数)】【sprintf和sscanf的理解】

在程序设计中我们一般谈的文件有两种:程序文件和数据文件。

2024-04-01 12:54:02 856

原创 动态内存管理【malloc,calloc,realloc和free的理解】【柔性数组的概念】

当我们在申请空间后,不再用这块空间了,虽然,当程序结束的时候,操作系统会回收这一块空间,但最好是我们主动去用free释放,尽量做到谁(函数)申请的空间谁释放。因为如果我的这块空间一直不退出的话这一块内存就一直被占用着,谁也用不了。如果不能释放,要告诉使用的人,要记得释放。

2024-03-30 15:29:05 1229 1

原创 自定义类型:【联合体和枚举】

联合体像结构体一样,也是有一个或者多个成员组成,当然也可以不同的类型。但不同的是,比编译器只为最大的成员分配足够的内存空间,所有成员共用同一块内存空间。所以联合体也叫做:共用体。联合体与结构体最不同的是,给联合体里的一个成员赋值,其他的成员也会随之变化。联合体的声明其实也跟结构体大体一样其实就是把struct给换成了union。

2024-03-29 22:21:21 951 1

原创 自定义类型:【结构体】

位段,位段。这个位其实指的就是二进制位,关于位段先介绍几点需要注意的地方。1.位段的成员必须是int,unsigned int或signed int,在C99中位段成员的类型也可以选择其他类型。2.位段的成员名后面有一个冒号和一个数字(这个数字指的就是有多少个二进制位,也就是多少bit位)。int b : 5;int c : 10;int d : 30;我们知道一个整型是有四个字节的,32个比特位。

2024-03-28 21:16:58 1158

原创 数据在内存的存储(2)【浮点数在内存的存储】

根据根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V都可以存储为这样的形式:(1)(-1)^S表示符号位,当S为0时,V为正数;S为1时是负数。(2)M表示有效数字,M是大于等于1,小于2的(3)2^E表示指数位。举个例子:比如5.0,写成二进制是101.0,相当于1.01*2^2。则S=0,M=1.01,E=2.比如-5.0,相当于-1.01*2^2。则S=1,M=1.01,E=2.

2024-03-26 16:00:00 981

原创 数据在内存里的存储(1)【整数在内存中的存储】【什么是大小端】

在超过一个字节的数据在内存中存储的时候,就会出现存储顺序的问题。按照顺序,我们就会有大端字节序存储和小端字节序存储。这里可以看到,我给a的值是0x11223344。但是在内存中这个方向就完全反了过来。变成了44332211。这个就是我们说的小端字节存储。小端字节序存储:把一个数据的低位字节的内容存储到低地址处,而高字节的的内容存储到高字节处。大端字节存储:把一个数据的高位字节的内容存储到低地址处,而低字节的的内容存储到高字节处。大小端存储跟计算机架构有关。我用的是vs2022,用的是小端存储。

2024-03-25 16:00:00 556

原创 C语言内存函数(2)【memset函数的使用】【memcmp函数的使用】

这个函数有三个参数。这个函数的作用是设置。我就简单用代码来试一下这个函数的作用。这里主要要注意的是,这里的5是以字节为单位的。所以用这个函数来设置整型是做不到的,因为整型有四个字节。比如这个代码的结果不是我们期望的那样。那么这个函数大家可能就了解了用法,我们再来看一个函数。

2024-03-24 16:00:00 338 1

原创 C语言内存函数(1)【memcpy函数的使用与模拟实现】【memmove函数的使用和模拟实现】

关于内存函数有四个函数需要我们学习。分别是memcpy,memmove,memset和memcmp。都在头文件string.h里面。

2024-03-23 20:49:36 1215 1

原创 字符串函数(3)【strstr函数的使用与模拟实现】【strtok的使用】【strerror的使用】

这个函数是一个查找函数,比如在一个字符串中查找另一个字符串是否出现。也是有两个参数这个函数返回的是字符串str2在字符串str1中第一次出现的位置。可以写一个代码来看一下。这个输出的最终结果是is is an apple。这里还要提一下,如果str1里没有符合的字符串,那就返回一个空指针。

2024-03-21 16:00:00 1860 1

原创 字符串函数(2)【strcat的使用和模拟实现】【strncat的使用】【strcmp的使用和模拟实现】【strncmp的使用】

关于这个函数,跟strcpy函数一样,都是有两个参数,源字符串和目的地字符串。简单的说这个函数的作用就是在目标字符串后面追加字符串。有几点也需要注意。(1)源字符串必须以'\0'结束(2)目标字符串中也要有\0,否则没办法知道追加从哪里开始。(3)目标空间必须足够大,能容纳下源字符串的内容(4)目标空间必须可以修改。我先简单实现一下这个函数。这个最终的输出结果就是helloworld。这个主要就是注意一下两个字符串末尾都必须要有\0。

2024-03-20 16:00:00 1430 1

原创 字符串函数(1)【strlen的使用和模拟实现】【strcpy的使用和模拟实现】【strncpy的使用】

我先简单介绍一下strlen的功能和返回值,我们知道,字符串以'\0'为结束标志,(1)而strlen统计的是'\0'之前的所有的字符个数。(2)注意strlen的返回值是sizeof_t类型,是无符号的(3)strlen的实现必须包含头文件string.h。关于这strlen有很重要的点需要注意,先给大家看一个代码。这串代码的最终打印出来的是>,这里明明是3减去6为什么最终结果是大于呢?

2024-03-19 16:00:00 783 1

原创 深入了解指针(3)【数组指针变量】【函数指针变量】【typedef关键字】

说到数组指针,那必然要说一下指针数组,指针数组是什么呢?指针数组是一种数组,只不过这种数组存放的是地址(指针)。那把这两个词反过来,数组指针是什么?它是指针变量,还是数组?答案是:指针变量。这个指针有些特殊,它存放的是数组的地址,它是能够指向数组的指针变量。思考一下 int* p1[10] 和 int(*p2)[10]分别代表的是什么。int* p1[10]这里的p1是指针数组,有十个元素,每一个元素都是指针。p2是指针变量,指向的是一个大小为十个整型的数组。

2024-03-18 18:27:34 1146

原创 深入了解指针(2)【指针与数组】【二级指针】

关于数组,我在上次的博客中也提到了一些比较重要的知识点。首先就是数组名,数组名只有在两种情况下代表的是整个数组的地址,一个是在sizeof里面,一个是用&符号。那么为什么我们可以用指针来访问数组呢?因为数组在内存中是连续存放的,只要我们找到第一个地址,那么后面的地址不也是手到擒来的吗。我们先想一个简单的代码,先假设有一个数组a[10],这个数组的元素让我们去输入,而我想要把这十个元素按照顺序依次输入,是不是一下就可以想到咱们可以用for循环,创建一个变量i,依次递增很轻松就能写出这样一个代码。

2024-03-16 17:13:34 1052 1

原创 assert断言

assert接受一个表达式作为参数,如果表达式为真,assert不会有任何作用,程序会继续运行。如果已经确定程序没有问题,不需要在做断言,就在#include<assert.h>前面加上#define NDEBUG。如果程序又出现了问题,把#define NDEBUG注释掉,就相当于重新启用了assert()。assert是一个库函数,它的头文件是assert.h,用于在运行时确保程序符合指定条件,如果不符合,就会报错终止运行。但也是有缺点的,因为引入了额外的检查,增加了程序的运行时间。

2024-03-11 15:30:00 452

空空如也

空空如也

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

TA关注的人

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