自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

吾竹清风2017

专注于互联网技术、物联网技术、嵌入式linux、高并发技术

  • 博客(120)
  • 收藏
  • 关注

原创 多线程服务器适用场合

进程”指的是fork(2)系统调用的产物线程”指的是pthread_create()的产物,因此是宝贵的那种原生线程。而且Pthreads是NPTL的,每个线程由clone(2)产生,对应一个内核的task_struct。Pthreads是一组线程操作的标准,NPTL是 Native POSIX Thread Library 的缩写,是Linux上实现Pthreads标准的一个库。NPTL是Pthreads在Linux平台上的具体实现。NPTL提供了线程创建、同步、互斥、条件变量等功能。

2024-03-15 11:46:58 979

原创 samba 服务搭建 (ubuntu20.04)

#1、移除旧版本$sudo apt-get autoremove samba samba-common#2、安装sambda服务$sudo apt-get install samba samba-common#3、设置共享目录$sudo mkdir -p /var/study$sudo chmod 777 /var/study#4、添加 samba用户$ sudo smbpasswd -a hzmctNew SMB password: # 密码为 hzmct#5、添加共享目录$sud.

2021-09-17 15:05:27 626

原创 图解归并算法

#include <stdio.h>#include <malloc.h>#include <stdlib.h>/* 归并排序是一种效率较高的排序方法,它分为拆分和合并两大部分,先拆后合。 step 1 : 拆分,就是将一堆无序的数拆成单个,方便合并。 step 2 :合并(merge),就是将拆分好的数按照排序规则再拼凑起来 一个元素,可以看做是有序的,是稳定的算法*/void printArray(int array[], ...

2020-10-19 10:53:21 266

原创 图解快速排序优化

1、快速排序的基本思想: 快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字 均比另一部分记录的关键字小。之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。 2、快速排序的三个步骤: (1)选择基准:在待排序列中,按照某种方式挑出一个元素,作为 "基准"(pivot) (2)分割操作:以该基准在序列中的实际位置,把序列分成两个子序列。此时,在基准左边的元素 都比该基准...

2020-10-19 10:30:46 335

原创 图解快速排序

概念

2020-10-13 17:21:27 149

原创 图解希尔排序(Shell Sort)

希尔排序的原理希尔排序算法是突破时间复杂度的第一批算法之一。思想:对直接插入排序改进后可以增加效率直接插入排序某些时候很高:(1)记录本身就是基本有序的,只需要少量插入工作,就可完成整个集的排序(2)记录比较少时如何让待排序的记录个数较少呢?希尔算法#include <stdio.h>#include <malloc.h>#include <stdlib.h>void knPrint(int array[], ..

2020-10-13 15:40:07 293

原创 冒泡排序

#include "stdio.h"#include "stdlib.h"#include "string.h"/* 难点1:相邻元素比较 难点2:冒泡的优化 判断选择法和冒泡法的方式 是关键看 是否是相邻元素比较 (选择法是从一组数据中选择最小的)*/void printfArray(int array[], int len){ int i = 0; for (i = 0; i<len; i++) { printf("%d "...

2020-10-10 17:43:34 118

原创 插入排序

概念思想:括号中的序列是一个有序序列#include <stdio.h>#include <malloc.h>#include <stdlib.h>void knPrint(int array[], int len){ for (int i = 0; i < len; i++) { printf("%d ", array[i]); } printf("\n");}void swap(int array[], in..

2020-10-10 16:18:34 98

原创 选择法排序

概念选择法思想 :在每趟中,将最小的数挑出来#include "stdio.h"#include "stdlib.h"#include "string.h"//选择法void printArray(int array[], int len){ int i = 0; for (i = 0; i<len; i++) { printf("%d\t", array[i]); } printf("\n");}void swap(int array[], int.

2020-10-10 16:06:06 114

翻译 函数调用的三种方式 __cdecl、__stdcall、__fastcall

__cdecl、__stdcall、__fastcall是C/C++里中经常见到的三种函数调用方式。__cdecl是C/C++默认的调用方式__stdcall是windows API函数的调用方式,只不过我们在头文件里查看这些API的声明的时候是用了WINAPI的宏进行代替了,而这个宏其实就是__stdcall了。函数的调用过程是通过函数栈帧的不断变化实现的:函数的调用,涉及参数传递,返回值传递,调用后返回,这都是通过栈的变化来实现的,对于三种调用约定而言:__cdecl:..

2020-10-10 11:23:46 6596

原创 图解霍夫曼树-压缩算法的基础

对于文本”BADCADFEED”的传输而言,因为重复出现的只有”ABCDEF”这6个字符,因此可以用下面的方式编码: 接收方可以根据每3个bit进行一次字符解码的方式还原文本信息。这样的编码方式需要30个bit位才能表示10个字符那么当传输一篇500个字符的情报时,需要15000个bit位在战争年代,这种编码方式对于情报的发送和接受是很低效且容易出错的。如何提高收发效率?要提高效率,必然要从编码方式的改进入手,要避免每个字符都占用相同的bit位 ...

2020-10-09 17:27:25 434

原创 宏定义#define使用#、##、__stringify

#include "stdafx.h"#include <string>using namespace std;#include <iostream>void test(){ { /* # (stringizing)字符串化操作符。 其作用是:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。 其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。 */ #define example(instr) printf("the.

2020-10-09 16:30:31 633

原创 图解 二叉线索树

二叉线索树 概念 普通二叉树只能找到结点的左右孩子信息,而该结点的直接前驱和直接后继只能在遍历过程中获得。 若可将遍历后对应的有关前驱和后继预存起来,则从第一个结点开始就能很快“顺藤摸瓜”而遍历整个树了。 理解:线索化核心算法的理解类似使用2个辅助指针变量交替的挖字符串代码讲解按照严老师 增加一个头结点#define _CRT_SECURE_NO_WARNINGS#include...

2020-10-09 10:04:10 550

原创 图解c++之抽象工厂模式

概念抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。产品族和产品等级结构备注1:工厂模式:要么生产香蕉、要么生产苹果、要么生产西红柿;但是不能同时生产一个产品组。抽象工厂:能同时生产一个产品族。===》抽象工厂存在原因解释:具体工厂在开闭原则下, 能生产香蕉/苹果/梨子; (产品等级结构)抽象工厂:在开闭原则...

2020-09-28 16:44:30 179

原创 图解c++之工厂模式(别名多态工厂模式)

概念 工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 。工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。类图角色和职责抽象工厂(Creator)角色工厂方法模式的核心,任何工厂类都必须实现这个接口。具体工厂( Concrete Creator)角色具..

2020-09-28 16:22:38 502

原创 图解c++之简单工厂模式

什么是简单工厂模式 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。模式中包含的角色及其职责1.工厂(Creator)角色简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。2.抽象(Product)角色简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。3.具体产品(Concrete Product)角色简单工厂模式所创建.

2020-09-28 15:54:29 146

原创 图解c++之代理模式

概念Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问。所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理。类图角色和职责在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 代理模式中的角色如下: 抽象主题角色(S...

2020-09-28 09:52:59 673

原创 树的非递归遍历(使用c语言)

#include <stdio.h>#include <string.h>#include "knLinklist.h"#include "knLinkstack.h"//二叉链表typedef struct BiNode{ int data; struct BiNode *lchild, *rchild;}BiNode, *BiTree;#if 1//找到向左走,找到中序遍历的起点BiNode *goLeft(BiNode *T, LinkStack .

2020-09-25 09:17:49 297

原创 图解 使用#法确定一棵树

#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>#include <string.h>#include <stdio.h>/* 1 / \ 2 3 / \ / \ 4 # # # / \ # #先序遍历 根左右124###3## 通过先序遍历124###3##可以唯一确定一棵树注意: 3## 说明3一定...

2020-09-24 17:39:29 219

原创 图解 如何确定一个树

2020-09-24 17:36:54 288

原创 树的非递归遍历(中序遍历)

算法:#include <iostream>#include <stack>using namespace std;/* 二叉树的遍历---中序遍历非递归算法 中序 遍历的几种情况 分析1:什么时候访问根、什么时候访问左子树、什么访问右子树 当左子树为空或者左子树已经访问完毕以后,再访问根 访问完毕根以后,再访问右子树。 分析2:为什么是栈,而不是其他队列。 先走到的后访问,后走到的先访问,显然是栈结构 分析3:结点所有路径情况 .

2020-09-24 17:32:28 855

原创 树的应用:求树的叶子节点数 求树的高度、copy一棵树

#if 0//树的应用//1、求树的叶子节点: 度为0的节点//先判断根节点是否是叶子节点,然后计算左子树的叶子节点个数//在计算 右子树节点个数void coutLeaf(BiNode *T, int *sum){ if (T != NULL){ //相当于先序遍历这棵树,计算叶子节点 if (T->lchild == NULL && T->rchild == NULL){ (*sum)++; } if (T->lchild){ .

2020-09-22 16:03:40 697

原创 图解树的3种遍历方式

#include <stdlib.h>#include <string.h>#include <stdio.h>//二叉链表typedef struct BiNode{ int data; struct BiNode *lchild, *rchild;}BiNode, *BiTree;#if 0/* 1、 对树的访问本质,将打印去掉,访问的逻辑是一样的,只不过是打印的时机不同, 即访问的路径是一样的,访问的时机不...

2020-09-22 16:00:36 880

原创 树的基本定义、二叉树的性质、树与二叉树的转换和树的表示法

#include <stdlib.h>#include <string.h>#include <stdio.h>/* 树的定义: (1)树是递归定义的 (2)m个互不相交的有限集合 术语: 根 叶子 森林 有序树 无序树 结点:树中的数据元素 结点的度:结点拥有的子树数 叶结点:度为0的结点 树的度:树中各结点的度的最大值 树的深度(高度):树中结点的最大层次(根节点算作第一层...

2020-09-18 17:44:05 262

原创 图解队列的链式存储

#ifndef _KN_LINKQUEUE_H_#define _KN_LINKQUEUE_H_typedef void LinkQueue;//创建链式队列LinkQueue* LinkQueue_Create();//销毁链式队列void LinkQueue_Destroy(LinkQueue* queue);//清空链式队列void LinkQueue_Clear(LinkQueue* queue);//向链式队列队尾添加一个元素int Lin...

2020-09-18 17:36:28 336

原创 图解队列的顺序存储

#ifndef _KN_SEQQUEUE_H_#define _KN_SEQQUEUE_H_typedef void SeqQueue;//创建线性队列SeqQueue* SeqQueue_Create(int capacity);//销毁线性队列void SeqQueue_Destroy(SeqQueue *queue);//清空线性队列void SeqQueue_Clear(SeqQueue *queue);//进队列int SeqQueue_Append...

2020-09-18 17:29:12 240 1

原创 栈的应用示例

#include "stdlib.h"#include "stdio.h"#include "string.h"#include "knLinkstack.h"#if 0//--------------------------------------------------------------------------/* 栈的应用1 应用1:就近匹配 几乎所有的编译器都具有检测括号是否匹配的能力 如何实现编译器中的符号成对检测? #include <stdio.h&gt.

2020-09-18 17:24:29 308

原创 图解栈的链式存储

#ifndef _KN_LINKSTACK_H_#define _KN_LINKSTACK_H_//使用链表的链式存储 模拟栈的链式存储typedef void LinkStack;//创建栈 相当于创建一个线性表LinkStack* LinkStack_Create();//销毁栈 相当于 销毁一个线性表void LinkStack_Destroy(LinkStack* stack);//清空一个栈 相当于 清空一个线性表void LinkStack_C...

2020-09-18 17:20:58 535

原创 图解栈的顺序存储

栈是一种 特殊的线性表栈仅能在线性表的一端进行操作栈顶(Top):允许操作的一端栈底(Bottom):不允许操作的一端#ifndef _KN_SEQSTACK_H_#define _KN_SEQSTACK_H_typedef void SeqStack;//创建一个线性栈SeqStack* SeqStack_Create(int capacity);//释放一个线性栈void SeqStack_Destory(SeqStack *stac...

2020-09-11 14:58:44 190

原创 图解双向链表

插入删除#ifndef _MY_DLINKLIST_H#define _MY_DLINKLIST_Htypedef void DLinkList;typedef struct _tag_DLinkListNode{ struct _tag_DLinkListNode *next; //后继指针 struct _tag_DLinkListNode *pre; //前驱指针}DLinkListNode;//创建双向...

2020-09-11 11:09:09 573

原创 循环链表的应用-约瑟夫问题

约瑟夫问题-循环链表典型应用 n 个人围成一个圆圈,首先第 1 个人从 1 开始一个人一个人顺时针报数,报到第 m 个人,令其出列。然后再从下一 个人开始从 1 顺时针报数,报到第 m 个人,再令其出列,…,如此下去,求出列顺序。 #include <stdlib.h>#include <stdio.h>#include "knCirclelist.h"#include "knDebug.h"#if 0typedef struct Va...

2020-09-10 16:32:28 262

原创 图解循环链表

插入的3种场景:第一种:第二种:第三种:删除的3种场景

2020-09-10 16:06:46 978

原创 单链表结构与顺序存储结构优缺点比较

2020-09-09 11:27:33 187

原创 图解线性表的链式存储

#ifndef _MYLINKLIST_H_#define _MYLINKLIST_H_//链表typedef void LinkList;//链表节点typedef struct _tag_LinkListNode{ struct _tag_LinkListNode *next;}LinkListNode;LinkList* LinkList_Create();void LinkList_Destroy(LinkList* list);...

2020-09-09 10:48:25 232

原创 图解线性表的顺序存储结构

#ifndef __KNSEQLIST_H__#define __KNSEQLIST_H__typedef void SeqList;typedef void SeqListNode;//创建线性表SeqList * SeqList_Create(int capacity);//销毁线性表void SeqList_Destroy(SeqList *list);//清空线性表void SeqList_Clear(SeqList *list);//获取线性表的长...

2020-09-07 16:18:05 1261

原创 windows 共享内存api整理

1、CreateFileMapping 创建一个内存文件映射对象HANDLE CreateFileMapping( HANDLE hFile, // handle to file to map LPSECURITY_ATTRIBUTES lpFileMappingAttributes, // optional security attributes DWORD flProtect, // ...

2020-08-07 16:50:24 868

转载 ftp服务搭建

转载https://mp.weixin.qq.com/s/HxD4PigHH9xOFS1od70MCA提前关闭selinux 和firewalld防火墙1.安装vsftp软件包$ yum -y install vsftpd*2.启动vsftpd服务器$ systemctl restart vsftpd$ systemctl enable vsftpd3.检查服务是否正常启动$ ps -ef|grep vsftp && netstat -tunlp|grep .

2020-05-20 08:40:14 459

转载 QT中文乱码

支持Qt4和Qt5,windows与linux跨平台(1)、中文编码一律使用QString::fromLocal8Bit()接口。原因:需要支持QT4版本。QStringLiteral()方法也可取,但是它只支持QT5版本,如果没有版本问题,可以使用。(2)、CPP等文件编码一律使用UTF8—BOM格式。原因1:UTF8-无BOM在使用window编译器cl中编译会失败,当然除非你Wind...

2019-11-28 11:18:04 155

翻译 对信号量的理解

进程的三种状态进程通常分为就绪、运行和阻塞三个工作状态。三种状态在某些条件下可以转换,三者之间的转换关系如下:三态模型.jpeg进程三个状态之间的转换就是靠PV操作来控制的。PV操作主要就是P操作、V操作和信号量。其中信号量起到了至关重要的作用。信号量信号量是最早出现的用来解决进程同1步与互斥问题的机制。 信号量(Semaphore)由一个值和一个指针组成,指针指向等待该信号量的进程...

2019-09-29 09:03:58 2354

原创 视频笔记nginx

qps:每一秒钟能够处理多少请求。

2019-04-29 08:18:43 150

空空如也

空空如也

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

TA关注的人

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