自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux网络编程

希望大牛多多指点指点我。

2023-09-28 11:13:48 39

原创 操作系统目录

https://blog.csdn.net/cdz2470/article/details/124180874

2022-04-14 20:31:27 809

原创 数据结构目录

线性顺序表数据结构——顺序表_一个路过的假面骑士cdz的博客-CSDN博客

2022-04-10 16:10:09 588

原创 C++的auto关键字

为了解决该问题,C++11引入了auto类型说明符,让编译器去分析表达式所属的类型。12是一个int类型的字面值常量,因此auto推断intVal的类型为int。另外要注意的一点是,如果在一个语句用auto声明了多个变量,则初始化这些变量的表达式都必须使对应声明的变量的类型一致12是一个int类型的字面值常量,因此intVal判断出来的是int类型,而0.12是一个double类型的字面值常量,因此doubleVal推断出来的是double类型,两者推断的类型不一致,因此这条语句错误。

2024-07-27 02:15:03 750

原创 Linux文件I/O

Linux系统一切皆文件,Linux操作系统不区分套接字和文件。Linux操作系统给文件或套接字分配整数,用来标识文件或者套接字,称为文件描述符(File descriptor)。因此,程序中套接字可以像文件一样来进行输入输出。实际上,标准输入输出及标准错误在Linux中也配分配文件描述符。文件和套接字一般经过创建过程才会被分配文件描述符。而标准输入输出及标准错误即使未经过特殊的创建过程,程序开始运行后也会被自动分配文件描述符。文件描述符对象宏0stdin1stdout2stderr。

2023-10-26 22:12:03 303

原创 errno变量和显示错误信息

Linux很多函数发生错误,只会返回-1。所以,我们只知道函数发生了错误,却不知道具体发生了什么错误。因此Linux 系统下对常见的错误做了一个编号,每一个编号都代表着每一种不同的错误类型。发生错误时,对应的编号存储于中,由操作系统维护,存储就近发生的错误,即下一次函数发生的错误将会导致errno变量取值为新错误的编号。errno实际是一个int类型的变量,用于存储上面的编号。

2023-10-26 17:04:54 263

原创 系统调用来龙去脉

操作系统作为用户和计算机硬件之间的接口,需要向上提供一些简单易用的服务。主要包括命令接口和程序接口。其中,程序接口由一组系统调用组成。“系统调用”是操作系统提供给应用程序使用的接口,可以理解为一种可供应用程序调用的,应用程序可以通过系统调用来请求获得操作系统内核的服务。系统调用按功能分类有设备管理、文件管理、进程控制、进程通信、内存管理。

2023-10-26 14:06:51 162

原创 Makefile项目管理

Makefile初学需要掌握一个规则,两个函数,三个自动变量。首先,了解一下基本原则。

2023-10-25 23:53:50 55

原创 动态库和静态库

库是一个二进制可执行的文件。库需要加载到内存中使用。库的作用有:1.库是已经写好的,成熟的,可以复用的功能代码,我们写的很多代码都是依赖于基础库。2.提高代码移植效率,可以不用移植源码,直接移植库即可。静态库在程序编译时会被连接到目标代码中,把库直接加载到程序中,程序运行时将不再需要该静态库。每有一个可执行文件就需要一个静态库的载入。动态库在程序编译时并不会被连接到目标代码中,在链接的时候,它只是保留接口,将动态库与程序代码独立,在程序运行时才被载入,因此在程序运行时还需要动态库存在。

2023-10-25 16:28:33 106

原创 C++宏的作用

如#define cdz 50,则将在程序中搜索cdz并替换为50。但是注意,搜索的cdz只能是单独的单词,不能嵌入在单词中。int main如:#define PFINT printf("hello world!\n");,将会在程序中搜索PFINT的单词,并换成后面的语句实行,将输出hello world!并换行。如:#define MAX(a, b) ((a)>(b)?(a):(b))如:#undef add,将会将之前的add的宏定义取消。__FILE__ // 进行编译的源文件。

2023-10-25 13:43:22 133

原创 Linux常见特殊符号

通配符,例如ll命令会列出文件和目录详细信息的常用命令,下面会列出etc目录下所有a开头的文件和目录。root用户用户家目录在系统根目录下,其他用户的家目录在/home/用户名。如果文件的开始是.,说明当前文件是一个隐藏文件。不同用户的家目录文件位置不同。..指向当前目录的上级目录。Linux命令和参数用空格隔开。如果是字母或者缩写,一般加-整个Linux的文件根目录。如果是单词一般加--

2023-10-17 16:35:53 242

原创 Linux基础命令

1.Linux命令和参数必须用空格隔开,多少个空格无所谓。2.Linux命令区分大小写3.命令错误的三种情况(1)command not found 命令没找到(2)命令敲错了(3)命令未安装。

2023-10-17 15:25:48 54

原创 GDB调试

GDB 全称“GNU symbolic debugger”,从名称上不难看出,它诞生于 GNU 计划,是 Linux 下常用的程序调试器。

2023-10-16 19:42:46 90

原创 四、多线程服务器

创建进程(复制)的工作本身会给操作系统带来相当沉重的负担。而且,每个进程具有独立的内存空间,所以进程间通信的实现难度也会随之提高。同时,上下文切换(Context Switching)过程是创建进程的最大开销。系统同时运行多个进程,系统将CPU时间分成多个微小的块后分配给了多个进程。为了分时使用CPU,需要上下文切换过程。下面了解一下“上下文切换”的概念。如果运行进程A后需要紧接着运行进程B,就应该将进程A相关信息移出内存,并读入进程B相关信息。这就是上下文切换。

2023-10-12 21:23:48 133

原创 一、网络编程概要(三)

send函数和recv函数的最后一个参数是收发数据时的可选项。该选项可以使用位或运算符同时传递多个信息。

2023-10-09 00:05:12 242

原创 一、网络编程概要(二)

每次创建服务器端套接字都要输入IP地址会有些麻烦,可如下初始化地址信息:与之前相比,利用常数INADDR_ANY将自动获取服务器端的计算机IP地址,不必亲自输入。INADDR_ANY其实是IP地址0.0.0.0,代表的是本机所有ip地址(就是电脑可能有多个网卡(NIC),每个网卡连接各自不同的网络,所以IP地址(分为网络号+主机号)中网络号不同,这就说明了每个网卡的IP地址不同,因此一台电脑就会有多个IP地址)。

2023-10-08 17:05:55 55

原创 三、多路复用服务器

而且由于每个进程都具有独立的内存空间,所以相互间的数据交换也要求采用相对复杂的方法。引入复用技术,可以减少进程数。而且,无论连接多少客户端,提供服务的进程只有一个。但创建新进程需要付出极大的代价,这需要大量的运算和内存空间。(IPC属于相对复杂的通信方法)。为了构建并发服务器,只要有客户端连接请求就会创建新进程。

2023-10-05 22:42:53 90

原创 二、多进程服务器

之前的学习,服务器只能同一时刻对一个客户端程序进行服务。若想同时运行多个客户端程序,就得学习并发服务器。

2023-10-02 17:18:05 97

原创 一、网络编程概要(一)

/成功时返回文件描述符,失败时返回-1。

2023-09-28 22:29:37 88

原创 数据结构——二叉排序树

二叉排序树(binary search tree简称BST)就是左子树的所有结点小于根节点,右子树的所有结点大于根节点,且结点保存的数据不同的二叉树。

2022-08-04 17:03:07 611 1

原创 数据结构——双向队列

双端队列,就是两头都可操作即出队和进队的一种数据结构。个人理解,就是两个队列的操作作用于一个队列的结构。假如,把一端的操作给去掉,则双端队列的结构将退化成栈。因此,栈所能做的操作双端队列也是可以的。...

2022-07-22 13:42:46 2301

原创 数据结构——链栈

我们学习过了单链表,又学过了栈,就会明白将这两个的特点集合就会是一个链栈。做法是只允许在下标为0的地方插入结点,删除结点,和查看下标为0的元素。

2022-07-21 11:31:04 197

原创 数据结构——循环链表

循环链表,故名思意,就是首尾相连的一个链表。对于单链表来说,最后一个结点的指针不为nullptr,而是头指针,即存放头节点的地址。对于双链表来说,头节点的pre指针指向最后一个结点,最后一个结点指针指向头节点。实际上,循环列表相对于单链表和双链表操作更加简单,对它插入和删除一个元素的操作在链表的每一个位置都会是相同的。

2022-07-20 15:39:40 1352

原创 数据结构——链表

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。形如下图:​。

2022-07-18 19:40:56 770

原创 数据结构——线性表

线性表(linear list),是n个具有相同特性的数据元素的有限序列。个人感觉,这里的相同特性落实在语言里就是相同类型的意思。而这里的n称为表长。如果n为0的情况,则将这个表称为空表。线性表的第一个元素称为表头元素,最后一个元素称为表尾元素。表可以表示为L(a1,a2,.....an),其中的下标称为元素的位序。注意不要和C++语言的数组从0开始的下标弄混。

2022-07-17 13:39:01 1137

原创 数据结构——拓扑排序

AOV网(ActivityOnVertexNetwork),AOV是一个有向无环图(Directedacyclicgraph),简称DAG。当这大事足够复杂时,也就是说分成的小事足够多时,我们需要理清思路,找到一个好的方法,来决定事情的先后。也就是说我们不可能完成,找工作之前要有一定的经验,而攒经验之前要找到工作,这实在是矛盾的很。这是一个有环图,我们发现这个环中的结点入度都不为0,因此我们不能找到其一个拓扑排序。比如说,我们上厕所,必须要先拿上手纸(如果你说你不用拿,那当我没说)。......

2022-07-16 15:55:33 4596

原创 数据结构——图的存储结构

无向图中数组array中元素表示两个顶点之间的关系,如果array[ i ] [ j ]=1表示顶点 i 和顶点 j 之间有一条边。有向图中数组array中元素表示两个顶点之间的关系,如果array[ i ] [ j ]=1表示顶点 i 到顶点 j 之间有一条边。如果为0,表示顶点 i 到顶点 j 没有边。如果array[ i ] [ j ]=weight表示顶点 i 到(和)顶点 j 之间有一条边,其权值为weight。边表结构,vexi表示顶点i,vexj表示顶点j,说明存在i和j之间相连的一条边。..

2022-05-09 17:09:02 5652

原创 数据结构——并查集

并查集,就是又能够查找,又能相互合并的一组集合。这两个是其非常重要的操作。并查集本质上是森林,而森林中的每个树就是一个集合,每个结点代表着集合中的一个元素。对每个集合我们选出一个代表,该代表就是这个树的根节点。例如下图,0是第一个集合的代表,4是第二个集合的代表,5是第三个集合的代表。2.算法我们用一维数组parent来表示并查集,非根节点或者说非代表i表示该元素或者说结点,parent[i]代表其双亲结点。

2022-05-07 00:10:43 431

原创 数据结构——堆

堆的逻辑结构是完美二叉树,其物理结构实际是一维数组。在完全二叉树的存储学习中,我们已经知道可以用一维数组来表示。一维数组以位序0开始,假设有一个结点i,则其双亲结点为(i-1)/2。如果有左孩子,则左孩子结点为2i+1。如果有右孩子,则右孩子结点为2i+2。堆分为大根堆和小根堆。大根堆,即其每个结点都比其子结点(假如存在的话)要大,则根节点最大,故称为大根堆。小根堆则相反。2.优先级队列堆逻辑上相当于一个优先级队列,出队优先级高的先出队。

2022-05-06 17:01:17 1204

原创 数据结构——哈夫曼树

1.介绍哈夫曼树就是树的带权路径长度(WPL)最小的树,树的带权路径长度等于所有叶节点的带权路径长度之和。而叶节点的带权路径长度等于路径长度与该结点的权值的乘积。路径长度就是从根节点到该结点所经历的边数。而权值即赋给每个结点的一个数值。(a)WPL =1*2+3*2+5*2+7*2=32(b)WPL=1*3+3*3+5*2+7*1=29(c)WPL=1*2+3*3+5*5+7*1=43因此,(b)图的WPL最小。2.算法假设有n个权值,则构造出的哈夫曼树有n个叶子结点

2022-05-05 16:44:20 8219

原创 数据结构——线索二叉树

在二叉树中,查找某种遍历(如前中后序遍历、层次遍历)的前驱后继,在普通的二叉树结构中会显得很麻烦。有两种方法可以解决。1.增加前驱后继两个指针,这样大大增加了空间消耗,不太可取。2.将结点结构变为如下结构。若结点有左子树,left指向左孩子否则指向某种遍历的前驱。若结点有右子树,right指向右孩子,否则指向某种遍历的后继。这样,中序遍历的一个线索二叉树结构为:将一个二叉树中序线索化,类似中序遍历,假如该结点有左节点,向左节点递归。没有左节点时,对该结点进行一系列操作,再向其右节点递归。......

2022-05-04 15:47:55 1250

原创 数据结构——二叉树

​​缺点是容易造成空间浪费,一般用于完全二叉树,或者接近完全二叉树的二叉树存储。链式存储有两种链表结点,一种是二叉链表结点,另一种是三叉链表结点。二叉链表结点仅存储左右孩子的指针和该结点的数据。而三叉链表结点多加了一个指向双亲结点的指针。这两个结点当然也可以用于顺序存储。仅谈二叉链表:(1)前序遍历(DLR即data、left、right) 每到一个结点,当该结点不为空,先遍历该结点,然后遍历左节点,再遍历右节点。否则返回,直到所有节点完成遍历。(2)中序遍历(LDR) 每到一个

2022-05-03 23:45:58 503

原创 数据结构——树

树就跟大自然的树类似,从根结点开始逐级分支。如果一个树没有结点,称为空树。相反,如果有结点,就称为非空树。我们用来保存树的元素的结构称为结点。每个树只能有一个根结点,向下连接两个结点的线叫边。只有后继的结点是根节点。只有前驱的结点称为叶子节点(或者说终端结点),有后继的称为分支结点(或者说非终端结点)。每个结点即以下结点单独拿出又可以称为一棵树。该节点的所有前驱结点都是它的祖先结点。该节点的所有后继结点都是它的子孙结点。双亲结点(或者说父节点。

2022-05-02 21:14:13 4030 1

原创 数据结构——特殊矩阵

在线性代数里面,我们已经学过什么叫作方阵,即列数和行数相等的矩阵。对于特殊的方阵,我们不必将每一个元素都保存下来,在说这些矩阵之前,我们先来讲两种数组结构。

2022-04-27 19:24:17 4903

原创 数据结构——KMP算法

如果有一个串,我们提取其中的部分连续的字符形成的串叫作子串,原来被提取的串叫则叫作主串。我们想要尝试在主串中寻找的子串,叫作模式串,当然这个串不一定找得到,即这个串不一定是主串的子串。这个寻找过程叫作串的模式匹配。例子:主串:”hello world!!!子串:”ello“模式串:”er“,”orld“下面的算法介绍下标从0开始。next数组长度大小和子串长度大小相等,不包含\0符号。而next数组保存的是子串和主串匹配到该位不匹配,子串应该回溯的下标。

2022-04-25 22:43:28 702

原创 操作系统——银行家算法

实验二银行家算法一、实验目的死锁会引起计算机工作僵死,因此操作系统中必须防止。本实验的目的在于让 学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解 死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂 上所讲授的知识的理解。二、实验要求设计有 n 个进程共享 m 个系统资源的系统,进程可动态的申请和释放资源,系 统按各进程的申请动态的分配资源。 系统能显示各个进程申请和释放资源,以及系统动态分配资源的过程,便于用 户观.

2022-04-25 10:35:09 355

原创 数据结构——循环顺序队列

队列其实在生活中有很多例子,比如说看电影买票需要排队,上公交车需要排队刷卡。这种队列就是前头出,后头进的结构,即先进先出(FIFO)。因此,我们只能对队首和队尾进行操作,如果你插队操作的话,别人会说你不守公德。实际中,我们分别用head和tail两个指针分别管理队首和队尾。普通队列容易假溢出,即只要当前面的元素出队列,head指针就会向后指,就再也不会回头。这样,前面的一段空间实际上并没有用上,因此实际意义并不大。..................

2022-04-25 10:23:18 1116

原创 数据结构——表达式求值

表达式分为三个部分,操作数运算符和界限符。操作数就是数字,运算符就是加减乘除一类的运算符号,界限符就是我们熟悉的大括号、中括号和小括号。界限符是决定运算顺序的符号。运算符+-*/,+-为相同优先级,*/为相同优先级,*/大于+-的优先级。另外,没有必要在计算机中也加入大括号、中括号的概念,那样只会复杂化,因为实际上大括号和中括号起的作用是和小括号一样的。大括号和中括号只是给人一种更加美观,便于成对识别的一种方法。

2022-04-20 20:13:30 12119

原创 数据结构——静态链表

因为指针类型会给语言的学习带来很大的困难,所以有些语言将指针的部分去掉,那么如何在没有指针类型的情况下使用链表结构。可以用某个数据结构来代替指针,静态链表应运而生。对于静态链表,我们设置每个结点和单链表结点类似,只不过这里指针域存放的不是下一个结点的地址,而是下一个结点的下标以达到用整型类型替换指针类型的目的。形如下图:​我们将结点的数据变量设为data,指针变量设为next。我们将整个数组分为备用队列(包含还没有使用的元素)和使用队列(包含已经在使用的元素)。

2022-04-20 19:34:07 1603

原创 学生管理系统

//主函数#include <iostream>using namespace std;#include"student.h"#include<iomanip>int main(){ int n; cout << setw(65) << "学生系统" << endl; cout << "请输入学生数量:"; cin >> n; student obj(n); co.

2022-04-18 22:40:13 97

空空如也

空空如也

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

TA关注的人

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