自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 make和Makefile

在上面例子中,我们在test.c文件中加了一条语句,所以修改了其Mtime,每一次编译生成可执行文件后,也会有一个Mtime,这个时间是比源文件的时间晚的,但是当我们修改文件后,其时间比原来生成的可执行文件的时间晚,所以就又可以重新编译了,即通过比较Mtime来确定是否要重新编译。在这个示例中,test依赖于test.o,而test.o又依赖于test.s,而test.s依赖于test.i,test.i依赖于test.c,test.c是存在的,所以找到后执行依赖方法,然后逐步递归构建test,也就是说,

2024-10-07 14:57:48 768 1

原创 【Linux】vim

vim是一个多模式的编辑器,主要有三种模式,即命令模式插入模式和底行模式。当打开vim后,默认是处于命令模式,此时所输入的东西都会被当作是命令,在命令模式下是可以切换到插入模式和底行模式的,并且是可以相互切换的,但是插入模式和底行模式之间是不能想换切换的,要想切换到相应模式,必须经过命令模式来实现。命令模式下,我们可以通过各种快捷键来移动光标、删除文本、复制和粘贴等。插入模式下,可以像其他文本编辑器一样进行文字输入。底行模式下,我们可以执行文件保持或退出,也可以进行文件替换、查找字符串等。通过输入。

2024-09-21 17:32:08 854

原创 【Linux】权限

我们新建一个目录和文件,发现新建目录默认的权限就是rwxrwxr-x,文件的默认权限是rw-rw-r--,每一组(三三为一组)都可以看作是一个二进制数,例如rwx,对应111,即7,再如rw-对应110即6。这个例子也可以看到超级用户的权限很大,联系到实际现实,我们给别人东西时,别人不一定会接受,需要征得别人的同意,这里同样也是,而超级用户比较特殊,由于权限大,可以直接给普通用户(改变所属组同样如此)。例如,普通用户创建了目录test,给 拥有者r和x权限,进入test后,使用ls指令是可以查看的。

2024-09-18 20:19:08 923

原创 【Linux】常见指令(3)

f:循环读取。tail -f命令用于实时查看文件的末尾内容,使用-f选项时,tail命令会保持打开文件并不断读取新添加的内容,直至用户中断它(ctrl + C)。-n:指定显示文件后几行。如果我们想要输出91~100行的内容就需要借助管道了。

2024-09-15 16:16:02 1130

原创 【Linux】常见指令(2)

cp指令用于常使用的选项是-r,即递归式复制。

2024-09-12 12:34:50 1007

原创 【Linux】常见指令

ls指令的作用是。登录上linux后,默认所处的路径是在自己的家目录下,输入ls后,就显示了dir1、test等目录(文件夹)以及普通文件,蓝色的就是目录(文件夹)。ls指令后边还可以加选项,使用格式为这里说几个常用的:1)-l:列出文件的详细信息2)-a:列出目录下的所有文件3)-d:将目录像文件一样显示,而不显示其下的文件1)-l在ls后边加上-l选项后,显示了每个文件夹的具体信息,这些都是文件的属性,文件=文件内容+文件属性,后边还可以加上具体的目录,显示的就是该目录的相关信息。

2024-09-07 16:03:58 946

原创 【数据结构】红黑树

红黑树是一种接近平衡的二叉搜索树,在上一篇博客AVL树中说过,AVL树是通过平衡因子来控制平衡的,右子树与左子树高度差的绝对值不超过1,而红黑树则是通过颜色来实现近似平衡的,红黑树,如其名,是由一个个红色结点和黑色结点组成的,注意它的根结点必须是黑色的。关于第三点,通俗点说就是,但是可以有连续的黑色结点。关于第五点,这里的NIL结点是指空结点。下面给一颗红黑树的示例:思考:为什么 红黑树能保证最长路径结点个数不超过最短路径结点个数的两倍?

2024-08-25 16:51:43 1204

原创 AVL 树

旋转的本质就是降低高的那侧,从图中很容易知道,c中的所有结点都是比10大的,b中所有结点比20小(依据二叉搜索树的性质),因此可以将20以及c作为10的右子树,然后将10的右子树给20,作为20的左子树,这样平衡因子就符合要求了,且变化过程没有违背二叉搜索树的性质。2)插入后平衡因子为1 / -1,说明原来的平衡因子为0,插入后整个子树的高度是增加1了的,例如在1的左侧插入一个结点,这种情况下是会影响祖先结点的,插入后2的平衡因子就变成了0,因此,在这种情况下,插入后需要向上遍历,改变祖先结点的平衡因子。

2024-08-20 17:45:24 872

原创 二叉搜索树

3)若删除的结点有两个孩子,例如下图中的4,直接删除是肯定不行的,需要找到其他结点来顶替该结点的位置,从二叉搜索树的性质中不难发现,与当前结点最接近的结点是左子树的最大结点或者右子树的最小结点,这两个结点亦是叶子结点,删除时就非常方便了。而左子树的最大结点则是遍历左子树,一直寻找right,直到为空,而右子树的最小结点则是一直寻找left,直到为空,要删除叶子结点同样需要不断记录父结点的位置,找到后直接将要删除结点的数据改为叶子结点的数据,然后删除叶子结点即可。若根结点为空,则新结点为根。

2024-08-19 11:52:26 486

原创 【C++】多态

多态即多种形态,当不同对象完成某个行为时,产生的效果是不同的,例如,动物叫声,猫和狗都继承了动物,但是当调用它们的叫声时是不一样的,再如不同职业的人薪资是不一样的......重载的构成条件:同一作用域,函数名相同,参数不同(类型或者个数)的函数重写的构成条件:两个函数分别在基类和派生类的作用域,函数名、返回值类型、参数完全一致,是虚函数隐藏的构成条件:两个函数分别在基类和派生类的作用域,函数名相同。

2024-07-22 10:48:03 743 1

原创 【C++】继承

目录一、继承的概念1.继承的引入2.继承的格式二、继承的基本语法1.不同继承方式的区别2.赋值兼容规则3.派生类中的相关函数4.函数隐藏三、虚继承在实际生活中我们会遇到很多有着共同特性的事物,例如,我们定义一个学生类和教师类,可以发现成员变量中都将会有姓名、性别、年龄等相关信息,这样的例子还有很多,如果每次写时都要包含这些共同信息就会很麻烦,因此,继承就应运而生。继承机制是面向对象程序设计中使代码可以复用的重要手段,它允许程序员在保证原有类特性的基础上进行扩展,增加功能,这样产生的新的类称作派生类。例如在上

2024-07-12 20:28:17 1200

原创 string(下)

需要注意的是,在vs上扩容,可能最后结果并不是我们预期的那样,例如上面这个例子,我们期望是扩容到20,但是实际上扩容到了32(算上\0),不同的编译器扩容后的结果可能不一样,有的编译器可能就是按照你给的数据来扩容的。而capacity()计算的是分配给该字符串的内存空间,这个空间是没有包含\0的,也就是说计算的比实际空间少一个,还有一个是预留给\0的。size()和length()都是返回的字符串的长度,没有区别,所算的长度不包括\0。这个就比较形象了,直接在后边追加,可以是一个字符,也可以是字符串。

2024-05-03 12:19:01 396

原创 string(上)

C++中的string是一个表示字符串的类,它提供了丰富的成员函数来操作字符串。里面有一百多个成员函数,在使用时就非常方便,注意:使用时需要包含头文件<string>。下图为其中一部分截图:接下来慢慢介绍相关成员函数。在C++98中有7种构造函数,我们接下来逐一介绍。

2024-05-02 15:41:34 617 1

原创 函数模板和类模板

class 类模板名//类内成员定义类模板的定义与普通的类定义相似,只需要把相应的类型换成T1、T2....就可以了。需要注意的是:类模板中函数在类外定义时,需要加模板参数列表,类模板实例化时需要在类模板名字后面加,然后将实例化的类型放在中,如下图(来自文心一言):注意:模板不建议将声明和定义分离到.h和.cpp中, 会出现链接错误。区分类模板和模板类:类模板不是真正的类,而模板类是在确定了模板参数后的实例化结果。

2024-04-27 12:45:06 286

原创 C++内存管理

malloc只会分配内存,并不会初始化,但是new在分配内存的同时会调用构造函数初始化;在释放内存时,delete也会先调用对象的析构函数,然后再释放。

2024-04-23 13:32:46 713

原创 类与对象零碎知识点

我们不能依赖编译器为我们自动创建对象,必须显式地在初始化列表中为它们提供一个合适的构造函数参数来初始化。

2024-04-21 11:33:24 674

原创 拷贝构造函数与运算符重载

(与析构函数类似)

2024-04-19 22:57:27 796

原创 构造函数与析构函数

所以是随机值。(说明:内置类型就是基本的数据类型,比如int、char、float、double,而自定义类型就是我们使用class、struct等关键字自己定义出来的类型。

2024-04-13 13:10:35 975 1

原创 类的基本介绍(初识)

在C语言中,结构体只能定义变量,而在C++中,结构体内不仅可以定义变量,还可以定义函数。在C语言中要定义某个结构体变量时类型是struct+结构体名称,而在C++中直接用结构体名称就可以定义。接下来看一个演示示例来证明:实际上,在C++中更喜欢用class来代替struct。这里,就要引出类的概念了,我们先来看类的定义形式://类体:由成员函数和成员变量组成//与结构体相同,后面有分号其中,class为定义类的关键字,ClassName为类的名字(自己取),{}中为类的主体。类体中的内容称为。

2024-04-05 13:59:13 772

原创 C++入门知识点

定义命名空间,需要使用到。

2024-03-31 14:20:02 747

原创 快速排序(递归)

从上图中我们可以看到,L和R一直走,总会相遇,相遇后,将key对应的数与相遇处的数交换,并将key(基准值下标)置为相遇处的下标,因为此时相遇处的数是 已经排在了它对应的位置的,即左边的数都比它小,右边的数都比它大。图中的key便是基准值对应的下标,L和R分别是左边和右边的下标,在下面那个图解里是实现升序,基本步骤就是先让R走,R需要找比key对应的数小的数,只要大于就一直往前走,直到找到小的或者跟L相遇就停下来;然后是L走,它要找到比key对应的数大的数,直到找到或者跟R相遇就停下来。

2024-03-22 21:16:01 161

原创 插入排序和希尔排序

然而,上面两个for循环是可以合并的,使i不断自增并满足条件i<n-gap就可以了,在两个循环中是一组一组插入交换的,而用一个循环后,则是三组交叉交换的,先是红色那组的前两个数(下标为end的数为每组的第一个数),然后是紫色那组,然后是黄色那组,end指向的数变成每组第二个数,依次进行下去(可以自己走一遍循环来观察)。简单来说,就是先按照gap分组,然后将每一组进行插入排序,这时候还是无序的,但是比原来的顺序要好一点,因为是根据gap来分组的,可以使数据更快的进行交换,最后对整体进行插入排序。

2024-03-19 16:57:59 833

原创 TOP-K问题

最佳的方式是用堆来解决,我们只需要对k个数据建堆,如果是求前k个最大的数,则建小堆,如果是求前k个最小的数,则建大堆。以求前k个最大的数为例,建好小堆后,堆顶元素是k个数据中最小的那个,然后我们依次将剩余的数与堆顶元素比较,如果大于堆顶元素就交换,然后再调整这k个元素,然后再比较,依此类推,最后当所有的数据都遍历完时,堆中的k个数据便是前k个最大的数据,这便是用堆来解决的思路。我们首先要产生大量数据,一个一个去写是不可能的,所以我们先写一个产生随机数的函数。

2024-03-16 16:33:45 384 1

原创 堆排序

以降序为例,给定一个有n个元素的数组,当我们建好堆后,我们不断把堆顶元素与最后一个元素交换,这样最后一个元素就放好了,然后重新调整为小堆,在下一次交换时,针对的就是前n-1个数据了,然后一直这样交换下去,这便是堆排序的思想。,如果从下标为0的结点开始向下调整会有问题,因为我们调整时是交换孩子和父亲,而当其深度大于2时,并且在后边(隔了几层)有更小的数时,交换后是无法保证最小的数在堆顶的,因为这时候是按照从上往下的顺序进行向下调整,在下边的更小的数是不能再往上交换的(除了其父父亲)。

2024-03-16 12:19:50 228 1

原创 【数据结构】堆

若设二叉树的深度为h,除第h层外,其它各层(1~h-1)的结点数都达到最大个数,第h层所有的结点都连续集中在最左边。二叉树的性质:①若规定根结点的层数为1,则一颗非空二叉树的第i层上最多有2^(i-1)个结点②若规定根结点的层数为1,则深度为h的二叉树的最大结点数是2^h-1③对任何一棵二叉树,如果叶结点(度为0)个数为n0,度为2的分支结点个数为n2,则有。

2024-03-13 13:31:05 1134

原创 【数据结构】队列

是一种特殊类型的线性数据结构,只允许在一端进行插入数据操作,在另一端进行删除数据操作,它遵循特定的操作原则,即“在队列里,要实现一些基本操作,如初始化、销毁、入队列、出队列等,我们将实现这些功能的函数放在一个头文件(Queue.h)里,然后在源文件里具体实现这些操作(Queue.c),接下来详细讲解相关函数。

2024-03-03 13:10:55 472

原创 文件及文件操作

程序文件和数据文件(从文件的功能角度来分类的)。

2024-03-02 10:38:32 593

原创 C语言内存函数

(在C语言中规定,memcpy拷贝的就是不重叠的内存,memmove拷贝的是重叠的内存,但是在vs2022中memcpy也是可以实现重叠拷贝)

2024-02-22 19:31:11 287 1

原创 字符串函数的介绍(strstr/strtok/strerror)

这个函数有两个参数,str1和str2,函数返回字符串str2在字符串str1中第一次出现的位置,下面通过一个例子来看:⭐strtok也有两个参数,第一个参数是含有0或多个分隔符(例如@、.等)的字符串,第二个参数则是储存这些分隔符的。⭐strtok函数找到str中所含有的一个分隔符,会将其改成\0,并返回一个指向这个分隔符的指针。(注意:strtok会改变被操作的字符,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且是可修改的)

2024-02-21 13:04:10 903

原创 不用加减乘除做加法

但如果需要进位的两个数字又应当如何做呢?在十进制的加法中,满十我们会向前进一位,在二进制中亦是如此,满二进一,我们可以先得到相同位都为1的位(通过&得到),然后左移一位,就是实现了进位,然后将其与相同位一个为1,一个为0的相加即可。但是这样可能并不是一次就可以的,需要用循环来实现,当得到的进位后的数为0,即不需要再进位时就得到了最终的数字。),我们先从简单的加法开始,如果两个数相加不需要进位,例如。,我们可以直接通过异或(即^)得到。

2024-02-15 13:46:19 287 1

原创 字符串函数模拟实现

strlen是计算字符串长度的函数,即不包括\0在内的所有字符个数。注意:strlen返回值的类型是无符号整型。

2024-02-14 19:36:02 419 2

原创 除自身以外数组的乘积

对于这道题,要算除去某个元素后其余元素的乘积,我们可以先算该元素前边的元素的乘积,然后再算出该元素后边的所有元素的乘积,两者相乘即是除去该元素后的所有元素的乘积,即题目所要求的。由于题目要求不能使用除法,我们不能采用先算出所有元素的乘积,然后依次除以每个元素来得到所要返回数组的元素的方法。

2024-02-08 22:18:18 200

原创 移位操作符与位操作符

这其实比较好理解,根据规则,相同为0,不同为1,a与a是完全相同的,所以,每一位都是0,其原码也为0,而0补码每一位都是0,对于a补码中的每一个1都是不同的,所以对于位为1,所以最后得到的补码与a的补码完全一样,所以0 ^ a = a。将-3和5的补码对照来看,每个位对齐,都为1则为1,有0则为0,得到:00000000 00000000 00000000 00000101,由于为正数,其补码与原码相同,即(-3)& 5为5。方法与上述类似,我们再以上述的代码为例,10算数右移一位后是多少呢?

2024-01-30 19:24:07 736 2

原创 带头循环双向链表

头插是指在第一个有效结点前插入,创建新结点后,新结点的prev要指向phead,next指向第一个有效结点(phead->next),第一个有效结点的prev要改为新结点,phead的next要改为新结点。新结点的next要指向phead(哨兵,双链表的头),prev要指向最后一个结点(phead->prev),最后一个结点的next要指向新结点,phead的prev要指向新结点。尾删就是将phead的prev改为要删除结点的前一个结点,即prev,然后将prev的next改为phead。

2024-01-25 20:47:43 354 2

原创 顺序表的介绍以及动态顺序表的实现

在插入前我们需要考虑空间是否足够,如果不够则需要扩容,为了方便使用,我们再写一个函数来扩容,我们可以想到,当空间不足时,空间大小capacity与有效数据个数size是相等的。初始化很简单,将arr数组置为NULL,size和capacity都置为0就可以了,销毁时需要释放arr,并且将size和capacity也置为0。接下来详细讲解各个函数的实现,由于函数较多,我们可以创建一个源文件专门来存放这些函数的具体实现,然后在另一个源文件里测试我们创建的这些函数。顺序表在物理结构上连续的,因为本质是数组。

2024-01-20 01:13:49 392

原创 C语言实现扫雷游戏(基础)

1)对于这种9*9的棋盘,我们很容易想到要用二维数组,并且我们需要两个二维数组,一个用于打印屏幕上,这个是不能显示雷的分布的,另一个则是含有雷的分布的,需要注意的是,如果我们仅创建9*9的二维数组是不够的,因为如果选择在边界上的区域,则会越界(如下图),所以应该创建11*11的二维数组,在外面加一圈,这样就不用考虑越界的问题。3)接下来我们要分析需要实现哪些函数,首先,要有一个初始化棋盘的函数,然后需要一个打印棋盘的函数,我们还需要一个布置雷的函数,最后,还需要一个排查雷的函数。接下来一一讲解各个函数。

2024-01-19 16:55:48 428 3

原创 编译和链接

在ANSI C的任何一种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令;第2种是执行环境,它用于实际执行代码。

2024-01-17 13:12:55 961 1

原创 C语言基本数据类型介绍及格式字符

C语言提供了丰富的数据类型来描述生活中的各种数据,用整型类型来描述整数,用字符类型来描述字符,使用浮点型类型来描述小数,这些都是内置类型,仅靠这些是不能很好满足生活中的需求的,所以C语言中还有自定义类型,可以根据需求来创建使用,下面主要讲解。

2024-01-15 18:07:16 2254 3

原创 结构体以及结构体内存对齐

最后是float,占四个字节,对齐数同样是4,但是必须从4的整数倍开始往下数,也就是8,即绿色部分就是c,总共是12个字节,12正好是4的整数倍。struct test1的大小是12,其成员中最大对齐数为4,所以这个结构体对齐数为4,8是4的倍数,从此开始,由前边一个例子我们知道它的大小是12,填完后,正好20个字节,在所有成员中,最大对齐数是4,最后struct test2 的整体大小要是4的整数倍,20正好是4的整数倍,如果不是则需要继续往下。②其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

2023-12-06 00:25:50 1027 4

原创 整数和浮点数在内存中的存储

E是一个无符号的整数,但是根据科学计数法,指数是可能为负数的,所以IEEE 754规定,存⼊内存时E的真实值必须再加上 ⼀个中间数,对于8位的E,这个中间数是127;这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,而是还 原为0.xxxxxx的小数。对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M。对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M。

2023-12-04 01:23:14 469

空空如也

空空如也

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

TA关注的人

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