- 博客(64)
- 收藏
- 关注
原创 TCP/IP五层模型
认识协议“协议”是一种约定。 计算机之间传输媒介是光信号和电信号,通过“频率“和”“强弱”来表示0、1这样的信息,想要传递不同的信息,需要约定好双方的数据格式。 网络协议是一个共同标准,大家都来遵守。 为了让两台主机通信,需要协议和标准的数据格式才能进行通信。协议分层(分层最大的好处就是便于封装)OSI七层模型:1、OSI七层网络模型称为开发式系统互联网参考模型,是一...
2018-08-27 23:54:36
38481
1
原创 互联网、因特网以及万维网之间的区别和联系
互联网、因特网以及万维网之间的区别和联系一、三者之间的联系互联网包含因特网,因特网包含万维网。二、概念:互联网(Internet):凡是能彼此之间通信的设备组成的网络就叫互联网。互联网有广域网、城域网、局域网之分。 广域网(WAN):是指距离远的、大范围的计算机网络。一般是跨地区、跨城市、跨国家使用。 局域网:覆盖的范围一般子啊10公里以内,以一个部门、一个学校等为单...
2018-08-27 23:47:57
29071
4
原创 二叉树相关概念及创建
二叉树的一些性质:度就是一个节点的分支数 对于任何一个 二叉树,如 果其叶节点的个数为n0,度为2的非叶节点个数是n2,则有n0=n2+1 (n0+n1+n2=2*n2+n1+1)——-(n0=n2+1); 度为1的非叶子节点个数为n1; 节点个数为n0+n1+n2; 边的个数为2*n2+n1; 节点的个数为:边的个数+1; 具有n个节点的完全二叉树的深度K为log2(n...
2018-08-27 00:30:16
428
原创 堆
1、概念 :大堆:任一节点的关键码均大于等于它的左右孩子的关键码位于堆顶的关键码最大。小堆:任一节点的关键码均小于等于它的左右孩子的关键码位于堆顶的关键码最小。2、规则:堆存储在下标为n的数组中,因此在给定下标为i的堆中: 3、堆的创建1、创建最小堆原理:从最后一个非叶子节点开始整理,一直到根节点为止,将每个节点及其子树调整到满足小堆的...
2018-08-27 00:14:02
336
原创 排序算法---插入排序、选择排序、希尔排序、冒泡排序、快速排序、归并排序、堆排序
1、插入排序思想:每一步将待排序的元素,按照其排序码的大小,插入到前面已经排好序的一组元素的合适位置上面,直到元素全部插完为止。 当插入第i(i>=1)个元素时,前面的arr[1],arr[2]……arr[i-1]都已经是排好序的,此时用arr[i]的排序码和之前的ar[1],arr[2]……arr[i-1]进行比较,放入合适的位置,将原来位置上的元素顺序后移。 元素集合越接近有序,...
2018-08-26 23:54:43
434
原创 大小端
1、概念: 大端:数据的高位存放在地址的低位。 小端:数据的高位存放在地址的高位。 pc机一般都是小端模式: 2、如何测试你的机子是大端还是小端: 方法一:1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main(void) 5 { 6 int a=1; 7 a=...
2018-08-26 23:30:16
337
原创 fsleek的用法
fseek函数名: fseek 功 能: 重定位流上的文件指针 用 法: int fseek(FILE *stream, long offset, int fromwhere); 描 述: 函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset个字 节的位置。如果执行失败(比如offset超过文件自身大小),则...
2018-08-26 23:26:09
974
转载 C语言文件操作函数详解
转载自https://www.cnblogs.com/saolv/p/7793379.htmlC语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现。文件操作标准库函数有: 文件的打开操作 fopen 打开一个文件 文件的关闭操作 fclose 关闭一个文件 文件的读写操作 fgetc 从文件中读取一个字符 ...
2018-08-26 23:20:43
4000
1
原创 C语言预处理、编译、汇编、链接过程
预处理:处理源代码中的预处理指令,引入头文件,去除注释,处理所有的条件编译指令,宏的替换,添加行号,保留所有的编译器指令,生成了.i文件编译:在预处理结束后,我们所要进行的就是编译。编译过程所进行的是对预处理后的文件进行语法分析,词法分析,语义分析,符号汇总,然后生成汇编代码。生成了.s文件汇编:这里的汇编所说的是一个过程,将汇编代码转成二进制文件,二进制文件就可以让机器来读取...
2018-08-26 23:12:34
354
原创 运算符重载
写这篇博客的起因是今天一直困扰我的问题,本来是练习运算的重载,在写加法的重载和减法的重载都是没有问题的,但是加上了赋值运算符的重载马上就出现的问题,先摆出我的错误代码:class Date{public: Date(int year = 1000, int month = 1, int day = 1) { cout &lt;&lt; "Date(int ...
2018-07-30 17:49:37
657
原创 ipcs -q/m/s与ipcrm -q/m/s的使用
ipcs命令ipcs -a :显示全部可以显示的信息ipcs -q:显示活动的消息队列ipcs -m:显示活动的共享内存信息ipcs -s:显示活动的信号量信息ipcrm命令:ipcrm -m id:删除共享内存标识ipcrm -M key:删除由关键字创建的共享内存标识ipcrm -q id :删除消息队列标识 id和其相关的消息队列和数据结构ipcrm -Q ke...
2018-07-27 11:56:12
2630
原创 进程间同步——信号量集
一 、创建或者打开信号量 int semget(key_t key, int nsems,//信号量集中信号量的个数 int flag);//打开:0,创建:IPC_CREAT|0644 返回值:返回信号量集的标识符 查看信号量: ipcs -s具体案例:...
2018-07-27 11:36:30
266
原创 进程间通信——共享内存
一、创建或者打开共享内存 shmget(key_t key, size_t size,//共享内存段的大小 int flag);//打开:0,创建:IPC_CREAT|0644 查看共享内存: ipcs -m 具体案例:#include <stdio.h>#include <stdl...
2018-07-27 11:07:40
140
原创 进程间通信——消息队列
1、消息队列的创建 msgget(key_t key,//相当于文件名 int flag);//打开:0,创建:IPC_CREAT|0644 返回值:消息队列的id。相当于文件描述符 查看IPC对象 ipcs -q:查看系统所有的创建的消息队列 删除IPC对象: ...
2018-07-27 10:55:33
189
原创 线程的同步和互斥
1、一些基本概念 互斥:在同一时间内访问资源的唯一性 同步:是一种时序性和协作性 临界资源:一次仅允许一个进程使用的资源 临界区:访问临界资源的一段代码 2、为什么要进行同步?互斥? 线程互斥:因为多个线程是用共享一个资源的,这个资源就是临界资源,多个线程对资源的访问就需要用到线程的同步和互斥。 线程同步:如果我们的某一个线程优先级特别高,那么它可能一种占据这个临界资源,这个时候,其...
2018-07-27 09:31:41
710
原创 线程的创建、终止、等待和分离
1、线程创建 int pthread_create(pthread_t thread,const pthread_attr_t *attr,void (start_routine) (void ),void *arg); 参数:thread:返回线程ID(用户态)attr:设置线程属性,不易设为NULL;start_routine:是一个函数地址,线程启动时要执行的函数arg:传给...
2018-07-27 08:03:48
659
1
原创 什么是线程?线程的优缺点和使用场景。
1、什么是进程? 进程是程序的而一次动态执行过程。 2、什么是线程? 个进程内部的控制序列, 是进程的一个实体,是进程的一条执行路径。程也就是一个轻量级进程(仅仅是在linux系统中。在windows系统中,进程就是经常进程,线程就是线程),每个线程都有自己的线程控制块,即一个进程至少有一个轻量级进程。 在线程组里面,所有的线程都是对等的关系,没有父线程的概念。 3、什么是主线程? 主...
2018-07-27 07:44:14
15927
原创 复杂链表的复制
1、什么是复杂链表? 复杂链表就是,一个链表的每一个节点都有一个指向下一个节点的指针和指向随机节点或者NULL的指针。 2、分析: 要完成复杂链表的复制,首先应该向链表中的每一个元素都复制 下来,复制的位置应该是当前节点的下一个节点,如下图所示: 意思就是要拷贝的节点是当前节点的Next,要拷贝节点的rodom就是 当前节点的rodom的Next;最后再将这个链表拆分。 代码...
2018-07-19 16:38:49
165
原创 命名管道和匿名管道
我们知道进程间是可以通信的。可以达到数据传输、资源共享、事件通知、进程控制等目的。进程间通信主要包括管道、系统IPC,套接字等。 管道分为三种:普通管道:一是单工,只能单向传输 ,二是仅能在父子进程或者兄弟进程中使用。流管道:去除了第一种限制,为半双工,可以双向传递,命名管道:去除了第二种限制 ,可以在很多并不相关的进程 中进行通信。1、普通管道 int pipe(int f...
2018-07-13 15:07:25
10580
4
原创 静态库和动态库
一、编写简单的add/sub/mul/div函数 add函数 :int add(int a,int b){ return a+b;}sub函数:int sub(int a,int b){ return a-b;}mul函数 :int mul(int a,int b){ return a*b;}di...
2018-07-11 16:33:18
237
1
原创 进程IO----fopen系列函数和open系列函数,结构体fd和FILE的比较
结构体fd和FILE的比较 1、文件描述符fd fd是一个整数,在open时产生。起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针file,因此在Linux系统下面,文件描述符主要是被用来标识一个文件。内核通过文件对象表来管理系统中各种各样的文件,而文件表则是通过指针来指向打开的文件,进而达到管理整个文件系统的目的。2、文件指针FILE ...
2018-07-10 18:25:59
1494
原创 实现简单的shell功能
首先要了解shell: shell用fork建⽴新进程,⽤execv函数簇在新进程中运⾏⽤户指 定的程序,最后shell⽤wait命令等待新进程结束。wait系统调 ⽤同时从内核取得退出状态或者信号序号以告知⼦进程是如何结束的。 以下就是实现了简单的shell:#include <stdio.h>#include <stdlib.h>#include <...
2018-07-09 20:03:57
661
原创 system()、popen()、fork()三个函数 的区别
一、system:在执行期间调用进程会一直等待shell命令执行完成。 fork :执行期间父进程等待子进程的退出码。 实际上system()函数执行了三步操作: 1.fork一个子进程; 2.在子进程中调用exec函数去执行command; 3.在父进程中调用wait去等待子进程结束。 返回值: 1>如果 exec 执行成功,即 command 顺利执行,则返回 c...
2018-07-09 17:53:20
2122
原创 exec函数族
在fork后的子进程可以使用exec函数组,可以装入其他运行程序,子进程替换原有进程,做和父进程不一样的事。 1、使用exec函数的情况: (1)、当进程认为自己再也不能为系统和用户做任何贡献时,就可以调用exec函数族让自己重生; (2)、如果一个进程想要执行另外一个程序,那么他就可以调用一个fork函数新建一个进程,然后调用一个任意一个exec函数使子进程充重生。 exec函数: (...
2018-07-09 17:05:24
787
原创 fork函数和vfork函数的区别
1、fork()函数说明 fork()函数若调用成功有两个返回值:子进程返回0,父进程返回进程标记,出错返回-1。fork()函数将运行的程序分为两个几乎一样的进程,每个进程都是从同一位置启动的线程。两个进程中的线程同时执行,就像两个用户同时启动。 注意: 当调用fork函数时,在该位置的进程一分为二,一个是父进程,一个是子进程。 若调用成功返回两个值,父进程返回子进程的标...
2018-07-09 16:55:28
472
原创 进程的创建--等待--终止
进程的创建–等待–终止#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <errno.h>int main(void){ pid_t pid=fork();//创建进程 if(pid<0)//创建失败 ...
2018-07-09 16:54:26
153
原创 初识进程----
一、概念 进程:程序的一次动态执行过程。每个进程都有自己的状态和自己的虚拟地址空间,是操作系统分配资源的基本单位。 程序:为了完成一系列任务的特定指令的有序集合。 进程和程序的区别: 1、进程是动态的,程序的静态的 2、一个程序可以对应多个进程,但一个进程只能对应一个程序 3、程序是代码+数据,进程是:代码+数据+堆栈+PCB。 二、创建 创建一个进程的一般工作: 1、分配一个P...
2018-07-09 16:08:46
204
原创 linux常用指令说明,及linux下常用目录说明
一、权限问题:1、进入目录需要的权限是:x(执行) 2、cd:所需权限x 3、ls:所需权限:rx 4、rm:所需权限wx 5、mv:所需权限wx 6、touch:在一个目录下创建一个文件,在超级用户下,不管目录是否对拥有者开放权限,都可以在目录下创建文件。在普通用户下,要在目录下创建文件,需要对目录拥有着开放写权限和可执行权限,若要读取这个目录下的文件列表,则需要对拥有者开放读权限...
2018-06-30 21:03:58
150
原创 链表经典面试题三
题型十一:判断单链表是否带环,若带环,求出环的长度,环的入口点,1、判断是否带环:判断一个链表是否带环的带环的条件是,当链表不带环时尾节点指向空,当链表带环时,链表没有尾节点。ListNode* IsCycle(ListNode* pHead)//判断链表是否带环,若带环,返回快慢指针相遇的节点{ ListNode* cur = pHead; ListNode...
2018-06-14 17:51:27
528
原创 链表经典面试题二
题型七:合并两个链表,合并后的链表依旧有序分析:最简单的思路就是遍历两个链表,每次取出其中一个链表的节点,两个链表取出来的节点相比较,取较小值插入到新链表中。就这样一直比较,直到有一个链表为空就结束循环。但是要注意的是,当两个链表第一次比较时,将较小数据作为新的链表的头节点 ,确定之后,再创建一个节点tail指向新链表的最后一个节点,每次取出的数据尾插在tail后面,当遇到其中有一个链表为空的...
2018-06-14 17:15:02
724
原创 链表经典面试题一
题型一:从尾到头打印链表 方法一:递归方式void printtailtohead1(ListNode* ppHead)//从尾到头打印链表{ if (!ppHead) return; printtailtohead1(ppHead-&gt;pNext); printf("%d-&gt;", ppHead-&gt;data);}方法二...
2018-06-14 17:08:11
621
原创 链表之双向有头循环链表
双向有头循环链表的结构体只是增加了一个前一个节点typedef struct SListNode{ DataType data; struct SList* pPrev; struct SList* pNext;}SListNode;当链表为空是,还是有一个节点 ,那就是头节点,此时: 当链表不为空时: 双向链表的初始化: 一定要注意,链...
2018-06-05 16:22:21
635
原创 链表之单向有头不循环链表
链表是一种链式存储线性表,用一组地址任意的存储单元存放数据表的数据元素,称为存储单元的一个节点 节点的结构体定义为:typedef struct ListNode{ struct ListNode* pNext; TypeDate data;}ListNode;下面就是一些构造链表的一些 函数,包括删除,插入,销毁等:创建一个节点ListNode*...
2018-06-04 15:55:42
386
原创 静态顺序表
顺序表:用一段连续的存储单元依次存储数据元素的线性结构,顺序表分为静态数据表和动态数据表。 顺序表和数组的区别: 顺序表要求数据必须是连续的,而数组的数据元素可以不连续。 下面是实现了顺序表的一些功能,代码如下:#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <stdlib.h>#i...
2018-05-26 18:51:06
599
原创 程序环境和预处理
一、程序的编译环境和执行环境 (1)、每一个程序的源文件都会通过编译过程转换为相应的目标代码。 (2)、每一个目标代码由链接器捆绑在一起,形成一个单一的可执行程序。 (3)、链接器同时也会引入标准库函数中被程序任意引用的库函数,而且还可以搜索程序员的个人程序库,将需要的函数也链接到程序之中。编译分为几个阶段组成:程序执行的过程: (1)、程序必须载入到内存中。 (2)、函数的执行...
2018-05-24 21:55:10
137
原创 求水仙花数
找出水仙花数: 首先我们需要了解水仙花数的概念:在数论中,水仙花数(Narcissistic number)也称为自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),是指一N位数,其各个数之N次方和等于该数。 例如153、370、371及407就是三位数的水仙花数,其各个数之立方和等于该数: 153 = 1^3 + 5^3 + 3^3。 370 = 3^3 + 7...
2018-05-24 21:41:28
534
原创 求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,例如:2+22+222+2222+22222
求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,例如:2+22+222+2222+22222int main(){ int n = 0; int num = 0; int sum = 0; int ret = 0; scanf("%d%d", &amp;num,&amp;n);//num表示基数,n表示最高位...
2018-05-24 21:38:37
875
2
原创 验证程序里{}是否成对出现
编写一个程序,可以一直接收键盘字符,如果是小写字符就输出对应的大写字符,如果接收的是大写字符,就输出对应的小写字符,如果是数字不输出。 分析:编写这个程序的思路是,当‘{’出现时计数器加1,当‘}’出现时,计数器减1,最后判断,当计数器为0时,{}是成对出现的,但是一定要注意的是当‘}’出现并且计数器为0时,一定是不匹配的。 代码如下:int main(){ int ch =...
2018-05-23 20:23:10
225
原创 注释转换
我们在写程序时,为了增加程序的可读性,经常会写注释,帮助人们的理解,前面已经介绍过了,注释分为C语言风格注释和c++注释,c语言注释可以同时注释多行,但是不支持嵌套,c++风格注释一次可以注释一行,为了避免出错,人们通常选择c++注释;下面的程序就是将一个文件中的c风格注释全部改为c++风格注释。 分析:在编写这个程序时,我们需要考虑这样这几种情况: 1、当读一行代码,如果他的第一个字符不是‘...
2018-05-23 20:20:39
252
原创 根据某些条件,排出名次
问题描述: 1. 日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯 的一个。以下为4个嫌疑犯的供词。 A说:不是我。 B说:是C。 C说:是D。 D说:C在胡说 已知3个人说了真话,1个人说的是假话。 现在请根据这些信息,写一个程序来确定到底谁是凶手。 代码:int main(){ int thisman; for (thisman...
2018-05-23 20:16:10
356
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人