- 博客(28)
- 收藏
- 关注
原创 AVL树插入详解
二叉搜索树可以提高搜索的效率,但是如果数据有序或者接近有序,就会退化为单边树,查找效率相当于在顺序表中查找数据,时间复杂度会退化到O(n)。AVL树解决了这个问题,通过保证每个节点的左右子树高度之差的绝对值不超过1,将时间复杂度保证在O(log2(n))左右。
2024-06-24 22:22:55
614
原创 二叉搜索树
如果该节点有左右孩子,需要使用替换法,将(最大左子树节点/最小右子树)节点的值,和该节点的值交换,然后删除最大左子树节点/最小右子树)节点。如果该节点只有左孩子,把这个节点的左孩子托付给该节点的父亲,然后删除该节点。如果该节点只有右孩子,把这个节点的右孩子托付给该节点的父亲,然后删除该节点。,因为需要通过引用指针去改变父亲节点的指向,如果调用。如果该节点没有左右孩子,直接删除该节点即可。
2024-05-21 11:47:34
335
原创 Linux中的文件描述符
在Linux系统中,文件描述符是一个非负整数,用于指代被打开的文件。程序刚刚启动的时候,默认有三个文件描述符,分别是0(代表标准输入),1(代表标准输出),2(代表标准错误)。如果此时去打开一个新的文件,它的文件描述符会是3。当我们创建文件时,操作系统要创建相应的数据结构来描述目标文件,结构体file就表示一个已经打开的文件对象。进程要调用open打开文件,需要通过PCB(task_struct)中的file*,找到指向的一张表file_struct,这个表最重要有一个。有效的提高c的使用效率。
2024-05-19 22:46:53
1060
原创 Liunx信号详解
我们可以使用kill -l查看系统定义的信号列表每一个信号都有一个编号和一个宏定义名称,这些宏定义放在signal.h。我们也可以使用man 7 signal 查看这些信号各自在什么条件下产生,并且默认的动作是什么。Action对应的默认动作:Term默认中止进程Ign默认忽略信号Core默认中止进程并且进行Core dump(核心转储)Stop默认停止进程Cont默认使停止的进程继续。
2024-05-01 14:50:53
11
原创 c++继承
继承可以使代码可以重复使用,这个机制使子类拥有自己和父类的属性。类似父亲和儿子的关系,父亲有十万的财产,儿子有一万的财产,等到儿子“继承”家业的时候,他就拥有了父亲的那十万财产和自己的那一万财产。继承格式下面这个代码中A是基类,也叫做父类。B是派生类,也就是子类B在继承过后,有了A中的成员变量,也有了自己类中的成员变量。
2024-02-07 17:24:51
1234
原创 c++ string模拟实现
如果开的空间比n大,开n+1空间并拷贝_str的内容到tmp中,再把原空间释放让_str指向tmp,_capcaity=n+1。将str内容拷贝过去,size+=len(strcat在_str追加str内容时不会在末尾加'\0')//如果pos=0,cur-->size_t,需要将'\0'一起移动。//如果pos=0,cur-->size_t,需要将'\0'一起移动。(尾插会把最后的'\0'覆盖,所以要将最后一位变成'\0'//本来是_str自己开空间,让tmp给_str打工。
2024-01-30 19:18:32
1446
原创 插入排序详解
如果A1比较大:让A1向前挪动一位放在A2的位置,然后让tmp和A0比较,因为A0不存在,所以直接将第一个位置赋值为tmp。插入排序就是把待排序的元素插入到已经的序列中,直到所有的元素插入完全,就得到了一个有序序列。这里使用A1,A2,A3……代表第一个数,第二个数,第三个数。3.将A3,A4……依次插入,重复类似2步骤的操作。1.可以把A1直接看成有序列表,从A2开始排序。2.把A2和A1比较,使用tmp记录A2的值。如果A1比较小:直接让第二个位置赋值为tmp。例如:下面要排序:4 ,3,7,1。
2023-12-17 15:10:23
21
原创 进程地址空间和虚拟地址转换物理地址
进程地址空间(mm_struct)就是把虚拟内存分块进行管理,它也是被放在PCB(task_struct)中管理起来的,可以通过PCB找到对应的进程地址空间。每个进程都要一个进程地址空间(32位下[0,4G]),也就是每个进程都认为自己独享内存资源。
2023-12-15 16:31:56
63
原创 LInux中的make和makefile
make是类似一个批量处理的命令,它可以实现自动编译,它本身并没有编译和链接的功能,而是用类似于批量处理的方式,通过调用makefile文件中用户指定的命令来进行编译和链接的make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。好比修建一栋建筑,编写makefile的过程相当于画图纸,调用make命令相当于工程师看图纸分配任务。
2023-11-11 22:46:15
37
1
原创 c++构造函数,析构函数,拷贝构造函数
如果没有显示定义,编译器会自己生成拷贝构造函数,默认的拷贝函数会将对象内存内容直接拷贝给新的对象,这样的拷贝称为浅拷贝或者值拷贝,如果类中没有涉及到申请空间的话,可以不用写拷贝构造函数,编译器自己生成的拷贝函数就可以完成任务。如果类中涉及到了动态内存开辟,我们需要自己构造一个拷贝函数,模仿拷贝构造的原理,为s2._a开辟一个和s1._a指向空间一样大的空间,这样再调用析构函数时,指针各自释放各自申请的空间。默认生成的析构函数,行为和构造类似,内置成员不做处理,自定义成员会调用他的析构。
2023-11-10 21:50:00
24
原创 Linux文件和文件夹权限
一个文件能否被删除,并不取决于文件本身,取决于当前文件夹是否有'w'权限,如果在一个目录中共享文件,作为other没有'rwx'权限,但是other照样可以删除文件,这十分不合理。chmod g-r /home/user1/test.c ----> 给test.c文件的所属组g取消r权限。chmod u+w /home/user1/test.c ----> 给test.c文件的拥有者u增加w权限。总共r,w,x三种权限,三种权限可以任意组合。
2023-11-02 17:33:54
58
1
原创 C++类和对象
1.类的定义c语言是面向过程的语言,分析问题并把它拆分为几个过程,再通过函数调用实现,c++是面向对象的语言,分析问题并把它拆分成几个对象,再通过对象之间的交互实现class的定义和struct类似,class为定义类的关键字,ClassName为类的名字,{}中间的是类体用于定义成员变量和成员函数(类方法),注意括号{}后面需要带分号class//类体//后面需要带分号1.类方法的两种定义方法方法一:把类方法的声明和定义都放在类中ps:类的声明和定义都放在类中,编译器可能将其当成内联函数。
2023-10-28 15:21:48
33
2
原创 堆和二叉树
顺序存储的前提是完全二叉树,顺序存储就是使用数组来存储,类似顺序表的结构,因为完全二叉树的每个节点都是紧紧挨着,不会有空间的浪费,而且会有特殊的性质。二叉树这类的问题可以用递归快速解决,因为二叉树的特殊性质,二叉树可以分成根节点和左右子树,左右子树也可以分成根节点和左右子树,这个过程和递归相似,所以使用递归解决很合适。堆是一颗完全二叉树,堆分为大堆和小堆,父节点总是大于子节点的树是大堆,父节点总是小于子节点的树是小堆。子节点:一个节点具有子树的根节点,根节点称为该节点的子节点,如上图:B是A的子节点。
2023-10-14 10:54:48
74
1
原创 顺序表和链表
如果我们想要存储数据,最常见的就是数据与数据之间一一联系,前一个数据和后一个数据相连,这种数据结构最后会像线一样连成一串,这种关系逻辑被称为线性结构,线性表根据物理结构分为顺序表和链表,顺序表的物理地址是连续的,链表的物理地址使用一根线连接。在挪动覆盖数据时注意:创建一个变量end用于遍历pos之前的元素,将end赋初值为pc->size,让pc->a[end] = pc->a[end + 1], 每次end++直到end<pc->size-1。扩容一般是以2倍空间扩容,会有一定空间的浪费。
2023-09-05 22:04:23
35
原创 (c语言)动态内存管理
结构中柔性数组成员前面必须有至少一个成员sizeof返回的结构体的大小不包括柔性数组的内存包括柔性数组成员的结构用malloc()函数进行内存的分配,并且分配的内存应该大于结构的大小typedefstructstinti;inta[];
2023-08-29 15:46:12
44
1
原创 结构体,位段,联合(c语言)
结构体成员可以是int, unsigned int, signed int或者是char(整形类型)位段的成员名后面有一个冒号和一个数字成员后面的数字单位是比特位位段和结构体相似,例如:structAchara:3;charb:4;intc:15;intd 24;
2023-08-15 23:24:25
46
1
原创 c语言字符串库函数的模拟实现
首先判断指针str2为空直接返回str1,如果str2不为空,初始化一个指针pc遍历str1所指向的字符串,每次遍历时分别使用s1和s2指针对比两个字符串是否相同。函数的形参的void*类型的,保证了可以接受各种类型的值,所以在使dest的值等于src的值要进行(char*)强转,以可以控制一个字节大小的数据。首先定义一个指针begin记住第一个字符的位置,再通过寻找'\0'的方法找到'\0'的位置,两个指针相减就是中间的字符串长度。6.memmove函数的模拟实现。5.memcpy函数的模拟实现。
2023-07-28 11:27:20
37
1
原创 c语言指针解析
1.sizeof()用于求类型或者变量的长度,strlen用于求字符串的长度,注意strlen会从给定的地址一直找下去直到遇见'\0',所以如果没有'\0',strlen求出的是随机值。会在末尾自动加上'\0',相当于存储了a b c d e f '\0' 七个元素 ,此时使用strlen求出6。下面的程序打印的结果是什么呢?下面的程序打印的结果是什么呢?下面的程序打印的结果是什么呢?下面的程序打印的结果是什么呢?
2023-07-18 23:59:39
33
1
原创 PTA6-11 求自定类型元素序列的中位数(希尔排序详解)
其中给定集合元素存放在数组A[]中,正整数N是数组元素个数。该函数须返回N个A[]元素的中位数,其值也必须是类型。
2023-07-12 23:43:29
1164
3
原创 PTA 6-10 阶乘计算升级版
其中N是用户传入的参数,其值不超过1000。如果N是非负整数,则该函数必须在一行中打印出N!的值,否则打印“Invalid input”。
2023-06-12 18:40:36
206
原创 c语言实现扫雷游戏
panduan1.判断是否要玩游戏2.创建game()写出游戏主体代码(1)创建两个二维数组,Mine用于存放地雷,Show用于展示在屏幕(2)初始化两个数组,Mine初始化为全'0',Show初始化为全‘*’(3)设置地雷(4)创建打印函数,用于打印展示(5)创建函数FindMine寻找地雷3.(难点)使用递归完成爆炸式清除无雷的地方。
2023-05-12 21:17:59
51
1
原创 用c语言实现三子棋
首先通过switch判断是否进入游戏,然后将switch语句放在do while语句中,如果input为0,while判断部分为假,退出循环do while。(4)在while循环中实现玩家下棋和电脑下棋的过程,分别创建PlayerBoard()和ComputerBoard()函数。(5)创建一个函数IsWin,在人或电脑走完使用flag=IsWin(),对flag的值进行判断。(2)创建函数InintBoard()初始化棋盘。(3)创建函数PrintBoard()打印棋盘。2.game()函数。
2023-05-10 17:31:34
51
1
原创 初识c语言的知识总结
int --> 整形 (要注意int的取值范围,short --> 短整形long --> 长整形long long --> 更长的整形char --> 字符型float --> 单精度浮点数double --> 双精度浮点数。
2023-04-12 15:20:56
64
1
原创 对于目前计算机学习的规划
我目前是一个大一计算机类的学生,这是我写的第一篇博客,想要通过博客去分享和记录学习计算机知识的经过,记录自己的学习轨迹,也可以以此激励自己的学习。
2023-04-02 17:13:07
107
8
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人