- 博客(49)
- 收藏
- 关注
原创 c++初阶——类和对象(下)
1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)引用成员变量const成员变量自定义类型成员(该类没有默认构造函数)3. 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。4. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关explicit关键字我们先来看下面的一段代码。
2024-04-27 16:10:22 751
原创 c++初阶——类和对象(中)
大家看我们在调用fund2时是采用值拷贝,将实参的值拷贝给形参,_add指针存放的是一个指向动态开辟空间的地址,在值拷贝时,将值拷贝,当fund2函数结束时要销毁栈帧,就会将_add指针指向的空间一起销毁,然后当我们的程序走完后又会自动调用析构函数,又会将这块空间再次free一次,所以这里程序崩溃了。(这里编译器是强制报错的)我们知道类在调用成员函数时有一个this指针,它是指向调用函数的对象的,它的类型是date*的类型而我们调用函数的对象是从const date的类型,所以无法调用,那怎么才能调用呢?
2024-04-25 16:42:57 856
原创 c++入门
命名空间的使用那我们这么使用命名空间中定义内容呢?为什么我们这里会报错啊?我们在上面已经说了,命名空间定义了一个新的作用域,命名空间的内容都局限在该命名空间中,我们的程序在编译阶段会现在本地去找变量,当找不到时就报错了。我们接下来看看命名空间的使用方法1,
2024-04-16 18:34:43 1184
原创 c++前言
C++基础 (平平常常) 挑选一本入门书籍,如《C++ Primer》、《C++大学教程》或Stroustrup撰写的经典 《C++程序设计语言》或他一年半前的新作《C++程序设计原理与实践》,而一般C++课程也 止于此,另外《C++ 标准程序库》及《The C++ Standard Library Extensions》可供参考;因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的 程序设计,还可以进行面向对象的程序设计。
2024-04-15 16:09:41 509
原创 数据结构——排序
将已有序的子序列合并,得到完全有序的序列;:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;在此之前我们先把准备工作做好,为了可以直观的看出各个排序的速度,以及更有条理,我们还是老样子分装三个文件,rost.c用来写各个排序的实现函数,rost.h放函数的头文件,test.c我们来进行函数的测试与比较。
2024-04-11 16:44:15 1036
原创 数据结构——二叉树(OJ练习)
这一题可跟我们前一期的前序遍历有所不同,我们仔细观察一下他给我们的参数是一个二叉树的根和一个int*的指针,这个指针是输出型指针,也就是说这个指针是出题人用来获取二叉树节点个数的,而这个函数的返回类型是int*,它要我们返回一个存储二叉树数据的数组,所以我们这里最好动态开辟内存来存储,我们仔细观察该对称二叉树,我们发现互相对称的节点它们的左子树与右子树分别相等,这就是突破口,我们可以重新创建一个函数,将参数分成两个一左一右两个节点,然后向下比较,这个过程与上一题类似。我们可以从这道题找出二叉树创建的函数。
2024-04-08 16:51:41 846 1
原创 数据结构——二叉树链式结构的实现
设二叉树的根节点所在 层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层 上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。要实现这个函数我们先要知道我们是用递归实现的我们返回x的节点时是一层一层返回的,所有我们找到x后要逐层返回x的指针,思路是比较简单的找到x的节点我们就逐层返回没找到我们就返回NULL。我们遍历二叉树,如果遇到叶子节点我们返回1,如果遇到空指针返回0.那我们终止递归的条件是不是出现了?
2024-04-07 17:11:52 1075
原创 数据结构——队列
我们首先要创建一个链表结构,用于存储数据,然后创建一个队列结构用于记录队列的基础数据。队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,我们创建一个链表结构和队列结构的指针,(还是分装在一个测试函数中)我们发现队列刚好与栈相反,那我们下面来实现一个队列。大家好我是小锋,今天我们来学习队列。出队列:进行删除操作的一端称为队头。入队列:进行插入操作的一端称为队尾。下面我们才开始进行队列操作。我们可以来测试一下这个队列。获取队列中有效元素个数。这里我们用链表来实现。
2024-03-30 19:10:41 633
原创 数据结构——栈
那么大家思考一个问题我们在压栈1,2,3,4,它出栈就是4,3,2,1,吗?这里有两种版本的顺序表静态的实际应用不大,我们用动态的版本来实现链表。以上就是全部内容了,如果有错误或者不足的地方欢迎大家给予建议。栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。其实不一定我们可以边压栈边出栈它的顺序也可以是1,2,3,4,压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。这里的操作都是顺序表的常规操作了我就不细说了。大家好我是小锋,今天我们来学习一下栈,
2024-03-30 16:12:27 993 2
原创 数据结构——链表(双向链表)
这时我们就要用到断言了,但我们发现断言的条件也不好写,这时我们的bool类型就要大展身手了。大家好,我是小峰,今天给大家讲解的是双向链表,我们先来看看链表的结构。以上就是全部内容了,如果有错误或者不足的地方欢迎大家给予建议。来很多优势,实现反而简单了,后面我们代码实现了就知道了。这个代码是有点小问题的大家可以想想如果参数只有头节点呢?那接下来我们就可以测试一下我们写的尾插数据。我们排列一些就可以看出链表的结构种类。我们今天讲解的是双向带头循环链表。它就会报错,并提示我们在哪一行。在pos的前面插入数据。
2024-03-29 16:31:12 411
原创 数据结构——链表(练习题)
这道题我们的思路是分别找出长的链表与短的链表节点个数然后用长的节点数减去短的节点数得到的数就是长的链表比短的链表多出的节点个数然后创建两个指针long,short,long先走多出的个数然后再一起走当long与short指向的next相等时就找到了相交节点。让我们来看看这道题,我的思路是快慢指针,类似追击问题,我们创建两个指针一个指针以一次两个节点的速度走下去,一个指针一次一个节点走下去,如果是有环的链表那么指针一定会相交,如果不是环形链表那么快的会遇到NULL。大家好,我是小锋我们继续来学习链表。
2024-03-28 19:43:48 2078
原创 数据结构——链表(单链表)
我们想一想在链表的头部插入数据我们只需要开辟一个链表空间mon然后另它的next指向当前链表的表头的地址,并将mon的地址交给表头的指针是不是就可以插入数据并且将链表连接起来了?我们通过图可以看出尾插数据要开辟一个新的节点然后让原链表的最后一个节点的next指向新开辟出来的节点并将新开辟的节点的next为空。这个就是链表的逻辑结构了,一个节点中有指向下一个节点的指针,这样走下去最后一个节点中放的是空指针NULL,像链条一样一环扣一环。这里开辟一个新的链表空间我们还会用到所有我们用一个函数来实现。
2024-03-26 20:24:17 1964 1
原创 数据结构——顺序表
我们可以看出这种定长的数组能存储多少数据一开始就已经规定好了,那我们可不可以弄一个动态的表,如果空间满了我们可以动态开辟空间?这里与前面一样也是覆盖删除,要注意的是保证pos的位置比SZ小或者相等,还要保证删除的次数不能大于SZ。接下来我们来讲尾删数据,其实很简单,我们只需要把SZ--就行了,但是要注意断言SZ要大于0,大家有没有发现顺序表的操作与我们写过的通讯录特别相似,因为通讯录的底层逻辑就是顺序表。这里我们要注意的是我们不能在没有数据的地方插入。我们断言是比较暴力的解决方法,我们还有温柔的解决方法。
2024-03-25 20:34:05 1095 1
原创 c语言——通讯录(文件版)
选择上面功能我们就实现什么功能我们是不是要用到switch语句来实现,功能选择又不是只选一次,所以我们还要在外面嵌套循环,我们不论如何都要进行选择所以我们应该用do while循环。接下来我们还有退出函数还未实现,如果我们直接退出通讯录中的数据是不是销毁了,所以我们把通讯录的信息写入文件中,这样我们再次打开通讯录时,再从初始化中读取出来。我们的通讯录要存储多少个人的信息我们不知道所以我们可以动态开辟内存当内存不够是我们可以开辟内存所以我们再创建一个通讯录结构体变量。接下来我们一一实现通讯录的功能。
2024-03-23 17:07:49 467
原创 程序环境和预处理
我们来举些例子这里我们用gcc来观察预处理之后的现象我们可以看到语句也可以替换,(注)在define定义标识符的时候,尽量不要在最后加上;因为在替换时;也会替换。
2024-03-22 17:17:50 726
原创 时间复杂度和空间复杂度
大家好我是小锋,今天给大家带来的是时间复杂度和空间复杂度。在正式讲之前我想问问大家我们如何去衡量一个算法的好坏就像这个计算斐波那契数列的函数它非常简洁但越简洁就代表算法越好吗?算法在编写成可执行程序后,运行时需要耗费时间资源和空间内存资源。因此,即时间复杂度和空间复杂度。。在计算 机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计 算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。时间复杂度的定义:在计算机科学中,
2024-03-21 20:06:29 861 1
原创 c语言文件操作
我们前面学习结构体时,写了通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录程序的时候,数据又得重新录入,如果使用这样的通讯录就很难受。既然是通讯录就应该把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在。这就涉及到了数据持久化的问题。我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据库等方式。使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。
2024-03-21 13:41:11 629
原创 动态内存管理
这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己 来决定。如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。函数free,专门是用来做动态内存的释放和回收的。如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
2023-03-29 23:04:03 159 1
原创 自定义类型详解(2)
位段的声明和结构是类似的,有两个不同:1.位段的成员必须是 int、unsigned int 或signed int。2.位段的成员名后边有一个冒号和一个数字。联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。通过上图我们可以很明了的看见联合体的特点:联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联 合至少得有能力保存最大的那个成员)。
2023-03-21 21:37:23 158 1
原创 自定义类型详解(1)
我们知道结构体相当于一种类型,跟 int,char 这些类型属性相似我们怎么用int,char定义变量就怎么用结构体类型创建变量。
2023-03-19 21:01:23 116
原创 用冒泡排序模拟实现qsort函数
要模拟实现函数我们要先学习qsort函数通过上图我们可以知道函数的基本信息qsort函数是基于快速排序思想实现的排序函数basenumwidthcompareelem1elem2既然我们要用冒泡排序来实现它那让我们来看看冒泡排序怎么排序数组接下来我们用冒泡排序的思想来实现qsort函数。
2023-03-17 23:01:44 98
原创 c语言——指针进阶(4)
大家好,我是小锋,指针进阶我们已经学习完了,下面我们来做一些练习,为大家加深理解大家看看程序输出什么?要解决这道题我们要知道这个数组是怎么存储在内存中的这一道题其实有坑我们看在初始化数组是用的是()而不是{},这里的()是逗号表达式所以数组存储应该是这样的所以输出是作这一道题我们要画图。
2023-03-15 23:14:34 89
原创 c语言指针——进阶(3)
大家好,我是小锋今天我们来继续学习指针大家看看一下代码 它的输出是什么? 大家来看看一下代码,看看它们输出什么?上面的数组内存放的是字符,那如果是字符串呢? 我们再来看看指针与字符串
2023-03-14 20:58:43 78
原创 C语言——指针(2)
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与 指向第一个元素之前的那个内存位置的指针进行比较。答案当然是不行指针存放的地址就行写再信封上的地址我们可以通过地址找到变量但却不能通过改变信封上的地址就使实际上的地址发生改变。我们知道指针中存放的是地址那我们可不可以通过改变指针中的地址从而达到改变变量的地址的目的。我们可以看到指针所指向的地址正是数组对应元素的地址,说明可以用指针来访问数组。指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?
2023-03-06 21:56:32 90
原创 c语言——指针(1)
指针是什么?大家好我是小锋今天给大家带来的是指针的讲解指针是什么?指针理解的2个要点:1.指针是内存中一个最小单元的编号,也就是地址2.平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量指针就是地址,口语中说的指针通常指的是指针变量指针变量我们可以通过(取地址操作符)取出变量的内存其实就是地址,把地址可以存放到一个变量中,这个变量就是指针变量。
2023-03-05 22:32:13 156 1
原创 c语言——详解操作符(2)
大家好,我是小锋紧接上文我们继续讲解逻辑操作符为了让大家更好的了解逻辑操作符给大家看一组代码对于逻辑与,当遇到为假时后面就不用进行运算了。对于逻辑或,当遇到为真时后面的就不用运算了。
2023-03-05 18:48:57 129 1
原创 c语言——详解操作符(1)
大家好今天为大家详细讲解操作符这些操做符很简单主要用来计算1.除了操作符之外,其他的几个操作符可以作用于整数和浮点数。2.对于操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。3.操作符的两个操作数必须为整数。返回的是整除之后的余数。要想理解位移操作符首先我们要知道整数在内存中的存储。
2023-03-04 20:06:47 221 1
原创 不创建额外变量,交换数字
大家好我是小锋这个问题我们在刚学编程的时候就学过创建一个变量来临时存储一个数字,就像这样:当我们不创建变量时我们有多种方法。
2023-02-06 17:29:20 73 1
原创 用函数实现冒泡排序排列整形数组
要答对这道题我们首先要知道什么是冒泡排序:冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
2023-02-01 20:56:58 183 1
原创 C语言——函数(2)
我们一般是把函数放在主函数的前面,但现在我们把函数放在主函数的后面,代码依然可以运行但是却报警告了,这是因为在编译时,电脑事先不知道有这个add函数但是我们却使用了。系统分配给程序的栈空间是有限的,但是如果出现了死循环,或者(死递归),这样有可能导致一 直开辟栈空间,最终产生栈空间耗尽的情况,这样的现象我们称为栈溢出。在我们写比较大的代码时往往我们会定义多个函数都放在一个文件中会很复杂所以我们要分模块来操作,比如将函数的声明,实现,使用分成多个模块。存在限制条件,当满足这个限制条件的时候,递归便不再继续。
2023-01-28 16:45:17 143
原创 在一个有序数组中查找具体的某个数字n
其实当看到这个题目时我的第一想法是遍历数组,就像这样这样的确可以找到,但是效率太低了,如果数据很多,一个一个遍历的找太慢了,这里我们仔细读题发现这是个有序的数组,那么我们就可以用二分查找法。
2023-01-26 12:13:00 475 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人