自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C语言·数组知识小结

在C语言中我们经常用到数组,这其中有很多我们需要了解并且注意的地方。以下是我学习数组之后的一个简单总结。 这里我们详细说明一维数组和二维数组的相关知识。一维数组一维数组的创建 数组是一组相同类型元素的集合。数组的创建方式: type_t arr_name [const_n]; 例如:int arr[100];或者 char arr[100]等,但像i...

2018-04-30 15:58:22 325

原创 C语言·操作符小结

C语言中操作符分为以下几类:算术操作符:+ - * / % 1.除了%操作符之外,其他的几个操作符可以作用于整数和浮点数。 2.对于/操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。 3.%操作符的两个操作数必须为整数。返回的是整除之后的余数。移位操作符:<< >> 1、 <&...

2018-04-30 15:17:56 115

原创 二叉树及其基本操作(二)(C语言)

前面我们知道了二叉树的相关概念和性质,也了解了二叉树的相关遍历方法,接下来我们来实现一下其他的有关二叉树的相关基本操作。二叉树及其基本操作(一)(C语言递归实现前中后层序遍历)//求二叉树节点个数int TreeSize1(TreeNode *root){ if(root == NULL) { //空树 return 0; } ...

2018-04-30 14:31:55 225

原创 二叉树及其基本操作(一)(C语言递归实现前中后层序遍历)

树的概念: 由N(N>=0)个节点构成的集合,对于N>1的树,有: 1、有一个特殊的节点,称为根节点,根节点没有前驱节点 2、除根节点外其余节点被分成M(M>0)个互不相交的集合T1,T2……Tm,其中每一个集合Ti(1<=i<=m) 是一棵结构与树类似的子树,每棵子树的根节点有且只有一个前驱,可以有0个或多个后继因此,树是递归定义的。...

2018-04-30 12:10:43 1698

原创 笔记:gdb调试多进程

默认设置下,在调试多进程程序时GDB只会调试主进程。但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序。只需要设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)即可。follow-fork-mode与detach-on-fork 说明: follow-fork-mode det...

2018-04-27 00:27:42 426

原创 笔记:gdb调试多线程

gdb与多线程在多线程编程时,当我们需要调试时,有时需要控制某些线程停在断点,有些线程继续执行。有时需要控制线程的运行顺序。有时需要中断某个线程,切换到其他线程。这些都可以通过gdb实现。先看一下gdb调试多线程常用命令: 命令 功能 info threads 显示可以调试的所有线程。gdb会为每个线程分配一个ID(和tid不同),编号一般从1开始。后面的ID...

2018-04-26 21:22:25 357

原创 从线程视角看生产者消费者模型

生产者消费者模型通常说到生产者消费者模型,就会想到:“3种关系,2个角色,1个交易场所” 3种关系: 1、生产者与生产者之间:互斥 2、消费者与消费者之间:互斥 3、生产者与消费者之间:互斥且同步2个角色: 生产者与消费者1个交易场所: 临界区下面写一个基于链表的生产者消费者例子:#include<stdio.h>#...

2018-04-26 17:28:46 124

原创 线程同步与互斥

mutex互斥量 大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个线程。 但有时候很多变量都需要在线程间共享,这样的变量称为共享变量,可以通过数据的共享,完成线程之间的交互。 多个线程并发的操作共享变量,会带来一些问题。举个妮子:#include <stdio.h>#include<stdlib.h>#include<string.h

2018-04-26 09:15:14 150

原创 线程控制(二):线程等待与分离

线程等待为什么需要线程等待呢? 1、已经退出的线程,其空间没有被释放,任然在进程的地址空间内 2、创建新的线程不会服用刚才退出线程的地址空间pthread_join函数://等待线程结束int pthread_join(pthread_t thread,void **value_ptr);//参数thread:线程ID//value_ptr:指向一个指向线程的返回值的指针//返回

2018-04-25 13:42:55 515

原创 线程控制(一):线程创建与终止

说在前面:与线程相关的函数构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”打头的,要想使用这些函数,要通过引入头文,链接这些线程函数库时要使用编译器命令的“-lpthread”选项创建线程//创建一个新的线程int pthread_create(pthread_t *threade,const pthreade_attr_t *attr,void *(*start_rout

2018-04-25 11:34:42 422

原创 线程概念

所谓线程,就是在一个程序里的一个执行路线就叫做线程(thread),更准确的说应该是:线程是一个进程内部的控制序列。每一个进程至少都有一个线程。 所以,一个进程中的线程共有同一地址空间,如果我们定义了一个函数,该进程中的每一个线程都是可以调用这个函数的。如果定义一个全局变量,每一个线程都可以访问到,除了这些,每个线程还共享其他的一些资源,比如说: 1:文件描述符表 2:每种信号的处...

2018-04-23 16:55:58 152

原创 守护进程

守护进程也被叫做精灵进程,是运行在后台的一种特殊进程。 他独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程,Linux的大多数服务器就是用守护进程实现的。比如ftp服务器,ssh服务器,Web服务器http等,同时,守护进程完成许多系统任务,比如,作业规划进程crond等。Linux系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能...

2018-04-22 18:33:42 147

原创 进程间关系:进程组、作业、会话

进程组 之前我们在查看系统进程相关信息时,会看到每一个进程的ID和其父进程的ID等相关信息,其中就有一个PGID,代表的是组ID。什么是组ID呢?进程除了有自己的一个进程ID之外,每一个进程还属于一个进程组。而这其中的PGID就是组ID,指明了该进程是属于哪一个进程组。 那么什么是进程组呢?其实这个进程组就是一个或多个进程的集合。通常情况下,他们与同一个作业相关联,可以接收来自同一终端的各种信号

2018-04-22 16:41:48 1480 1

原创 死锁产生条件,如何避免死锁

什么是死锁? 答:多个进程在运行过程中因争夺资源而造成的一种僵局。当一个进程请求资源时,如果该资源不能立即获得,那么进程就会进入等待状态。如果一个处于等待状态的进程 P1,由于所等待的资源被另一个处于等待状态的进程 p2 所占有,而 p2 所请求的资源又被 p1 占有,这样它们所请求的资源都不会获得,两进程一直处于等待状态,形成死锁。死锁产生的原因? (1) 因为系统资源不足。 ...

2018-04-21 23:38:06 2037

原创 多通路带环和不带环迷宫求最短路径(C语言)

求解了简单迷宫,接下来我们来看一看多通路的带环和不带环的迷宫求最短路径的问题。 问题一:不带环的多通路迷宫求最短路径 思路: 1、给定一个点,判断该点是否能落脚,不能落脚直接返回 2、能落脚就将这个点标记,并且入栈cur_path,该栈中保存着我们走过的路径 3、判断这个点是否为出口,是出口说明找到了一条路 4、此时cur_path栈中保存着我们走过的这条路,将cur...

2018-04-21 22:20:55 529

原创 回溯法求解简单迷宫(C语言)

前两天学习了栈和队列的相关知识,今天来看一下如何用栈来走出迷宫。 先来一个迷宫:0表示墙(不能走),1表示路(能走)为便于观察我将这里可走的路用红色标记一下 前面收到我们要使用栈的相关知识来走出这个迷宫,下面就正式开始来说一说怎么解决迷宫问题。 方法一:使用函数本身的栈。我们都知道调用一个函数时,该函数都会形成自己的函数调用栈,当函数调用结束返回以后,该栈结构就会随之消失,而这里的调用栈的

2018-04-21 11:19:07 4173

原创 判断元素出栈入栈顺序的合法性(C语言)

题意:假设有字符串1**abcde**和字符串2**bceda**,试判断是否能以字符串1的入栈顺序得到字符串2的出栈顺序。思路: 步骤1:先将字符串1的第一个字符入栈: 步骤2:将该元素与字符串2的下一个元素进行比较 步骤3: a):如果相等,就将该元素出栈并且将字符串1的下一个字符入栈,与字符串2的下一个字符进行比较。 b):如果不相等,继续将字符串1的...

2018-04-17 20:43:50 5984

原创 通过一个数组实现两个栈(C语言)

通过一个数组实现的两个栈也叫作共享栈。我们可以将一个数组一分为二,供两个栈使用。 也有另外一种虽然也是讲一个数组一分为二供两个栈使用,但在具体实现上有所不同。 牢记栈1的区间是[0,top1)的左闭右开区间,栈2的区间是[top2,max_size)的左闭右开区间。其中的top1位置并不存放栈1的值,而max_size是数组的边界值也取不到。 正式由于两个栈的区间的取值,所以当top1与...

2018-04-17 20:06:01 2475

原创 通过两个队列实现一个栈(C语言)

stackBy2Queue.h文件#pragma once#define max_size 1000typedef char DataType;typedef struct Queue{ DataType data[max_size]; int head; int tail; //队列中有效元素个数 int size;}Queue;...

2018-04-16 23:42:01 9662 1

原创 通过两个栈实现一个队列(C语言)

思路:如下图,我们可以定义两个栈,其中一个input用于实现队列的入队列的操作(就是input栈的入栈),另外一个output用于实现出队列和取队首元素的操作(就是output栈的出栈和取栈顶元素)。 当我们要出队列或者去队首元素时时,因为出队列和取队首元素要从output栈出,所以要先将input中的元素移到output中(而且谁最后入栈,就先把谁移到output中,这样一来,后入栈(后入队

2018-04-16 00:33:34 3139

原创 实现一个栈:取栈中的最小值的时间复杂度为O(1)

思路:每次入栈前先找到最小的元素(每次有新元素入栈时就将新的元素假设为最小的元素min)(情况1:入栈时,栈内没有任何元素,即是一个空栈。这时候先将要入栈的元素入栈,再紧接着将最小的元素入栈;*情况2*:入栈时栈内已经有元素了,这时候将最小值min与栈顶元素相比较,如果栈顶元素比最小值还要小,则将其赋值给最小值min(min永远是最小的值)。然后先将要入栈的元素入栈再紧接着将最小值入栈。)如此一来...

2018-04-15 15:27:56 1791

原创 进程间通信(四)---信号量

信号量主要用于同步和互斥的。 进程互斥: 1:由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程竞争使用这些资源,进程的这种关系就叫做进程互斥 2:系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源 3:在进程中涉及到互斥资源的程序段叫临界区例如: 进程同步 进程同步指的是多个进程之间相互配合共同完成一项任务 比如我们日常生活中的

2018-04-15 13:11:17 285

原创 C语言实现链式队列

C语言实现基于顺序表的顺序队列 linkqueue.h文件#pragma oncetypedef char linkType;typedef struct linkNode{ linkType data; struct linkNode *next;}linkNode;//初始化函数void linkQueueInit(linkNode **qhead);...

2018-04-14 09:12:53 2000 1

原创 C语言实现基于链表的链式栈

C语言实现基于顺序表的顺序栈 代码实现: linkStack.h文件#pragma once#include&lt;stddef.h&gt;typedef char linkType;typedef struct linkNode{ linkType data; struct linkNode *next;}linkNode;linkNode *stac...

2018-04-13 22:48:51 223

原创 进程间通信(三)---共享内存

共享内存区是最快的IPC形式。一旦这样的内存映射到共享他的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说就是进程不再通过执行进入内核的系统调用来传递彼此的数据。 共享内存示意图 共享内存数据结构struct shmid_ds { struct ipc_perm shm_perm; /* operation perms */ int shm_segsz

2018-04-12 23:07:46 166

原创 进程间通信(二)---消息队列

前面我们讲了进程间通信的其中一种方式,进程间通信(一)—管道,现在我们来讲一下另外一种方式就是消息队列。 1: 消息队列提供了从一个进程向另外一个进程发送一块数据的方法。 2:每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值。 3:消息队列也有管道一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数也是有上限的(MSGM...

2018-04-12 21:30:47 238

原创 进程间通信(一)---管道

进程间通信的目的: 1、数据传输:一个进程需要将他的数据发送给另一个进程 2、资源共享:多个进程间共享同样的资源 3、通知事件:一个进程需要向另一个或一组进程发送消息,通知他(他们)发生了某种事件(如进程终止时要通知父进程)。 4、进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道他的状态...

2018-04-12 11:22:07 514

原创 同步与互斥,生产者消费者模型基本概念

现代操作系统提供了一个并发控制环境,即系统中同时活动着的多个不同的进程,这些进程共享同一个CPU、内存或 I/O设备。特别是对于Linux操作系统来说,其多任务、多用户、分时实时混合的性质决定了多个进程在某种程度上彼此依赖或相互制约的关系,这些关系我们叫“并发关系”,按其性质可以分为同步(synchronization)和互斥(mutual exclusion)两类。互斥: 由于各进程要求共享资源

2018-04-10 23:39:49 566

原创 捕捉信号与可重入函数

之前说过,操作系统会在合适的时候对接受到的信号进行相应的处理。 所谓合适的时候就是:进程从内核态返回至用户态时,会检查信号并进行相应的处理动作。 下面详细说一下到底是怎么一回事 1:当我们执行我们写的一个程序时,可能会因为中断,异常或者系统调用从而进入内核 2:进入内核以后,内核就会处理这些中断,异常或者系统调用,处理完以后,内核就会返回用户态,然而再返回之前,做的最后一件事,就是处理当前进

2018-04-10 22:11:44 257

原创 阻塞信号及相关函数

阻塞信号先来看一下几个常见的信号相关概念: 1实际执行信号的处理动作称为信号递达。 2 信号从产生到递达之间的状态称为信号未决。 3进程可以选择阻塞某个信号。 4被阻塞的信号产生时将一直保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。 5注意:阻塞和忽略是不同的,只要信号被阻塞就永远不会被递达,而忽略就是在递达之后,可选择的一种处理动作。在内...

2018-04-10 17:57:21 655

原创 信号的概念和信号的产生

信号的概念: 这里提到信号,也有必要说一下信号量,信号量是进程间通信的一种方式,与现在要讲的信号并无关系。这里要区分开来。当操作系统接受到信号以后,会在合适的时候执行相应的动作。在我们的日常生活中,红绿灯是一种信号。而我们由于从小便被人告知,红灯停绿灯行……这种规则,因此,我们首先记住了红绿灯这个东西,随后,因为我们已经知道了红绿灯所对应的规则,当我们在遇到红绿灯时就会做出相应的动作。这里,操作系

2018-04-10 16:36:58 381

原创 C语言实现基于顺序表的队列

队列:有且仅有三种操作:入队列,出队列,取队首元素。 只允许从一端进行插入数据操作(入队列),从另一端进行删除数据操作(出队列)或者取队首元素操作。进行插入操作的这一端叫做队尾,进行删除操作的这一端叫做队首。 特点:先进先出代码实现:seqQueue.h文件#pragma once#define Max_Size 100typedef char QueueType;typedef struct

2018-04-10 01:21:20 580

原创 C语言实现顺序栈

栈:是一种特殊的线性表,我们只能对栈 的固定的一端进行插入和删除元素操作。这固定的一端被称之为栈顶,另外一端就叫做栈底。如果一个栈中没有任何元素就将其称为空栈。 特性:先进后出(后进先出) seqstack.h文件#pragma once#include&lt;stddef.h&gt;typedef char seqStackType;typedef struct se...

2018-04-07 23:10:50 6157 1

原创 单链表的相关面试题(一)

以下内容接《C语言实现单链表的增删查改》有需要者自行戳链接查看 linklist.h文件新增内容//冒泡排序void linklistBubbleSort(LinkNode *head);//找出中间节点LinkNode *FindMidNode(LinkNode *head);//找倒数第K个节点LinkNode *FindLastKNode(LinkNode *head,siz...

2018-04-07 13:58:16 330

原创 C语言实现双向链表的增删查改

定义一个带头节点的双向链表需要一个数据域两个指针域,其中一个next指针是指向当前节点的下一个节点,另外一个prev指针是指向当前节点的前一个节点。如下图所示: 该头结点本质上只是一个傀儡节点并无实际用处,带头节点的好处就是我们在实际操作链表时不用考虑头指针的指向。而双向链表的前后指针域也大大方便了我们对于链表的实际操作。 代码示例: DBlinklist.h文件#pragma ...

2018-04-03 22:35:04 3505 2

空空如也

空空如也

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

TA关注的人

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