自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

cookie

一个爱写代码的农夫

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

原创 八大排序

八 大 排 序 直接插入排序:  类似扑克牌游戏,每次插入时,都为其寻找一个合适的位置,越有序越快,稳定   平均时间复杂度:o(n*n)   最好时间复杂度:o(n)   空间复杂度:o(1) 2.希尔排序对大量的数据进行分组,减少时间复杂度。有一个增量序列,最后一个必须是1。跳跃式的排序,所以并不稳定时间复杂度:o(n^1.3)~o(n^1.5...

2018-10-24 08:11:33 237

原创 链表的环

链表有环的定义:单链表的尾节点指向了链表中间的某个结点。如图所示:                                                结点3就是环的入口点思路:我们采用快慢指针fast和slow来进行判断。这两个指针初始值均指向头,slow每次向前一步,fast每次向前两步,slow每次向前一步,如果该单链表有环,则它们必定会在环中相遇。如果fast遍历到尾部为NULL...

2018-05-22 22:04:39 222

原创 服务器客户端通信

服务器端客户端客户端输出服务器输出

2018-04-19 17:38:18 147

原创 静态顺序表

#ifndef _SQLIST_H#define SIZE 10typedef struct Sqlist{ int elem[SIZE]; int length;}Sqlist;void InitSqlist(Sqlist *plist);bool Insert(Sqlist *plist,int pos,int val);bool Delete(Sqlist *plist,int pos);v...

2018-04-19 16:37:05 143

原创 动态顺序表

#ifndef _DSQLIST_H#define INIT_SIZE 10typedef struct DSqlist{ int *elem; int usedsize; int size;}DSqlist;void InitDSqlist(DSqlist *plist);static bool IsFull(DSqlist *plist);static void Inc(DSqlist *pl...

2018-04-19 16:33:14 99

原创 高级I/O函数

#includeInt dup(int file_descriptor)dup函数创建一个新的文件描述符,该新文件描述符和原有文件描述符file_descriptor指向相同的文件、管道或者网络连接。成功返回的文件描述符总是取系统当前可用的最小整数值。失败返回-1。#includeInt dup2(int file_descriptor_one,int file_descriptor_two)du...

2018-04-11 17:37:10 99

原创 静态库和动态库

库文件是预先编译好的方法的集合,一种可执行的二进制代码(但不可独立执行),可以被操作系统载入内存执行。Windows和linux二者的库的二进制是不兼容的。Windows系统静态库的扩展名为.lib,动态库扩展名为.dll。Linux系统静态库的扩展名为.a,动态库的扩展名为.so。Linux中有两种库:静态库和动态库(共享库)。静态库:1. 特点:程序在链接的过程当中,链接器从库文件中取得所需代...

2018-04-11 17:37:04 130

原创 TCP协议详解

TCP:面向连接,字节流,和可靠传输使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写。双方都必须要为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。TCP连接是全双工的,即双方的数据可以通过一个连接进行。完成数据交换之后,通信双方都必须断开连接以释放系统资源。TCP:发送端执行的写操作次数和接收端执行的读操作次数之间没有任何数量关系。TCP如图所示:UDP如图所示:TC...

2018-04-11 17:36:52 240

原创 socket

socket地址:是一个IP地址和端口对(ip,port),唯一的表示了使用TCP通信的一端。通用socket地址:表示socket地址的结构体:#includestruct sockadddr{  sa_family_t  sa_family;  char sa_data[14];};sa_family是地址族类型的变量。地址族类型通常与协议族类型相对应。 sa_data成员用于存放socket...

2018-04-11 17:36:34 190

原创 大小端模式

大端字节序(网络字节序):将低位字节存放在内存的高地址端,高位字节存放在内存的低地址端。小端字节序(主机字节序):将低位字节存放在内存的低地址端,高位字节存放在内存的高地址端。举一个例子:如何判断机器字节序?Linux提供了如下四个函数来完成主机字节序和网络字节序之间的转换:#includeunsigned  long   int   htonl(unsigned long int hostlon...

2018-04-11 17:36:21 216

原创 线程

线程管理线程的概念:线程是进程内部的一条执行序列(执行流),每个进程至少有一条执行序列:main的执行体。进程可以通过线程库创建N条线程,这些新创建的线程称之为函数线程,main函数所代表的线程为主线程。线程在进程内部共享地址空间、打开的文件描述符、全局变量等资源。同时线程也有其私有的数据信息,包括:线程号、寄存器(程序计数器和堆栈指针)、堆栈、信号掩码、优先级、线程私有存储空间。引入线程的原因:...

2018-04-11 17:36:12 109

原创 消息队列

消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。Linux用宏MSGMAX和MSGMNB来限制一条消息的最大长度和一个队列的最大长度msgget函数  该函数用来创建和访问一个消息队列。它的原型...

2018-04-11 17:35:55 118

原创 共享内存

共享内存最为高效的进程间通信方式进程直接读写内存,不需要任何数据的拷贝  .为了在多个进程间交换信息,内核专门留出了一块内存区  .由需要访问的进程将其映射到自己私有地址空间  .进程直接读写这一内存区而不需要进行数据的拷贝,提高了效率多个进程共享一段内存,需要依靠某种同步机制,如互斥锁和信号量等共享内存编程步骤:创建共享内存  .函数shmget()  .从内存中获得一段共享内存区域所需头文件#...

2018-04-11 17:35:38 113

原创 文件操作

Linux下的文件系统:                 根目录/bin  /home /root /usr /etc /dev/proc /lib ……/home:所有普通用户的家目录/home/stu:stu的家目录/bin:命令所对应的可执行文件/etc:系统的配置文件/proc:虚拟目录,内存的映射/root:超级管理员,root用户的家目录/dev:所有的接口设备文件/lib:系统使用的...

2018-04-11 17:33:35 97

原创 实现su命令

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <assert.h>#include <sys/types.h>#include <pwd.h>#include <shadow.h&

2018-04-11 17:33:17 236

原创 判断一个数是有符号数还是无符号数

#include int main(){    unsigned int a=0;    if(a    {         printf("unsigned");    }    else    {         printf("signed");    }}打印结果为unsigned分析:如果a为无符号数,则a-1为有符号数,与操作符左边的类型不匹配,编译器会将a-1转换为无符号数,则表达式...

2018-04-10 11:09:54 1481

原创 malloc/free和new/delete

1.        malloc/free是函数,而new/delete是关键字。2.        malloc成功后返回void *指针,需要强转,失败则返回NULL。new成功后返回指向对象的指针,失败抛出异常。虽然C++尽最大的可能去兼容C语言的特性,new失败也会返回NULL,但很少使用。3.        malloc申请空间时要指明申请空间的大小,而new只需要对象名就可以了。4. ...

2018-04-10 11:09:37 106

原创 c和c++的区别

C语言是面向·过程的,C++是面向对象的。C++是在C语言的基础上发展而来的。C++兼容很多C语言的语法特性。1.    C语言没有C++的class。但是C++把C语言中的struct进行扩充,当作类来使用,struct和class唯一不同的是struct的默认成员访问修饰符是public,class的默认成员访问修饰符是private。2.  C语言中的const修饰的变量是常变量,不能用来定...

2018-04-10 11:09:18 107

原创 随笔

无论是指针变量还是普通变量,函数调用时传递的参数均是实参变量的一份拷贝,因为实参是局部变量({}内的变量),所以函数调用并不能修改实参本身,只能修改实参的一份拷贝。指针变量可以通过实参的一份拷贝修改指针所指向的变量。若想要使用修改的指针变量的实参的拷贝1.    return2.    二级指针多维数组只能省略第一维的数组长度是由编译器决定,方便编译器推断数组的行数。避免使用全局变量,因为全局变量...

2018-04-10 11:08:57 84

原创 指针编程题

打印的是实际的数据。&a代表整个数组,&a+1则指向整个数组的下一个元素,所以ptr1[-1]代表数组的最后一个元素。a代表一维数组首元素首地址,(int)a+1则代表一个普通的整数,将上式再转换为一个指针,则该指针存放了数组第一个元素的第二个字节开始的连续四个字节。本题要考虑本机的数据存储模式(大端和小端,我的电脑是小端)...

2018-04-10 11:08:36 701

原创 指针和数组

多维数组形式参数必须写成int(*mat)[10],只有第一维可以这样,必须知道第二维及以后的各维的长度才能对各下标进行求值。函数名代表函数首地址。回调函数:某个函数必须能够在不同的时刻执行不同类型的工作或者执行只能由函数调用者定义的工作。只给非只读变量(可修改左值)赋值,数组名不能做左值。arr和&arr两者的值相同,但意思不同。arr代表数组首元素地址,&arr代表数组首地址。...

2018-04-10 11:08:20 77

原创 指针

编译器按贪心的法则读入符号。余数的符号要求与被除数的符号相同。变量的值就是分配给该变量的内存所存储的值。未被初始化的指针,它所指向的值所保存的位置是未知的。NULL指针不指向任何东西。指针务必进行初始化,当你指定该指针指向什么地址时,你就将该指针初始化为该地址,否则初始化为NULL。指针-指针:两个指针均指向同一个数组中的元素。确保指针的有意义,避免越界指针和指向未知位置的指针。标准允许指向数组元...

2018-04-10 11:08:02 105

原创 关键字的一些计算

static      i=11,j=1.sizeofsigned unsigned :编译器缺省默认情况下数据为signed类型。 -0和+0在内存中存储方式一样,均为0000  0000因为-1 的存储方式为 1111 1111 -0比-1大1,即为1 0000 0000。但是整型只有四个字节,最高位被舍弃。所以+0和-0的存储方式一样空指针是没有指向的指针,将暂时用不到的指针定义成空指针,以...

2018-04-10 11:07:46 690

原创 语句和运算符

语句:空语句:不执行任何任务,以;结尾。C语言无bool值,用整型来代替。0表示假,非0表示真。break和continue用于对包围它的最内层的循环起作用。用goto或将多层循环放在一个函数里,用return关键字跳出多层循环。goto   语句标签 ;//此语句的作用是执行语句标签后的语句。语句标签:与标签想匹配所进行的任务。操作符: 左值可以出现在=的左边,意味着一个特定的位置。右值出现在=...

2018-04-10 11:07:27 86

原创 操作文件函数

文件:指存储在外部介质(磁盘磁带)上数据的集合。ASCAII码文件也叫文本文件。在磁盘中存储每个字符对应的ASCII码。在屏幕上按字符显示,我们可以看的懂。二进制文件按二进制的编码方式来存储文件的,显示在屏幕上时,我们并看不懂。操作系统是以文件为单位对数据进行管理的。FILE * fopen(文件名,使用方式)使用方式:r,w,a,rb,wb,ab,r+,w+,a+,rb+,wb+,ab+成功·返...

2018-04-10 11:07:09 122

原创 变量

整型字面值在缺省的情况下总是默认为int家族中最短但足以容纳整个值的类型。枚举类型后面的值总是比前面的大1。浮点数字面值在缺省的情况下都是double类型的。指针变量就是一个其值为另外一个(一些)内存地址的变量。字符串常量的直接值是一个指针。Int  *a;//*应靠近a。常量:1、constconst int a=5;int  const b=5;//两种方式都可以声明常量,选择一个你所喜欢习惯...

2018-04-09 10:17:04 110

原创 c语言类型转换

C语言类型转换:自动类型转换(默认类型转换,隐式转换,编译器帮你完成)和强制类型转换(自己转成自己想要的类型)。自动类型转换最常见的有:混合运算,赋值运算和函数值的类型转换。赋值运算:就是把=右边的表达式的类型转换成=左边的表达式的类型。混合运算:指在一个表达式中参与运算的对象不是同一种数据类型,这时就需要将一个级别低的变量的数据类型转换为级别高的变量的数据类型。函数返回值的类型转换:强制类型转换...

2018-04-09 10:16:28 190

原创 for/while和if/switch

for适合用于知道循环次数的情况,而while循环适用于知道循环条件的情况。while循环更强大。它们两个的效率基本没有差别。gcc test.c -g/gcc -c test.c    ->a.oobjdump -d a.o//查看程序对应的汇编代码switch(会生成跳转表):1、当case语句小于等于3句的时候,switch语句的底层实现与if-else的底层实现相同。2、当case语...

2018-04-09 10:16:13 208

原创 逻辑位移和算术位移

在C语言标准中,有两种位移分别为算术位移和逻辑位移。逻辑位移:在位移运算符(>>和<<)之前的数是无符号数,编译产生的汇编指令是逻辑位移。算术位移:在位移运算符之前的数是有符号数,编译产生的汇编指令是算术位移。左移:两种位移都在右边补0。右移:逻辑位移在左边补0,算术位移在左边补符号位。...

2018-04-09 10:15:43 5725 1

原创 字符编码

字符集:是指字符的集合。编码集:给字符集中的每一个字符都分配一个整数符号。编码集中字符被分配的整数的编号,不一定就是该字符在计算机中存储的值,具体采用什么二进制整数值要由编码方式决定。一般采用十六进制(便于书写和阅读)来表示某个字符的编码。Unicode是字符集,它有三种编码方式,分别是:UTF-8,UTF-16,UTF-32。UTF-8:特点:1、可变长编码,由第一个字节决定该字符编码长度;2、...

2018-04-09 10:15:24 78

原创 数据类型

在32位操作系统下的32位编译器:1、各种数据类型和指针所占的内存字节数如下:所有类型的指针都是4字节。2、函数除了返回值为void类型的函数外,其他函数所占的字节数等于函数的返回类型所占有的字节数。与函数体内部无关3、结构体、类是内部各数据类型占用之和,注意边界对齐(以最大的为标准)。 4、联合体取其中占有字节数最大的数据类型所占的字节数。64位编译器与32位编译器相比较,数据类型所占的内存字节...

2018-04-09 10:15:07 103

原创 如何得今天是今年的哪一天

#includebool IsLeapyear(int year){if(year%4==0 &&year0!=0 || year @0==0){return true;}return false;}bool IsThirty(int month){if(month==4 ||month==6 ||month==9 ||month==11){return true;}return ...

2018-04-09 10:14:50 257

原创 变量和常量

 >   >=  <  <= 双目运算符,比较结果为bool值==:比较是否相等,不能做左值放在赋值号的左边=:赋值表达式的值是你所赋的值大小!=:不等号表达式1?表达式2:表达式3 :三目运算符变量先定义后使用:告诉编译器为该变量分配多少个内存,并以怎样的方式解析它。常量:整型常量,实型常量,字符常量,字符串常量,符号常量(宏)。不允许被修改。宏:可以一改全改,可以见名知...

2018-04-09 10:14:36 111

原创 c语言运算符

算法:解决问题的方法和步骤scanf函数不要使用,用户体验不好,用函数传参来符号:优先级数越小,优先级越高():提升优先级,函数调用[]:数组数组越界,程序会崩溃(新的编译器).->非:0为假,非0为真表达式1&&表达式2表达式1||表达式2i++:把i的值作为整个表达式的值,然后i再自加1i--:把i的值作为整个表达式的值,然后i再自减1++i:把i的值自加1,再把这个值作...

2018-04-09 10:14:14 265

原创 c基础

fioat浮点数的表示方法:float:4个字节32个二进制位12.5->1100.1->1.1001*2^3如图所示:最高一位表示符号位:0正1负接下来的八个位用来保存指数,指数依然有正有负。指数(十进制)加127,负责取值范围接下来的23位用来保存尾数,负责精度大端和小端:Int a=0x12345678;     0        1        2        3小端:低地...

2018-04-09 10:14:00 117

原创 循环链表

dlist.h#include <stdio.h>#include <stdlib.h>#include <assert.h>//#include <vld.h>//断言在release版本无效//千万不要使用头结点进行查找或比较等typedef  struct DNode{int data;struct DNode *next;struct DNo...

2018-04-08 17:27:09 111

原创 循环链表

clist.h#include <stdio.h>#include <stdlib.h>#include <assert.h>//#include <vld.h>//千万不要使用头结点进行查找或比较等typedef  struct CNode{int data;struct CNode *next;}CNode,*CList;void  InitCL...

2018-04-08 17:26:18 114

原创 链表

list.h#include <stdio.h>#include <stdlib.h>#include <assert.h>//#include <vld.h>//千万不要使用头结点进行查找或比较等typedef  struct CNode{int data;struct CNode *next;}CNode,*CList;void  InitCLi...

2018-04-08 17:25:15 152

原创 new和delete

内置类型产生的临时量都是常量,不可更改。在寄存器里自定义类型产生的都是变量,可以修改,在内存上const  &  可以引用一个不可寻址的常量,因为会产生临时量,寄存器里的值不可寻址函数返回值:<=4  eax>=4   <=8  eax  edx>8 产生临时量产生临时量的三个时机:1. 函数调用之前2. 函数return语句处3. 函数调用之后动态内存的开辟1. ...

2018-04-08 17:23:42 221

原创 观察者监听者模式

观察者:感知事件发生。监听者:监听事件、处理事件。将监听者感兴趣的事件注册到观察者上。由观察者进行事件统一的观察,观察到事件发生后,观察者会通知所有对该事件感兴趣的监听者,该事件发生了,让监听者处理事件。如图所示:代码如下:#include#include#include#includeusing namespace std;class  Listener{public:Listener(stri...

2018-04-08 17:22:57 212

空空如也

空空如也

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

TA关注的人

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