自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 双向通信管道

我们知道管道有匿名管道和命名管道,但是他们只能用于单向的通信,现在有一种双向管道用来进行双方的通信:sockpair来实现#include <stdio.h>#include <sys/socket.h>#include <string.h>int main(){ int fd[2]; int ret=socketpair(PF_LOCAL,SOCK_STREAM,0,fd);

2017-08-25 14:54:12 1707

原创 socket编程(TCP多线程客户端服务器)

能够实现一个服务器与多个客户端之间通信 Makefile中引入了pthread库 Makefile.PHONY:allall:server clientserver:server.c gcc -o $@ $^ -lpthreadclient:client.c gcc -o $@ $^ -lpthread.PHONY:cleanclean: rm -f serve

2017-08-24 17:25:08 874 1

原创 socket编程(TCP多进程客户与服务器)

能够实现一个服务器与多个客户端之间通信 server.c#include <stdio.h>#include <string.h>#include <arpa/inet.h>#include <netinet/in.h>#include <sys/socket.h>#include <stdlib.h>void Usage(char* proc){ printf("usage:

2017-08-24 17:21:57 948

原创 进程间通信之共享内存

共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进

2017-08-15 07:53:10 336

原创 进程间通信之信号量

信号量的本质是一种数据操控锁,它本身不具有数据交换的功能,而是通过来控制其他的通信资源来实现进程间通信的,信号主要负责数据的同步与互斥功能。进程请求一个使用信号量来表示的资源时,首先要读取信号量的值来判断资源是否能被使用,若信号量的值大于0,资源可用,等于0,无资源可用,同时进程会进入睡眠状态,直到有资源可用。当进程不再使用一个信号量控制的共享资源时,信号量的值+1,对信号量的值进行的增减操作均为原

2017-08-14 20:37:00 244

原创 进程间通信之消息队列

消息队列提供了一种从一个进程向另一个进程发送数据块的方法,每个数据块都被认为是由一个类型的,接收者进程接收的数据块可以有不同的类型。消息队列是基于消息的,管道式基于字节流的,可以用发送消息的方式来避免管道的同步与阻塞问题,消息队列的读取,不一定是先进先出。 消息队列与命名管道有一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限(MSGMNB),系统上消息

2017-08-14 18:02:48 279

原创 进程间通信之命名管道

前面所说的pipe我们叫它匿名管道,他只能用于有关系的进程之间的通信,为了实现不同进程之间的通信,有一种管道叫做命名管道Fifo来实现任意两个进程之间的通信。命名管道是一个设备文件,总是按照先进先出的工作方式来进行的,在文件系统中是以文件名的形式存在的。 首先创建命名管道可以有2种方式: 1.在shell下用命令mknod或者mkfifo来创建 2.调用系统函数mknod或者mkfifo函数创

2017-08-14 16:13:17 310

原创 进程间通信之匿名管道

我们知道每个进程都有各自 的进程地址空间,一个进程看不到另外一个进程的全局变量,那么要实现进程之间的数据交换,必须要通过内核,首先内核要先开辟缓冲区,进程1先把数据拷贝到内核的缓冲区中,进程2再从缓冲区中把数据拿走,内核提供的这种机制就叫做进程间通信。 管道是一种基本的IPC机制,用于创建管道的函数为pipe;#include <unistd.h>int pipe(int filedes[2])

2017-08-14 15:47:05 481

原创 UDP套接字编程

UDP是用户数据报协议,与TCP协议一样,在网络中处理数据包,是一种无连接的传输层协议,具有不可靠性,UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。 基于UDP的客户端服务器: 服务器:#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#inc

2017-08-10 14:13:40 241

原创 socket编程(TCP单进程客户服务器通信)

服务器#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <string.h>#include <arpa/inet.h>void Usage(char* proc){printf("usage:%s [loc

2017-08-08 12:50:59 381

原创 socket套接字编程预备知识

我们知道“IP+端口号”标识网络通讯中的一个唯一的进程,这里我们说”IP+端口号“就是socket. 介绍一下网络字节序的知识,我们都知道内存中的多字节数据相对于内存地址来说有大端和小端之分,磁盘文件中的多字节数据相对于文件偏移来说也有大端和小端之分,同样网络数据流也有大端和小端之分,发送主机把发送缓冲区中的数据按照内存地址从低到高的顺序发送出去,接收主机把接收到的数据按照内存地址从低到高的顺序保

2017-08-08 10:13:42 243

原创 求二叉树中两个节点的最近公共祖先

要求考虑以下三种种情况,给出解决方案,并解决: 1:二叉树是搜索二叉树。2: 二叉树每个节点有parent(三叉链) 3:就是普通二叉树。(尽可能实现时间复杂度为O(N)) 针对第一种情况,是一棵二叉搜索树,我们可以根据数据的大小来判断两个节点的位置,如果在根节点的2侧,则根节点为最近公共祖先,如果在根节点的同侧,继续寻找2个节点的位置TreeNode* PublicLowParent(TreeN

2017-08-02 22:25:41 845

原创 判断一棵树是否是完全二叉树

首先我们要了解什么事完全二叉树。 完全二叉树: 假设一颗二叉树的深度为h,除了第h层以外,其余各层节点的个数全都达到了每层的最大值,即2^(n-1),只有第h层的结点个数小于或者等于2^(h-1),而且节点都连续集中在最左边,这就是完全二叉树,当然当第h层结点达到最大值时,叫做满二叉树,满二叉树是一种特殊的完全二叉树; 如图所示为完全二叉树: 从根结点开始遍历整棵二叉树,(所假设的节点之前为

2017-08-02 10:55:04 4348 2

原创 判断一个节点是否在一棵二叉树中&&判断一颗二叉树是是否是另一颗树的子树

1.判断一个节点是否在一颗二叉树中 首先判断此节点是不是根节点,是根节点的话就返回表示节点在树中,否则递归根节点的左右子树,继续向下寻找bool _IsNode(Node* node,Node* root) { if (root == NULL) return false; //节点位根节点 if (node->_da

2017-08-02 09:50:42 632

原创 已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={

void difference(PNode* LA, PNode LB){ PNode pa = *LA; PNode pre = NULL; PNode pb = LB; PNode p = NULL; while (pa) { pb = LB; while (pb&&pa->data != pb->data)//数据

2017-08-02 09:45:09 343

原创 一个数组中有一个数字的次数超过了数组的一半,求出这个字符

首先我们想到的就是排序,排序完成后找到中间的数字即为数组中超过一半的数字,但是后来又想想,数据特别多的话排序就显得力不从心。 本题可以用标志位来标记数据:首先记录一个数据,继续遍历下一个数据,如果数据以第一个相同,就将标志位加一,继续下一个数据,要是不相同就将标志位减一,如果标志位为0.重新记录数据int findhalf(int *a, int sz){ int flag = 0;

2017-08-02 09:38:21 281

原创 给定一个整数N,那么N的阶乘N!末尾有多少个零呢?

我们知道最小的两个数相乘能出来0的就是2和5了,那么对于所有整数来说,能被2整除的数要多于能被5整除的数,所以这道题的解题思路就是:判断从1-N这些数中一共有包含的5的个数。 代码如下:int NumZero(int n){ int count = 0; for (int i = 1; i <= n; i++)//找寻1-n中每个数字包含的5个个数的总和 {

2017-08-02 09:11:00 1236

原创 一个m*n的矩阵,从左到右从上到下都是递增的,给一个数x,判断x是否在矩阵中。要求效率尽可能的高

我们可以这样入手,比如给一个3*3的二维数组,从每一行的最大值开始比较: 1.如果X大于a[0][2],第一行中的数据肯定都比x小,所以继续跟下一行的a[1][2]比较 2.如果X小于a[0][2],第3列中的数据肯定都比x大,所以继续跟上一列的 a[0][1]比较 3.循环条件为行数>=0;列数<=n-1; 实现代码如下:#define M 3#define N 3bool Find

2017-08-02 09:03:34 868

原创 求一颗二叉树的镜像

下面我给出一棵二叉树和他的镜像,所谓镜像就是一棵树就跟在镜子中显示一样,左右反转,示意图如下: 根节点的左右孩子互换,我们可递归实现:void _MirrorTree(Node* root) { if (root == NULL)//树为空 return; if (root->_left == NULL&&root->_right

2017-08-02 08:51:36 296

原创 c语言模拟实现c++的继承多态

c++有封装、继承和多态三大特性,其中多态分为静态多态与动态多态,动态多态是通过虚函数实现的,一个类中如果有虚函数,那么就需要维护一张虚表来存放虚函数的地址,c语言中我们用结构体来模拟类。 代码如下: 其中A模拟父类,B模拟子类#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <stdlib.h>void funA()

2017-08-01 11:05:06 244

空空如也

空空如也

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

TA关注的人

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