- 博客(42)
- 收藏
- 关注
原创 Linux的组和权限管理
ls -l 显示的内容如图所示:第0位表示的是文件类型:l是链接,和windows快捷方式差不多d是目录,和windows的文件夹差不多c是字符设备文件,键盘鼠标b是块设备,比如硬盘第1-3位表示的是所有者拥有该文件的权限 (User)第4-6位表示的是所属组拥有该文件的权限 (Group)第7-9位表示的是其他用户拥有该文件的权限 (Other)
2026-08-22 12:58:51
238
原创 Linux入门基础指令
以上便是 Linux 入门最核心的知识点。强烈建议大家一边看教程,一边打开自己的虚拟机亲手敲一遍命令,切勿只用眼睛看。只有形成肌肉记忆,遇到生产环境问题时才能真正做到不慌不忙。如果文章中还有不够准确的地方,也欢迎大家在评论区指正,共同学习进步!
2026-07-26 17:30:10
250
原创 c++红黑树
如果使用普通的二叉搜索树(BST),极端情况下会退化成链表(如插入有序数据),导致查找效率从。(Red-Black Tree)应运而生。插入新节点时,红黑树需要通过。在编程中,我们经常需要一个。
2025-12-17 18:54:26
307
原创 C++ AVL树
/ 键值对存储// 左子节点// 右子节点// 父节点(三叉链结构)int _bf;// 平衡因子(Balance Factor)关键设计点采用三叉链结构(包含parent指针)平衡因子_bf = 右子树高度 - 左子树高度KV模型支持键值对存储。
2025-12-02 22:16:06
348
原创 C++ set与multiset
set和multiset是C++中处理是有序集合选择容器时要考虑元素唯一性和需求掌握插入/查找/遍历等基础操作理解底层红黑树特性有助于理解代码。
2025-11-24 18:51:46
204
原创 C++ map
map默认使用less<Key>进行键比较,若需自定义排序规则,可通过仿函数或operator<实现。int age;// 按年龄排序。
2025-11-21 23:21:14
474
原创 二叉搜索树:C++ 实现
左子树所有节点值 < 根节点值右子树所有节点值 > 根节点值左右子树本身也是二叉搜索树6/ \3 8/ \ \1 4 9K _key;// 节点值// 左子树// 右子树优点:插入、查找、删除操作平均效率高,结构灵活。缺点:最坏情况下性能退化,需通过平衡树优化。进阶方向:学习 AVL 树、红黑树等自平衡二叉搜索树。二叉搜索树 = 有序 + 二叉树。
2025-11-11 20:49:39
231
原创 C++多态
动态多态会带来性能开销(虚表查找),对性能敏感的代码应谨慎使用。调用不同派生类的实现,从而写出更灵活、可扩展的代码。否则通过基类指针删除对象时可能导致内存泄漏。是面向对象编程的核心特性之一,它的本质是。在C++中,多态能让我们通过。管理多态对象,防止内存泄漏。
2025-11-07 23:11:48
510
原创 C++ 继承
继承就是让一个类(子类)获取另一个类(父类)的属性和方法的过程。父类(Base Class / Parent Class):被继承的类,也叫基类。子类(Derived Class / Child Class):继承其他类的类,也叫派生类。复用代码:避免重复编写相同的代码。扩展功能:在子类中添加新的成员或修改已有行为。建立类之间的层次关系:体现现实世界中的“是一种”(is-a)关系,比如“狗 是 一种 动物”。
2025-10-27 12:45:04
338
原创 仿函数与优先级队列
/ 使用默认仿函数的优先级队列// 小的元素优先级更高概念核心价值仿函数封装行为+保持状态+策略模式优先级队列自动排序+高效插入/删除。
2025-10-20 20:49:45
371
原创 C++ stack 和 queue
想象一下你有一把ak,你给ak上膛子弹,最后上膛的子弹先发射出去。这种“后进先出”的结构就是栈。想象你在排队买奶茶,新来的人要排在队尾,而服务员从队首开始服务。这种“先进先出”的结构就是队列。操作stack(栈)queue(队列)添加元素push(x)删除元素pop()(栈顶)pop()(队首)查看元素top()front()back()顺序后进先出先进先出。
2025-10-19 21:27:21
483
原创 C++ List
在C++中,list是一个双向链表实现的标准库容器,这意味着它的每个元素都与前后两个元素相连接(除了头尾元素)。list允许我们在序列的任何位置高效地插入和删除元素,这使得它非常适合需要频繁添加或移除元素的应用场景。
2025-10-09 12:02:53
429
原创 C++类和对象
想象一下,你想要造一辆汽车。在实际造车之前,你先画出一张设计图纸,这张图纸详细描述了汽车的各个部分:发动机、轮胎、车窗、座椅等,以及它们如何组合在一起。这张设计图纸就是"类",而根据这张图纸制造出来的具体汽车就是"对象"。在C++中,类是一个定义对象的模板或蓝图,它包含了对象的属性(数据成员)和行为(成员函数)。对象则是类的具体实例,每个对象都有相同的属性和行为,但拥有自己独特的值。在C++中,使用class关键字来定义类。
2025-09-22 20:55:08
805
原创 C++ std::vector
特点说明✅ 动态大小自动扩容✅ 安全访问at()检查越界✅ 高效操作尾插尾删 O(1)✅ 易于使用语法简洁✅ 标准推荐STL 核心容器。
2025-09-15 23:39:09
421
原创 C语言快速排序
快速排序(Quick Sort)是一种高效的排序算法,采用"分治"策略。它的核心思想是:选择一个基准值(pivot),将数组分成两部分,一部分比基准值小,另一部分比基准值大,然后递归地对这两部分进行排序。
2025-09-08 19:10:23
463
原创 希尔排序。
希尔排序是插入排序的一种高效改进版本,也称为"缩小增量排序"(Diminishing Increment Sort)。它由D.L.Shell于1959年提出,是直接插入排序算法的优化版本。特点非稳定排序算法(相同元素的相对位置可能改变)时间复杂度:平均O(n^1.3),最坏O(n^2)空间复杂度:O(1)(原地排序)
2025-09-01 23:44:17
1220
原创 c++string
是 C++ 中处理字符串的核心工具,其设计兼顾了安全性、效率和灵活性。构造与初始化:多种方式创建字符串。基本操作:赋值、连接、比较等。常用函数:查找、替换、删除、插入等。性能优化:避免频繁修改字符串,合理使用内存预分配。实战应用:字符串流处理、子串替换等。建议:多动手实践,尝试用解决实际问题(如文件读取、数据解析等),逐步提升对字符串操作的熟练度。
2025-08-23 23:45:34
378
原创 C++ 模板初阶
模板(Template)是 C++ 中实现泛型编程的核心工具。如果你要造一个能装水的杯子,你会设计一个通用的模具(模板),而不是为每一种液体(水、果汁、牛奶)都造一个杯子。STL 源码:学习标准库中模板的高级用法(如 vector<T>、map<K, V>)。C++ 模板就是这个“模具”——它能根据不同的类型生成不同的“杯子”(函数或类)。typename T:定义一个模板参数(T 可以是任意类型)。(class也可以)实例化后(如 Stack<int>)才是真正的类。模板类本身不是类,而是类的生成规则。
2025-08-02 23:21:29
394
原创 C++四大默认成员函数:构造、析构、拷贝构造与赋值重载
在C++中,类的是编译器自动提供的特殊函数,它们管理着对象的生命周期和资源。:构造函数、析构函数、拷贝构造函数和赋值重载函数。
2025-06-13 16:25:48
831
原创 数据结构----归并排序
最上面的一组待排序的一组数,归并排序先是要把这组数字变成一个有序的序列,然后再进行归并,如图上所示,先讲八个数对半分,然后再一点一点分,最后剩一个数我们就可以排序,也就是类似于递归,最后排序完事,我们就可以归并,a组数和b组数比较,哪个小哪个叫拿下来放到新开辟的数组里,最后拿完之后我们就把这个数组重新拷贝的原数组,这样我们就可以完成排序。归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。时间复杂度:O(N*logn)
2025-05-16 20:46:12
350
原创 二叉树的顺序结构及实现
一.二叉树的顺序结构二.堆的概念及结构三.堆的实现一.二叉树的顺序结构1)堆是一颗完全二叉树。2)堆又分为大堆和小堆,大堆就是树里面任何一个父节点都大于子节点,所以根节点是最大值;小堆就是树里面任何一个父节点都小于子节点,所以根节点也是最小值。3)堆中某个结点的值总是不大于或不小于其父结点的值。三.堆的实现首先来介绍一下堆的向下调整算法当我们的根结点不满足小堆或者大堆性质时候,我们就使用向下调整算法。然后我们来介绍堆的插入向上调整算法和向下调整算法不同的是,向上调整算法适合小堆,向下调整算法适合
2025-04-20 20:39:58
590
原创 二叉树概念
通常的方法是 链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。二叉树是由节点组成的有限集合,这个集合要么为空,要么由一个根节点和两棵互不相交的二叉树组成,分别称为左子树和右子树。:以某结点为根的子树中任一结点都称为该结点的子孙。:若一个结点含有子结点,则这个结点称为其子结点的父结点;:一个结点含有的子树的根结点称为该结点的子结点;:一个结点含有的子树的个数称为该结点的度;一个特殊的结点,称之为根结点,根结点没有前驱结点。
2025-04-13 11:52:34
707
原创 栈的相关概念与结构
首先还是断言,防止栈为空,接着我们free掉a,再让a置为空,关于free要说一下:free(指针)不是说把该指针空间释放掉,而是把该指针所指向的地址内存空间释放掉,原先在该空间定义存的内容,会被清掉,但该指针仍然在那。我们定义结构体struct stack,重定义它为ST,这样简单明了,然后我们重定义int为STDataType,这样我们想改数据里的int的时候就不用一一去改了,直接在这个部分把int改为其他数据类型就好了。(例如枪械装子弹的时候,弹夹最上面的子弹是最后装进去的,但却是最先发射出去的)。
2025-03-27 20:59:32
754
1
原创 算法的时间复杂度
它通常通过分析算法中基本操作重复执行的次数来计算,这个次数是问题规模n的函数,记作T(n)=O(f(n)),其中f(n)是问题规模n的某个函数。找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度。算法的复杂度是指算法在执行过程中所需要的计算资源和内存资源,主要包括时间复杂度和空间复杂度。在实际情况中关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N),则去除与这个项目相乘的常数。
2025-03-13 20:49:30
847
1
原创 数据结构----单链表专题
然后接下来开始说尾插,先来说一种特殊情况,如果为空链表,那么我们就直接让新节点成为头节点,如果不是空链表那么我们就先找到单链表的尾部,先将头节点赋给ptail,开始循环遍历单链表,当ptail的下一个节点为空时我们就跳出循环,一旦跳出循环就说明我们已经找到了尾节点,然后让ptail指向的下一个节点为newnode,这就是尾插,,怎么样是不是不是很难?因为是头插,此时头节点已经变成了我们新插入的节点,所以让新节点的指向的下一个是原先的头节点,然后把新节点赋给头节点,他成为了新的头节点。这就是头插,简单易懂。
2025-03-06 12:13:29
656
2
原创 数据结构-----顺序表专题
然后我们开始for循环,因为一共size个元素,我们最后一个元素的位置是size-1,让size-1往前挪动到size-2的位置,所以i<size-1后,如果大于就结束循环,循环里面,我们把i+1的位置挪动到i的位置,然后完成这些之后让size--,就ok啦。空间申请成功后,由于我们是尾插入,我们找到arr最后一个元素,就是size的位置,例如有效个数是4,那么最后一个数就是4,(顺序表基层结构是数组,数组是一个连续存放的结构),所以在最后一个地方我们插入x,然后让size++。
2025-01-01 11:40:22
1063
3
原创 动态内存管理
例如以上的例子,我们想要存放五个整数,也就是20个字节,那就开辟20个字节的空间,因为我们开辟是是内存地址,所以用整型指针来接收,而malloc函数的返回值强制类型转换为int*的类型。并且我们还要判断开没开辟成功,所以我们要判断一下,(malloc函数开辟的时候p返回的是空指针),如果p为空指针,那么就是开辟失败,我们用perror函数来报个错误,既然已经开辟失败了那我们就提前返回直接return 1.这个函数是为num个大小为size的元素开辟一块空间,并且把开辟的空间中的每个字节都初始化为0.
2024-12-27 09:18:33
787
2
原创 c语言qsort函数以及qsort函数手动实现
qsort函数里面包含四个参数,第一个是void*base,它是一个指针,指向的是待排序的数组的第一个元素,第二个是size_t num,是base指向待排序数组的元素个数(size_t是指无符号整型类型),第三个是size_t size,是base指向待排序数组的元素大小,第四个是一个函数指针,指向的就是两个元素的比较函数。然后再创建bubble_sort函数,这个函数是我们实现qsort函数的关键,根据上面的定义得我们把arr(数组名是首元素地址),数组元素个数,数组元素大小,和函数指针依次放入里面。
2024-12-16 15:51:33
1209
2
原创 初步理解指针
这里可以看到b确实被修改了,但是我们要知道我们给b加了const修饰就是为了不被修改,如果通过地址能修改b,那么const修饰的作用就失效了,所以我们要指针变量拿到b的地址也不能被修改。在计算机上cpu处理数据的时候,数据是在内存中读取,处理后的数据也会被放回内存中,在我们买电脑的时候,有好几种内存选择,例如8GB/16GB等等,那么如何高效率的管理这些内存空间呢?上述代码中,将int*类型的变量的地址赋给char*类型的指针变量,编译器表示类型不兼容,给出警告,但是使用void*就没有问题了。
2024-12-10 21:41:45
979
1
原创 自定义函数简单介绍
Add是函数的名字,是为了方便调用它,就像我们给物品起了名字,在我们要用到它时会说出它的名字,所以函数起名字时也要根据函数功能来起名字,这样更有意义。如上图所示:int是函数的返回类型,Add是函数的名字,括号里的int x,int y是形式参数,简称形参。int(我这里是返回的整型类型,其他的数据类型也可以)是表示函数计算结果的类型,返回类型也可以是void表示什么也不返回。根据要求写出函数,函数取名为Add,函数接收的是两个整型类型的参数,所以函数计算的结果是整型并且函数返回类型是整型int。
2024-11-29 09:18:58
309
原创 用c语言完成扫雷小游戏
我们布置好雷之后,用1代表雷,不是雷则是0,在我们查询一个坐标的时候,坐标周围有雷,我们需要将雷数量存储下来,然后打印给玩家,但是在放雷的地方已经有数据占据了,再存雷会导致混乱,分辨不清,所以我们要设置两个棋盘,一个是放雷信息的棋盘show,一个是雷的棋盘mine,把雷放到mine里,然后排查出雷后,将雷的信息存放到show里,然后打印信息,这样就不会混乱。那么我们怎么知道xy周围有几个雷呢,以x为行,y为列,那么周围就是x-1行,x+1行,,y-1列,y+1列,八个坐标就都出来了。
2024-04-07 17:52:17
1657
原创 c语言 求最大公约数
3. 重复上述过程,直到余数为0,此时较小的数就是最大公约数。1. 将两个数中较大的数除以较小的数,得到商和余数;2. 将较小的数和余数再次做除法,得到商和余数;所以985和457的最大公约数为4。今天来看一下c语言怎么求最大公约数。985÷457=2(余71)介绍一个方法叫做辗转相除法。457÷71=6(余31)71÷31=2(余9)31÷9=3(余4)
2024-03-02 21:27:22
749
1
原创 c语言 switch语句练习
题目描述,输入一个1-7的数字,打印对应的星期几。输入:1 输出:星期一。输入:2 输出:星期二。输入:3 输出:星期三。
2023-12-14 18:37:04
419
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅