自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux基础指令

注意到我们上图中 ls -a指令我们可以展开以.开头的隐含的文件,那么什么是隐含的文件呢?这里我们注意一下tree指令,我们说了文件系统相当于就是一棵树,所以tree就是将文件树给展开。接下来是本节最后一个指令,是mv指令,这是一个剪切指令,可以将目录剪切到其他目录底下。首先是ls类型的指令,这类指令可以让我们看见当前文件目录下的文件。我们为什么要通过文件路径来找到相应的文件或者目录呢?今天我们要来探究Linux中的基础的指令。下面我们要来看看拷贝的指令:cp指令。那么文件目录又是如何创建的呢?

2024-04-19 10:45:12 446

原创 c++类的默认成员函数:构造函数

在下面这个问题中,我们创建的队列会直接调用类中的两个栈的构造函数进行初始化,这样这个类的队列就不用另外写一个构造函数。类中还存在一个默认的指针,叫做this指针,我们不能在形参中写this指针,但是我们可以在函数体中使用this指针。在讲构造函数之前,我们还要补充一些类开辟空间的知识。我们来看我们之前写的日期类的构造函数应该如何书写。所以究竟什么是构造函数,它有什么作用?本质上构造函数就是帮助我们进行初始化的工具。下面我们来通过例子来展示构造函数的优势。我们也可以写成全缺省的形式。实现好的栈的构造函数。

2024-04-16 09:34:24 179

原创 c++中类的实例化

刚刚说到C++中有struct和class两个关键字,它们的区别在于struct是默认将所有的成员公有化,class默认将所有的成员私有化,到这里,有人会问,什么是公有化?这也就说明了我们在使用c语言和c++所关注的重点是不同的,所以c++中产生了类,这就是实例化对象的都包含的特征,就比如我们可以写一个用户端的类实现用户端应该具备的功能。这样子,我们就可以将top变为私有变量,我们只能通过类的内部去访问,具体的我们可以创建一个函数去调用,这个就是私有成员变量存在的意义。说了这么多,究竟什么是类的实例化呢?

2024-04-16 08:44:30 779

原创 c++中的内联函数和空指针

在C语言中我们学到了宏和宏函数,宏对于类型没有严格的限制,而且不需要建立栈帧,可以提高运行效率,但是宏不能进行调试,容易出错,而且没有类型检查。了解了内联函数,我们再来了解一个简便的关键字auto,auto可以根据右边的变量或者右边的返回值的类型来推导参数类型。再往后,我们都知道C语言中的空指针称为NULL,事实上在底层的编码中,NULL是由宏定义为0的。注意:auto不能作为函数的参数,且不可以用来定义数组。auto关键字在返回值很长的时候具有简化代码的作用,

2024-04-12 12:54:52 339

原创 c++中的引用

我们来看下面的这个函数它是将n作为返回值,但是要知道的是,这个n不是直接赋值返回给ret的而是先会创建一个临时变量之后再赋值给ret。原因也是func返回时也会创建一个临时变量,它具有常属性,这样子赋值,也就是说将权限放大了。对于引用我们还有最后一点,我们来了解以下权限的放大缩小和平移问题。那么这里有人会问我们能将引用作为返回值返回n的地址吗?那么引用究竟有什么实际的好处呢?那么我们使用引用到底有什么好处呢?我们再来看以下的程序为什么会报错?下面的代码是可行的,因为它是赋值。同样的,下面的代码也会报错。

2024-04-10 12:16:14 513

原创 c++函数重载

在C语言中我们要实现同类型的两个数字相加很简单,但是我们如果是两个数据传入不匹配的函数中就可能会发生错位,因此c++中创造了一种新的语法叫做:函数重载。我们了解过编译链接过程的朋友们都知道,编译器在处理代码时,都会进行以下操作,先会预处理,之后会进行编译和汇编,最后会进行链接和生成可执行程序。在链接的过程中会生成符号表,会将函数名和地址联系在一起,c++中的函数重载就是通过符号表的不同来实现的。函数重载,简单说就是函数名相同的前提下,用于针对传入的参数类型不同的情况。注意函数中只有声明没有定义就会报错。

2024-04-10 09:30:00 217

原创 c++中的缺省参数

我们先来看我们已经学习过的栈数据结构:随着使用,开辟的空间可能会不够用,我们会进行扩容,这里的扩容过程中,我们难免的会进行异地扩容,所以为了避免异地扩容,我们就会使用缺省参数,比如我们已知要添加1000个数据我们就可以直接通过缺省参数传值开辟如数空间。注意我们在给函数传参的时候我们只能从左向右传参数,也就是说要么是全部缺省,否则被缺省的参数的前面一定是有值的。而现在,我们可以通过使用缺省参数,来减少扩容的消耗,调用函数的时候我们可以将我们需要开辟空间的数量传入其中。什么叫做缺省参数呢?

2024-04-09 21:55:31 322

原创 c++中的命名空间

这行代码就是将我们定义的bit命名空间展开,但是我们展开命名空间可能会遇到麻烦,相当于这个空间种的变量外界可以随意访问,具有一定的风险性,所以一般情况下我们不会这么做。但是在c++中我们可以自行开辟一块命名空间出来,我们可以将我们所需要的变量的名称放在一块区域中,当我们需要使用的时候我们就通过那块命名空间的名称去调用这个变量。通过以上的讲解,我们对于命名空间有了大致的了解,那么我们除了使用访问限定符,还有调用命名空间中成员的方式吗?思考,如果一个项目下出现了同一个名称的命名空间会如何?

2024-04-09 21:34:02 328

原创 二叉树:递归算法的理解和运用

上一期中,我们了解到了堆,堆的结构也可以叫做二叉树的顺序结构,今天我们一起来看看二叉树的链式结构,我们还要学习有关于二叉树递归的书写。这里就提示我们左右子树的高度是不一样的,我们要分别记录两个子树的高度,高度是最大的高度,也就是左子树和右子树的高度我们要取最大值。我们要明确的是,叶子结点就是左右子树都为空的结点,那么我们的思路就明了了,一种特殊的结点,当结点为空就返回0。我们先来思考我们怎样计数:我们可以仿造先序遍历的方式,进入一个结点就+1,但是我们计数的工具是什么呢?我们先来思考:什么是叶子结点?

2024-03-23 14:34:14 656 1

原创 堆排序详解

我们先来纠正一个误区,以小堆为例,有人认为,当我们的堆为小堆的时候,这时候我们的堆就是有序的,这种说法是错误的。创建小堆后,我们确实可以得到最小的值,但是我们会发现那1的孩子结点4和3就没有办法调整过来了。首先我们先要创建大堆,这里很多人可能会问,为什么我们排列升序要创建大堆呢?今天中,我们要来了解基于堆的一种排序,堆排序,也就是让堆中的数据变得有序。观察以下的一个堆,虽然它满足小堆,但是它并不是有序的 1 4 3 7 6。在上一期中我们了解了什么是堆,这里我们简单总结一下,究其本质,我们说过,

2024-03-23 13:40:36 334

原创 数据结构:堆的创建和使用

这里我们要了解topk问题的具有现实的意义,比如我们在点外卖时,我们要选取销量前十的我们就可以使用topk解决问题。所以每一次结束比较后我们都要将父结点赋值给孩子节点,并让父结点走向当前孩子结点的父结点。上一期我们学习了树和二叉树的定义,其中我们了解到了两种特殊的二叉树:满二叉树和完全二叉树。向下调整中,我们定义父结点,之后通过上面的父结点和子节点的关系,我们可以找到左子节点,因为堆是顺序结构,所以我们定义的方式和顺序表是一致的。那么我们要怎么寻找每次的孩子结点和父结点的下标呢?下面是向下调整算法的书写。

2024-03-21 23:47:34 1131

原创 数据结构:初识树和二叉树

注意我们的完全二叉树结点是要连续的,不能中中间出现一个空结点。其中我们还要了解满二叉树和完全二叉树的概念。下面是满二叉树和完全二叉树的结点个数的统计。目前主流的方式是左孩子右兄弟表示法。我们的文件系统就是一个树。

2024-03-21 22:28:20 536

原创 数据结构:队列的创建与使用

队列的结构中和单链表的结构类似,包含下一个结点的指针,同时我们还需要定义一个尾指针,来记录尾部的位置。于此之外,我们还需要创建一个新的结构体来管理整个队列:里面存储的是头部结点和尾部结点。队列中我们还要实现取出队头函数和取出队尾元素,同时我们还要计算队列中的元素。上一期中,我们学习了栈,今天我们来学习一种新的结构叫队列。以上就是关于队列的内容,希望对大家有所帮助!

2024-03-12 14:00:00 448

原创 数据结构:栈的创建与使用

对于栈,我们不能写遍历函数,因为我们访问栈的元素只能从尾部访问,访问后要将它删除,也就是从栈的顶部出去,其中STEmpty函数是用来判断栈是否为空。下面是实现栈空间的核心函数:主要涉及插入和删除,插入我们只能从尾部插入,删除也是尾部删除,因为是后进先出。2、我们选用顺序表来实现栈结构,这里我们堆顺序表可能造成的空间浪费可以忽略不记。下面是栈的结构体的书写:本质上还是顺序表,只是这里我们使用top来指向栈顶空间。对于返回栈顶元素:这里我们要断言,要求pst和顺序表不为空。希望本期内容对大家有所帮助!

2024-03-12 09:00:00 540

原创 最强链表:带头双向循环链表(详解)

学习了普通的链表,我们会发现普通链表的插入和删除有时候也是需要分情况讨论的,并不那么轻松,那是因为单链表的结构所导致的,今天我们来学习一种新的链表结构,它会颠覆我们对于链表的认知,我们会发出感叹:哇!这里我们先来看看尾部插入的逻辑,我们可以通过头结点直接找到尾部结点,我们不需要再从前往后找到尾部结点,但是在这之前,我们应该去创建一个头部结点。之后我们再来看头部插入逻辑:我们在头部插入的时候,我们一定要先链接后面,不然我们先链接了前面我们就无法找到后面的结点。我们来看单链表和双向循环链表的尾部插入对比。

2024-03-11 14:35:12 363 1

原创 单链表详解

对于尾部插入函数,我们首先定义一个结构体指针变量tail用来指向尾部,这里我们要使用tail来找到链表的尾部,判断的条件就是当tail的next为NULL就停止。1、我们可以即开即用不需要浪费太多内存,因为它的空间都是分别malloc出来的,所以我们可以在不使用时将它的空间free。同理删除pos处的元素也是同样的道理,我们也要找到pos前一个结点的指针和后一个结点的指针,然后将他们连起来。2、链表的插入不需要将数据覆盖,我们只需要将前后链表的指针分别连接起来,比较方便。下面是修改后的头部插入的代码。

2024-03-10 16:35:12 857 1

原创 顺序表详解

顺序表是最简单的一种数据结构之一,它的本质上就是数组,我们将顺序表分为静态和动态的两种形式,静态顺序表只能存储有限个数据,而动态顺序表可以根据自己的需求来开辟空间存储数据。在头部插入数据时,我们要注意我们只能将第一个位置的数据往后移动,这样才能将新的数据放入第一个位置,因为数组的空间是连续的。对于扩容,我们可以写个函数来检查是否需要扩容,需要的话我们就直接使用realloc来扩容,每次开辟的空间为原来的两倍。在插入数据时,我们需要检查顺序表的空间容量,如果空间容量不足,我们就要对它扩容。

2024-03-10 15:36:27 448 1

原创 模拟实现atoi函数

3.假如我们传入的参数含有其他符号,如:‘?今天我们来模拟实现库函数atoi,首先我们来介绍一下这个函数。4.假如转化为的数字超过了整形数据的存储范围怎么办?2.假如我们传入的参数中有‘+’‘-’符号怎么办。5.假如我们传入的字符串为空字符串怎么办?1.假如我们传入的参数是空指针怎么办?当然对于这个代码我们仍然可以进行修改。以上就是本期的全部内容。

2024-02-28 19:31:41 380

原创 通讯录的制做(转化为文件形式存储)

前面我们学习到了通讯录使用动态内存去开辟空间,现在学习了文件操作之后我们可以实现将通讯录转化为文件形式储存,我们就可以读取到我们之前存储的内容,而且我们之后加入的内容也不会随着程序的关闭而消失。到这里我们便将一个简单的通讯录讲完了,我们既可以实现存储信息的功能,同时我们还可以将信息转化为文本文件,这样我们就可以实现一个“半永久”式的程序。这段代码我们需要放在初始化的函数中,因为我们先要加载出之前的信息,这个代码就是实现的这一功能。原来啊,我们将数据采用二进制的方式存储,所以看到的就像乱码一样。

2024-02-27 17:45:32 331 1

原创 C语言文件操作

2024-02-27 12:36:42 359 1

原创 C语言动态内存开辟

2024-02-26 22:58:52 328 1

原创 c语言柔性数组问题的讨论

所以柔性数组的优势就体现在这里,而且每使用一次内存函数它开辟的空间在堆中不一定是连续的,而柔性数组是连续的,而连续的空间的访问效率又更高,所以这是柔性数组的第二个优势,就是可以是程序的运行速率提高,当然对于现在的电脑来说这个时间带来的差异可以忽略不记,但是这也是柔性数组优于一般内存开辟方式的地方。柔性数组的空间开辟方式与结构体类似,对于结构体来说a变量占4个字节,b变量占1个字节,但是由于内存空间存在内存的对齐,所以结构体占8个字节(详细参考以前讲过的结构体的内存分配问题​。那么使用柔性数组有什么好处呢?

2024-02-25 17:06:00 498

原创 动态版本通讯录的实现(动态内存管理函数的应用)

到这里大概的部分都结束了,因为其他的函数都不需要动态内存函数的辅助,但是我们要知道,我们既然使用了动态内存,我们在程序结束后我们要相应地把动态内存开辟的地址进行释放,否则就会造成严重的后果。1.对于上版本的通讯录我们在初始化函数中就不能简简单单开辟固定个元素的空间,这里我们在contact结构体中添加一个。对于初始化我们就相应的有一个默认的空间大小,即capcity应该有一个默认的数字,我们记为3,用define定义。,如果满了我们就相应扩充内存,这里就需要用到realloc函数。

2024-02-25 12:56:23 298

原创 c语言自定义类型

2024-02-24 11:12:59 360

原创 实现静态版本通讯录

我们每次加入人的信息时我们还要统计录入人的数量,这样我们需要创建一个新的结构体,里面既可以存放人的信息,又可以存放统计了几个人。下面我们实现删除Del的代码,在删除之前我们先要查找该人名设计函数Find_name来实现这个功能。在开始之前我们先对通讯录进行初始化,设计函数InitContact。为了使代码的可读性更高我们设计一个枚举常量,使输入可以与功能对应。contact.c文件(通讯录实现文件)之后我们实现打印通讯录Show代码。先制作一个菜单将通讯录的功能展示。

2024-02-23 15:27:54 345

原创 字符函数和字符串函数

2024-02-22 22:01:28 439 1

原创 结构体中的数据是如何存储的(结构体中的内存对齐)

因为这种思考方式都是将里面的数据按大小依次排列,int类型占4个字节,char类型占1个字节,故S1占4 + 1 = 5个字节,S2、S3以此类推,但是事实是这样的吗?我们都知道c语言中有自定义类型,而自定义类型中,我们经常需要使用结构体类型,今天我们就来探究结构体中的数据是如何存储的。知道了有些时候我们不得不牺牲一些空间去存放结构体,但是我们要做一个有头脑的程序员,我们要在编写程序的时候去节约一点空间。红色部分仍是浪费的空间,注意这里的int a是从4的位置开始存储的。

2024-02-22 12:42:45 880 1

原创 模拟实现库函数memmove

2.当指针dest在source右边时要反向拷贝。我们发现假如从后往拷贝似乎就不会出现问题,也就是将3赋给5,然后将2赋给4,最后将1赋给3。所以为了避免这种情况,大佬们制作了memmove函数,适用于内存重叠的空间的拷贝。我们都知道关于内存拷贝函数有memcpy,它可以按照所需的字节数来拷贝相应的元素。所以我们就要分情况讨论:1.当指针des在source左边时要正向拷贝。今天我们就来模拟一下memmove函数。难点:如何使重叠的内存不被干扰?但是所有的情况都适用吗?

2024-02-21 14:13:43 510 1

原创 模拟实现strstr库函数(指针回退问题)

2.当第一个字符串访问到最后一个’\0‘字符,这里有可能找到也有可能没有找到,找到了是因为它与第二个字符串刚好同时访问到了’\0‘,没有找到是因为第一个字符串的数据已经访问完了。我们都知道strstr函数是常见的字符函数,主要用于查找字符串中是否有目标字符串,若有就返回字符串字开始的地址。此时p1中的元素与p2中元素相同,则p2此刻需要向后移动以检验后面的几个元素是否相同。知道了大概用法之后,我们今天要模拟实现strstr函数 ,我们将从下面几点入手。可具体需要我们如何去寻找该地址呢?

2024-02-20 23:44:30 383

原创 c语言指针进阶

2024-02-20 13:17:59 369

原创 利用冒泡排序模拟实现qsort函数

以上代码还可以优化,例如我们进行冒泡排序的过程中,它是固定要进行那么多次数的比较检查,但是加入当我们的数据已经排列完成时,此刻并不需要交换,我们可以设置参数使它停止,从而节约时间。冒泡排序的实质是将相邻的两个元素进行比较,因为qsort函数默认为升序排列,所以在冒泡排序中第一个元素大于第二个元素时,就进行交换。对于交换的函数:由于我们并不知道单个数据的类型,所以我们只能将两个数据一个字节一个字节交换。将首元素强制转化为char*类型,再利用数据的宽度我们就可以每一次前进至下一个数据的地址。

2024-02-19 21:03:06 517

原创 关于qsort函数的使用方式

众所周知qsort为排序的神器,因为它不仅可以排序整形数据,还可以排列其他类型的数据,例如字符串类型,这取决于使用者的需求。第四个参数是自己定义的比较函数,这一步是qsort函数的精髓所在,因为库函数并不知道我们需要排列的数据的类型,所以我们要自己定义比较函数。比较函数中返回值为整形,若前一个数据大于后一个数据就会返回大于1的数据,等于就返回0,小于就返回小于1的数据。以上就是对与qsort函数的使用方式的汇总,关键在于比较函数的书写,对于应用不同类型的数据类型都需要会书写。对与结构体中的整形数据的排列。

2024-02-19 17:21:16 342

原创 通过函数指针实现计算器

这个代码还可以通过switch case语句来写,但是会过于繁冗,所以通过函数指针来控制会比较简单。我们可以通过函数指针加入新的计算方式,比如按位与等等,这样子就会将计算器的功能实现模块化。本次给大家带来计算的用函数指针的模拟实现,希望对大家有所帮助(注释已附)

2024-02-19 14:35:14 392

原创 c语言进阶1:数据的存储

2024-02-18 22:28:40 378

原创 C语言指针进阶用法详解与实践(一)

一:字符指针:例如:普通的字符指针这里的指针p指向的内容是可以修改的。例如:直接将字符串存放在指针里面这种做法实际上是将字符串的首元素地址放进a和b中,因为字符串是相同的,所以内存中开辟的是同一个空间,因此注意一下,a和b的首元素的地址是一样的。如果要打印两个元素:二、指针数组:顾名思义就是定义一个数组里面存放的是指针变量...

2023-03-10 14:57:58 114

原创 使用qsort函数实现冒泡排序(函数指针的运用)

//此程序的本质:完全理解qsort函数的传参的原则////实现思路:因为我们是模拟qsort函数//所以我们要自己创造一个:比较数据的函数:cmp_int//因此必须有一个函数指针来接收这个函数的地址//所以我们只要书写这个函数,并在后面实现它的比较功能就足以了。//但是考虑到我们传输的数据类型可能会不同,所...

2023-03-02 22:02:25 86

原创 程序:谁是凶手?

分析:既然有三个人说的是对的,那么我们只要逐个判断就可以了。做法:先假设A说的是对的,然后判断是否与其他人的话是否存在矛盾,若最后恰好有三个人说的是对的那么分析结果是正确的,反之则是错误的。之后同样假设B即可,直至将4个人的话都假设完。程序语言:1.我们采用循环的方式来存储凶手,先定义变量killer来存放A,B,C,D...

2023-02-15 20:19:18 126

原创 C语言初阶思维导图

​​C语言初阶思维导图文字版​​​​C语言思维导图清晰版​​

2023-02-04 16:38:46 91

原创 扫雷程序:基础版

游戏头文件:#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<time.h>#define ROWS 11#define COLS 11#define ROW 9#define COL ...

2023-01-09 12:12:38 61

原创 初学者难点:如何在C语言中打印小数???

首先对于我自己而言,刚刚学习C语言的时候一直弄不清楚如何打印小数,尤其是打印两位或者三位小数,当时只会打印整数,也就导致后来一直被蒙在鼓里。下面是我在弄清楚如何打印的过程中的一点心得体会,给还在迷茫中的初学者提供一些参考。 我们知道小数在C语言之中分为两种类型,分别是float和double。它们的区别大...

2023-01-08 12:19:18 6408

空空如也

空空如也

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

TA关注的人

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