自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 二叉树

定义:二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^(i-1)个结点;深度为k的二叉树至多有2^k-1个结点;对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1深度=层数-1 定义树的结构:typedef struct BtNode{ BtNode* le...

2018-09-06 11:38:06 195

原创 递归

递归就是调用自身eg1:打印函数//递归void printArr1(int *arr,int len){ if(arr==NULL || len<1) return; printArr1(arr,len-1); printf("%d ",arr[len-1]);}//非递归void printArr(int* arr,int len){ if(arr==...

2018-09-06 10:23:09 185

原创 STL容器迭代器失效原则

vector内部数据结构:数组(一段连续内存空间)插入操作:1. 插入(push_back/insert)操作在vector中加入新的元素,但vector中元素总数仍不大于capacity,这时插入位置后的元素都被依次移动到下一个位置,所以插入位置之后的迭代器都会失效。2. 插入(push_back/insert)操作在vector中加入新的元素,但vector中元素总数大于capacit...

2018-09-04 13:04:58 329

原创 c++类型转换

1 reinterpret_cast‘reinterpret_cast’转换一个指针为其它类型的指针。它也允许从一个指针转换为整数类型。反之亦然。(译注:是指针具体的地址值作为整数值?)这个操作符能够在非相关的类型之间转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换。如果情况是从一个指针到整型的拷贝,内容的解释是系统相关的,所以任...

2018-09-04 12:29:48 127

原创 设计模式——监听者观察者模式

监听器模式:事件源经过事件的封装传给监听器,当事件源触发事件后,监听器接收到事件对象可以回调事件的方法观察者模式:观察者(Observer)相当于事件监听者,被观察者(Observable)相当于事件源和事件,执行逻辑时通知observer即可触发oberver的update,同时可传被观察者和参数观察者模式有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同...

2018-08-24 02:49:43 275

原创 STL标准模板库

容器:  1、顺序容器:是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。顺序容器包括:vector(向量)  -》数量成倍增长的一维数组    push_back   insert   pop_back优点:随机访问,快速查找...

2018-08-23 14:36:38 257

原创 指针的易错点

内存泄漏:在c/c++中,内存管理器不会帮你自动回收不再使用的内存。如果你忘记了释放不再使用的内存,这些内存就不能被重用了,造成内存泄漏。 内存越界访问:读越界:即读了不属于自己的数据。如果所读地址无效,程序立即崩溃;如果所读地址有效,在读的时候不会马上出现问题,但由于读到的数据是随机的,因此也会造成不可预料的后果。写越界:又叫缓冲区越界,所写入的数据对别的程序来说是随机的,他...

2018-07-19 16:14:48 237

原创 字符串拷贝和内存拷贝的区别

strcpy与memcpy区别:1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy...

2018-07-18 16:54:20 1130

原创 dup和dup2函数

dup和dup2,它们的作用都是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr这两个函数的原形如下:dup()函数利用函数dup,我们可以复制一个描述符。传给该函数一个既有的描述符,它就会返回一个新的描述符,这个新的描述符是传给它的描述符的拷贝。这意味着,这两个描述符共享同一个数据结构。例如,如果我们对一个文件描述符执行lseek操作,得到的第一个文件的位...

2018-04-14 13:44:57 213

原创 socket 编程——并发服务器

一般的面向连接服务器程序的代码框架: 并发服务器的一般模型:eg:大写字符串转小写字符串(可并发执行)〈通过fork实现〉ser.c:#include<stdio.h>#include<stdlib.h>#include<ctype.h>#include<sys/socket.h>#include<arpa/inet.h>#in...

2018-04-12 02:44:03 276

原创 线程

线程是程序中一个单一的顺序控制流程。进程内有一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指令运行时的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程对线程的操作:因为线程不属于系统调用,因此需要用到pthread.h库1.创建线程#include <pthread.h>int pthread_create(pthread_t *thre...

2018-03-30 21:33:36 217

原创 什么是进程,什么是线程,什么时候用进程,什么时候用线程

什么是进程什么是线程?进程是指在系统中正在运行的一个应用程序;程序一旦运行就是进程进程可以认为是程序执行时的一个实例。进程是系统进行资源分配的独立实体, 且每个进程拥有独立的地址空间。一个进程无法直接访问另一个进程的变量和数据结构, 如果希望让一个进程访问另一个进程的资源,需要使用进程间通信,比如:管道,文件, 套接字等。一个进程可以拥有多个线程,每个线程使用其所属进程的栈空间。 线程与进程的一个...

2018-03-30 01:45:29 12831

原创 C和 C ++ 的区别

1.内联函数: 在函数的调用点,把函数的代码全部展开,编译阶段(一种更安全(进行类型检查)宏)宏: 预编译阶段(字符串替换,不进行类型检查,无法调式)内联函数和普通函数的区别:内联函数没有标准的函数栈帧的开辟和回退普通函数:函数调用的开销大于函数执行的开销->写成内联函数内联函数本文件可见(不产生符号),一般写在头文件中内联函数和static函数的区别:本文件...

2018-02-05 17:35:04 2429

原创 对文件操作详解

C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现。文件操作标准库函数有:文件的打开操作 fopen打开一个文件文件的关闭操作fclose 关闭一个文件文件的读写操作:fgetc 从文件中读取一个字符fputc 写一个字符到文件中去fgets 从文件中读取一个字符串fputs 写一个字符串到文件中去fprintf

2018-02-05 17:18:57 830

原创 网络编程

tcp服务器和客户端的编程流程:eg:时间/日期客户程序:                                   时间/日期服务端程序:**********************************************************************************套接字就是一个接口(本质是文件)一、套接字的属性域(domain)、类型(type)和...

2017-12-07 01:41:09 197

原创 Linux文件操作

Linux系统调用和库函数调用的区别:1、系统调用系统调用提供的函数如open, close, read, write, ioctl等,需包含头文件unistd.h。系统调用通常用于底层文件访问(low-level file access),例如在驱动程序中对设备文件的直接访问。系统调用是操作系统相关的,因此一般没有跨操作系统的可移植性。系统调用发生在内核空间,因此如果在用户空间的一般应用程序中使...

2017-12-07 01:32:46 320

原创 共享内存

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

2017-11-28 00:56:25 218

原创 信号量

信号量定义 :特殊的变量,只能+1(v),-1(p),都是原子操作(不打断能被)。最简单的信号量是一个只有0与1两个值的变量,二值信号量。这是最为通常的形式。具有多个正数值的信号量被称之为通用信号量。信号量的作用:通知系统产生了某种事件Signal:改变对当前信号的响应方式(默认,忽略,自定义)子进程状态发生改变,发送给父进程(子进程结束了,会给父进程发送)Kill(pid_t pid,int s...

2017-11-28 00:40:15 1800

原创 进程与信号

信号:Linux响应条件而产生的一个事件。接收到该信号的进程会相应地采取一些行动信号是由某些错误条件而生成的。如内存段冲突,浮点处理器错误或非法指令等等。它们由shell和终端处理器生成来引起中断,它们还可以作为在进程间通信或修改行为的一种方式,明确有一个进程发送给另一个进程。信号可以被生成、捕获、响应或忽略在signal.h中定义,以SIG开头其他信号:给当前进程发送si

2017-11-28 00:19:30 198

原创 管道

引入管道的原因:普通文件存储在磁盘中,读写效率低管道文件存储在内存中,读写效率高 管道:其实是在两个进程之间实现一个数据流通的管道,单向或双向。优点:简单易用缺点:功能简单,有诸多限制 管道分为有名管道和无名管道。无名管道用于父子进程、兄弟进程之间的通信。无名管道是存在内存上的文件,进程对每一个已打开文件的操作都是通过一个file数据结构进行的,只有在同一个...

2017-11-27 01:48:21 245

原创 僵死进程

僵死进程:一、僵死进程的产生在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等,但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等), 直到父进程通过wait/

2017-11-27 01:17:52 211

原创 KMP算法

1.朴素查找算法算法思想:从pos位置开始在主串中查找子串,找到就返回第一个匹配的下标,找不到就返回-1,定义变量i指向主串,定义变量j指向子串,如果相等i++,j++,否则,i退回起始的下一个下标,即i=i-j+1;,j回退到0号下标,即:j=0,结束标志:j>=子串的长度。时间复杂度O(m*n)//朴素查找算法BFint BF(const char *str,const char *

2017-11-26 00:41:47 171

原创

栈:特殊的线性表(只允许在一边进行操作),分顺序栈(顺序表实现),链栈(链表实现)特点:后进先出顺序栈:栈头在线性表表表尾(线性表表尾插入删除时间复杂度都是O(1))定义:typedef struct Stack{ int *elem; int top;  //栈顶指针,当前可以存放数据的下标 int stacksize;  //栈的总格子数}Stack,*PStack;链栈:栈头在链表表表头(链...

2017-11-21 15:00:50 193

原创 链表

带头结点的单链表:(浪费一个结点,使得数据处理更加方便)插入删除方便,不用移数据1.带头结点的循环链表(与普通链表的区别就是尾的next指向头)2.带头结点的静态链表(用顺序表实现链表,next表示数组小标,使得兼具顺序表与单链表的特点)有两个表头,一个指向有效链表表头,一个指向空闲链表表头0下标作为有效链表头,有效链为循环链表1下标作为空闲链表头,空闲链为循环链表

2017-11-21 14:36:41 150

原创 顺序表详解

定长顺序表定义:#pragma once#define SIZE 10typedef struct SeqList{ int elem[SIZE]; //顺序表表示数组,总大小SIZE int length; //有效数据的个数}SeqList,*PSeqList;操作://初始化 长度置0即可void InitSeqList(PSeqList ps){...

2017-11-21 14:05:34 486

原创 指针和引用的区别

指针和引用的区别:相同点:1. 都是地址的概念;指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。区别:1. 指针是一个实体,而引用仅是个别名;2. 引用使用时无需解引用(*),指针需要解引用;3. 引用只能在定义时被初始化一次,之后不可变;指针可变;4. 引用没有 const,指针有 const;5. 引用不能为空,指针可以为空;6. 

2017-11-21 12:14:35 187

原创 排序算法

插入排序:直接插入:思想:假设待排序的记录存放在数组R[1..n]中。初始时,R[1]自成1个有序区,无序区为R[2..n]。从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序区。ways1:void insertSort1(int arr[], int len){ int i;//未排序序列带排序的元素下标 int j;//已排序序列最大元...

2017-11-11 01:55:15 164

原创 单链表下的快慢指针问题

1.给定单链表,检测是否有环。        使用两个指针p1,p2从链表头开始遍历,p1每次前进一步,p2每次前进两步。如果p2到达链表尾部,说明无环,否则p1、p2必然会在某个时刻相遇(p1==p2),从而检测到链表中有环。//检测链表是否有环bool Huan(List plist){ if(!plist) { return false; } Node *fast=...

2017-11-08 01:56:32 233

原创 fork()

fork:系统调用   ->    复制父进程#include <unistd.h> #include <stdio.h> int main() { pid_t fpid;//fpid表示fork函数返回的值 //printf("fork!"); printf("fork!/n"); fpid = fork();...

2017-11-06 01:07:09 248

原创 static and dynamic

我们通常把一些公用的函数制作成函数库,供其它程序使用函数库分为静态库和动态库两种静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要该静态库静态库是以lib为前缀,紧接着跟静态库名,扩展名为.a动态库在程序编译时不会被链接到目标代码中,而是在程序运行时才被载入,因此在程序运行时还需要动态库存在动态库库名前加lib前缀,其扩展名为.so当静态库

2017-10-29 00:47:07 490

原创 gdb调试

jdb具备调试信息才可以调试,需要的是调试的版本编译时,加-g,使程序具有调试信息eg:gcc -o main main.c -g调试命令:l 显示main函数所在的文件的源代码list filename:num 显示filename文件num行上下的源代码b linenum 给指定行添加断点 b funname  给指定函数的第一有效行添加一个断点info break  显示断点信息delete...

2017-10-29 00:30:47 131

原创 Linux运行级别

Linux运行级别:run revel(查看系统的运行级别)   /etc/inittab0    halt 关机1    单用户模式2    多用户模式3    完全的多用户字符界面4    未定义/自定义5    图形化界面6    重启halt :关机(普通用户权限即可)以下命令均需管理员权限才可以使用:shutdown -h

2017-10-29 00:15:49 130

原创 链表操作

单链表for()循环的两种初始化:1. for(Node *p=plist; p->next !=NULL; p=p->next)//进行插入,删除操作,对链表进行修改2. for(Node *p=plist->next; p !=NULL; p=p->next)//不对链表进行修改 单链表常考:单链表插入的两种方法://头插 bool ...

2017-10-28 22:05:34 137

原创 对进程的操作

ps:显示当前终端中运行的进程(终端:输入输出设备)ps -e:显示所有进程ps -f:显示用户父进程的信息,或称显示详细信息ps -ef:显示所有进程的详细信息kill pid:结束一个进程编号为pid的进程kill -9 pid:强制结束一个进程后台运行的程序加“&”eg:sleep 200&ctrl c:结束一个前台正在运行的程序(前台只能运行

2017-10-21 17:23:55 168

原创 线性表——单链表,顺序表

单链表:(定长,不定长)特点:查找方便定义:定长顺序表:#define SIZE 10typedef struct SeqList{ int elem[SIZE]; int length;}SeqList,*PSeqList;不定长顺序表:#define INITSIZE 10typedef struct DSeqList{ int *elem;//指

2017-10-21 17:06:49 179

原创 c/c++程序加载过程

C/C++程序编译流程(预处理->编译->汇编->链接)1. 预处理预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。1.读取C/C++源程序,对其中的伪指令(以#开头的指令)进行处理 2.将所有的“#define”删除,并且展开所有的宏定义...

2017-10-20 00:47:40 1596

原创 linux命令

Linux文件目录:/bin 二进制可执行程序 /boot 内核 启动有关的文件/dev 设备文件 /etc 系统配置文件 /home 所有普通用户的家目录 /lib 系统存放库文件 /mnt 临时挂载点 /proc 虚拟的目录,里面存放的是进程的属性信息/root 管理员的家目录 /usr 自己安装的软件/var 经常改变的内容放在该目录

2017-10-18 23:48:37 143

原创 文本编辑器vi/vim

文本编辑器  vi/vim   (redhat 上vi==vim)vi 文件名 创建普通文件  rm 删除文件vi下的三种模式:命令模式插入模式   (编辑模式)末行模式w 只保存 wq 保存退出q 退出(如果没有保存且内容变了,退出不了,只能保存退出或不保存退出)q! 不保存退出i 光标前面插入

2017-10-18 01:37:53 263

原创 常量指针,指针常量

指针常量:关键字顺序为*、const(和中文顺序一致)例如:int *const a,表示指针a是一个常量,初始化后不可以改变,但是指向对象的值可以修改​​常量指针:关键字顺序为const、*例如:const int *a(等同于int const *a),表示指针a所指向的对象是一个常量,但是指针a可以指向其他对象,如*a=10;是错误的,a=b;是可以的。

2017-10-17 01:39:20 140

原创 左右值问题

左右值问题Eg:int a=5则++(a++)的值是(D)A.5    B.6     C.7      D.编译出错解释1:++是一目运算符,自增运算,它只能作用于一个变量,++(a++)中a++优先,是表达式,不能对表达式进行前加运算解释2:a++返回的是右值,而我们不能对一个右值进行自增操作,故++(a++)会报错后置a++相当于做了三件事:1.tmp=a

2017-10-17 01:38:15 452

空空如也

空空如也

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

TA关注的人

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