- 博客(29)
- 收藏
- 关注
原创 OSI七层模型的封装及解包分用的过程
OSI七层模型的定义:OSI七层模型(Open Systems Interconnection Reference Model)是国际标准化组织(ISO)提出的一个网络通信框架,用于标准化不同厂商设备之间的通信协议。它将网络通信分为七层,每层负责特定的功能,并通过接口与相邻层交互。但是因为有时人们会把上三层紧密关联。
2025-04-09 12:31:03
820
原创 C++基础语法(选择排序)
选择排序是一种简单直观的比较排序算法,它的核心思想是每次从未排序部分选择最小(或最大)的元素,放到已排序部分的末尾,直到所有元素排序完成。
2025-03-31 20:41:38
407
原创 Linux进程间的通信
1.1 进程间通信目的:一个进程需要将他的数据发送给另一个进程,大家应该都多少接触过linux中的管道符"|",这个符号就是用来多个命令执行,在Linux中每一个命令都是一个独立的进程,这里我们可以在Linux中看到这些命令,都是一个个的可执行程序,每次输入时相当于一个可执行程序开始跑。我们这里切换到ls这个命令的目录下,在ubuntu系统下我们看到了熟悉的apt安装命令,还有很多比较冷门的命令,我们学习阶段接触的比较少,但是我们可以发现这都是一些可执行程序。
2025-03-26 21:50:16
373
原创 C++数据结构(搜索二叉树)
K _key;:_key(key){}这里我们为了应对不同的数据类型我们使用一个模板参数来构建节点,这样我们的节点中的值不仅可以存储整形,还可以存储字符等等。
2025-03-25 20:28:48
672
原创 C/C++静态库的理解和制作
库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是⼀种可执行代码的二进制形式,可以被操作系统载入内存执行。
2025-03-23 18:55:22
412
原创 进程概念之僵尸进程
可以观察到当我们的子进程停止执行后,我们的程序中也就出现了僵尸进程,具体哪个进程是子进程,我们可以通过观察pid进行区分,最终我的得到的结论就是,当我们的父进程没有回收子进程时,子进程将会变成将是状态,等待父进程的回收。2.僵尸进程会以终止状态保存在进程表中,并且会一直在等待父进程读取退出状态代码。因此,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z(僵尸状态)刚开始的时候我们这里只有系统自动启动的bash进程,这个时候我们运行自己写的myprocess程序在进行观察。
2025-03-23 16:20:09
225
原创 Linux编程(C语言)
• 在这个阶段中,gcc⾸先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的⼯作,在检查⽆误后,gcc把代码翻译成汇编语⾔。• ⽤⼾可以使⽤“-S”选项来进⾏查看,该选项只进⾏编译⽽不进⾏汇编,⽣成汇编代码。• 读者在此可使⽤选项“-c”就可看到汇编代码已转化为“.o”的⼆进制⽬标代码了。• 选项“-o”是指⽬标⽂件,“.i”⽂件为已经过预处理的C原始程序。• 选项“-E”,该选项的作⽤是让gcc在预处理结束后停⽌编译过程。• 汇编阶段是把编译阶段⽣成的“.s”⽂件转成⽬标⽂件。
2024-11-20 23:11:51
343
原创 C++求日期差值题目
cin使用起来就不太方便,我这里选择使用scanf,通过scanf的机制我们取到日期1和日期二的年月日。这里我们的整体思路就是将年月不同多出来的日期都转化为天数,最终比较天数,在使用计数的方法计算出差值。然后我们为了处理不知道那个日期大,另外我们在定义一个用来存放大小年月日的变量。这是前面的一些简单的比大小和计算润年的代码,比较简单就不做讲解啦!仔细阅读地题目,要求输入连续的两串数字表示两个日期。顺便这里定义一个数组,用来方便取到不同月份的天数。所以我感觉日期类不太方便(也许是我实力不允许)
2024-10-12 18:56:23
249
原创 C++类和对象中
默认成员函数就是⽤⼾没有显式实现,编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类,我们不写的情况下编译器会默认⽣成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个,最后两个取地址重载不重要,我们稍微了解⼀下即可。
2024-10-08 16:51:41
784
原创 C++类和对象(上)
1.1 类定义格式1.class为定义类的关键字,stack是类的名字,{}中是类的主体,类结束后后面的分号注意不要省略。类体中的内容成为成员;类中的变量成为成员变量;类中的函数成为成员函数。2.在C++中我们为了区分成员变量我们一般在成员变量的前面加上一个_但是也有别的习惯,具体要看每个公司的要求。
2024-09-03 19:16:19
704
原创 C++基础学习
C++关键字相对C语言来说要多一些,但是也是一种更完善更多优化的语言。C++合计有63个关键词,C语言合计有32个关键字。这里我们简单介绍一下C++的关键字合计有这些,我们后期使用的时候在详细介绍。
2024-07-10 19:16:49
1218
原创 构建二叉树和遍历
我们这里看一下题目根据题目可以判断,是让我们输入一串字符串然后构建一棵二叉树,最后用中序遍历,那么我们该怎么做呢?**“ABC##DE#G##F###”**这样一串字符串我们需要把他构建成一棵二叉树,#的地方为空。走到后面说明读到了非#那么我们就需要将他插入二叉树中,这里我们需要使用malloc创建一个节点。所以这里我们使用一个if的条件判断,通过遍历这个字符串来一个个的将元素插入二叉树。但是这里我们要注意的是,即使读到字符串中的‘#’我们也要往后遍历这个字符串。最后这里我们在写一个中序的遍历。
2024-06-14 22:14:52
463
原创 数据结构的二叉树
对于深度为K的,有n个节点的二叉树,当且仅当其每一个节点都与深度为K的满二叉树中编号从1至n的节点一一对应时称为完全二叉树。双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点;如上图:A是B的父结点孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点;**1.满二叉树:**一个二叉树,如果每一层的节点数都达到最大值,则这个二叉树就是满二叉树,也就是说,如果一个二叉树的层数为K,且节点总数是2^K-1,则他就是满二叉树。子孙:以某结点为根的子树中任一结点都称为该结点的子孙。
2024-05-27 16:50:16
1425
原创 数据结构之队列的实现
不过我们这里还需要再定义一个结构体,因为我们需要队头出数据和队尾如数据,对于单链表来说,从后一个数据找到前一个数据是很困难的,所以我们这里定义两个指针,一个指针指向头节点,一个指针,指向尾节点,这样方便我们插入数据和删除数据。队列是可以使用数组的链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组上出数组效率较低,因为每次出一个数据,数组所有数据都需要向前挪动一位。1.队列:只允许在一端进行插入数据操作,在另一端进行删除数据的特殊线性表,队列具有先进先出。
2024-05-20 23:21:26
330
原创 数据结构之栈的实现
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。这里切记top初始化时 可以选择两种方式,一种是top=0,一种是top=-1。这两种方式选择不同后面我们的代码实现会有略微差距,这里我们选择的是top=0;压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。栈的规定就是这样,可以更加有效地解决遇到的问题。出栈:栈的删除操作叫做出栈。获取栈中有效元素个数。
2024-05-16 20:56:01
193
原创 OJ题目之环形链表2
这里我们在定义一个head指针指向头节点和meet指针指向fast=slow的节点,L=(X-1)*C+C-N,这里我们结合这个式子看图,meet和head节点同时移动,这里我们可以看出head指针L距离走完meet不管在这个环形中绕了多少圈都会最终都是在入环口相遇。这里我们设头节点到环形入口的距离为L,环形的周长为C,入环口到快慢指针相遇的距离为N。题目到这里就写完了,如果有对链表不熟悉的同学可以看一下巨可爱熊写的关于链表的讲解。这里我们利用fast指针的速度是slow指针的二倍,所以我们得到一下等式。
2024-05-15 20:57:24
274
原创 OJ题目之环形链表
如上图所示,这里我们需要知道一个高中数学知识,我们设定fast指针一次走两步,slow指针一次走一步,当指针全部入环后我们理解一下,当slow指针进入环形当中,fast指针一定是在slow前面,如果想相遇我们这里需要fast指针绕一圈反过来追slow。数据结构中我们需要大量的练习oj题目,在关于链表的题目中,环形链表是非常之经典的这里我们来讲一讲环形链表的判定及链表是否为环形链表,以及从何处开始进环。假设fast跟slow中间的距离为N,fast在追slow的过程中,fast走两步,slow走一步。
2024-05-15 20:14:09
425
原创 链表的实现(C语言)
图中指针变量 plist保存的是第⼀个节点的地址,我们称plist此时“指向”第⼀个节点,如果我们希望plist“指向”第二个节点时,只需要修改plist保存的内容为0X0012FFA0。大家想象一下这样的场景,假设每节车厢的车门都是锁上的状态,需要不同的钥匙才能解锁,每次只能携带一把下一节车厢的钥匙。答案是链表中每个节点都是独立的,且在内存中不连续,我们需要通过指针来记录下一个节点的位置,才能找到下一个节点。当我们想从第一个节点走到最后一个节点,必须要从第一个节点开始,在前一个节点拿上下一个节点的地址。
2024-05-13 22:12:02
430
2
原创 C语言冒泡排序
这样第一趟走完我们发现9已经走到我们期望排序的位置,原本总共有十个元素,现在9这个元素已经走到我们期望的位置,这个时候我们还有9个待排序的元素。第二步我们需要利用sizeof计算数组当中元素的个数,虽然我们这里知道数组里面有10个元素,但是在后期的学习当中数组当中的元素个数非常灵活,所以我们使用sizeof可以增加代码的灵活性。然后我们来写冒泡函数的主要函数,这里我们要清楚冒泡排序需要使用for循环的嵌套,第一个循环解决的是趟数,第二个循环用来比较其中两个的大小,和交换。2个元素我们需要一对的比较。
2024-04-15 15:04:47
301
2
原创 C语言指针学习总结2
从这张图可以清晰的看到&arr[0]和&arr[0]+1相差四个字节,arr和arr+1相差四个字节,这是因为%arr[0]和arr都是首元素地址,+1就是跳过一个字节。但是&arr和&arr+1相差四十个字节,这就是因为&arr是数组的地址,+1操作是针对于数组整个加一。我们来类比一下,整型数组是存放整型的数组,字符数组是存放字符的数组,那么指针数组就是存放指针的数组啦。*pp 通过对pp中的地址进⾏解引⽤,这样找到的是 p ,*pp 其实访问的就是 p。为什么这里打印的三个地址是相同的呢?
2024-04-12 22:10:58
255
原创 C语言指针学习总结1
这里我们就可以更好的跟上面的例子相结合,在这里我们把n的地址看成五星级酒店的门牌号,通过门牌号我们可以更加方便地从内存中调取n中储存的值,这样可以更加效率的做到在程序当中找到我们需要的变量。这里可以清楚的看到我们在32位环境下,a这个变量占用了四个字节,其实每个字节都是有自己地址的,但是对于我们的变量来说,取出的地址就是在四个字节中地址最小的一个地址。相信对大家来说,C语言中指针的学习也是相当痛苦,但是可爱熊在学习完指针的知识后对指针有了更多的认识,发现指针并不是有我们想象的那么可怕。
2024-04-08 18:32:14
315
原创 C语言分支循环语句(关系操作符)
这是因为,我们先拿140和iq中存放的145⽐较,表达式140=iq 的结果是1,再拿1和200⽐较,118 的返回值是1,表示真。13>15的返回值是0,表示假。• == 相等运算符。
2023-12-28 20:39:59
542
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人