- 博客(44)
- 收藏
- 关注
原创 进程程序替换---exec函数族
当我们fork创建新的子进程后,子进程通常调用exec函数以执行另一个程序。当进程调用exec函数时,进程执行的程序完全替换为新的程序。exec并不创建新的进程,所以前后进程的ID并未改变。(exec函数使得进程控制更加完善) #include int execl(const char *path, const char *arg, ...);int execlp(const c
2017-07-20 17:19:00
415
原创 逆置,查找倒数第K个节点,Add函数不用四则运算的实现
//1 逆置单链表,查找倒数第K个节点只遍历一遍#includeusing namespace std;#includetypedef int DataType;struct ListNode{ DataType _data; ListNode* _next; ListNode(const DataType& x) :_data(x) , _next(NULL) {
2017-07-14 11:34:02
419
原创 归并排序
归并算法:对于数据较大的输入,归并排序是比较快的一个算法。该算法采用的是分治法的思想。归并排序的原理:先将数据分开排序,然后再合并起来,最后形成一个排好的序列。void _Merge(int* a, int* tmp, int begin1, int end1, int begin2, int end2)//7-2区间合并{ int
2017-07-13 12:01:12
275
原创 交换排序(2)--快速排序3种实现方案及其优化
快速排序 快排的整体思想是找出一个key值,比key的值小的都在它的左边,比key大的值都在它的右边。这样就划分了左右两个区域,分别找左右两个区域的key值继续划分左右区间。 找中间值的位置有三种方法(1)左右指针法
2017-07-11 22:30:06
695
原创 交换排序(1)---冒泡排序
冒泡排序冒泡排序算法的运作如下:(从后往前) 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 void Bub
2017-07-11 22:18:42
251
原创 插入排序(直接插入排序,希尔排序)
直接插入排序 直接插入排序是把一组数据的第一个数看做有序(同时这个数是有序区的最后一个数end),拿要插入的数与end比较大小。(1)比end大,直接放在end的后面(2)比end小,把end这个数放在end的后一个位置,再把要插入的数与end的前一个数比较。void InsertSort(int* a,int n)//1 直接插入排序{ for (int i
2017-07-11 13:30:35
649
原创 TCP的中定时器
1 建立连接定时器 TCP建立连接时需要3次握手,如果client在连接server时,在发送SYN的时候,会启动一个定时器(默认是3秒)。如果SYN包丢失,则3秒后重发SYN包(再次启动一个定时器,设置为6秒)2 重传定时器 在TCP发送某个数据段时设定。如果定时器超时而对端的确认还未到达,TCP将重传该数据段。重传定时器的值(TCP等待对端确认的
2017-07-11 11:37:13
371
原创 TCP首部中的URG和PSH概念以及区别
1 紧急URG 当URG=1时,表明紧急指针字段有效。它告诉此系统此报文段中有紧急数据,应尽快传送,而不要按原来的排队顺序传送。URG设置为一时,发送方TCP就把紧急数据插入到本报文数据的最前面,在紧急数据后面的数据仍然是普通数据。 紧急数据起点: 序号 紧急数据终点:序号+紧急指针 2 推送PS
2017-07-11 09:21:56
524
原创 NAT技术与代理服务器
NAT技术1 概念 NAT英文全称是“Network Address Translation”,中文名称是“网络地址转换”。它是一种把私有网络IP地址转换为合法公有网络IP地址。(例如,当两个局域网内有两个相同的IP地址,此时其中一个想要接入因特网与其通信,但因为都在局域网内可以有相同的IP,因特网并不知道到要给哪一个IP地址。此时我们用到NAT技术。)简单说NAT技术就是在局域网内
2017-07-10 13:49:25
556
原创 端口号分类及其常用端口号
一 基本概念计算机端口可以认为是计算机与外界通讯交流的出口。端口大致分为两类:(1)在物理意义上如集线器,交换机,路由器等用于连接其他网络设备的接口。 (2)逻辑意义上的端口,一般指网络中面向连接服务和无连接服务的
2017-07-10 10:31:50
2598
原创 CRC检验解析
CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这
2017-07-09 18:10:43
973
原创 单链表常见面试题(二)
1.判断单链表是否带环?若带环,求环的长度?求环的入口点?(1)判断是否带环Node* IfRing(Node* list){ Node* slow = list; Node* fast = list; while (fast&&fast->next) { slow = slow->next; //慢指针一次走一步 fast = fast->nex
2017-07-08 09:55:20
389
原创 单链表常见面试题(一)
1.比较顺序表和链表的优缺点,说说它们分别在什么场景下使用? 顺序表:类似于数组结构。是连续存储的。在读取的时候比较快。但是在插入和删除时移动的数据量比较大,非常麻烦。顺序表在开辟空间时在满的时候重新申请开辟大的空间,会存在空间浪费。 链表:是链式结构。对于插入和删除操作比较方便。在开辟空间时对单个节点申请空间,不会造成空间的浪费。首先我们时间上来进行分析:
2017-07-07 16:17:10
398
原创 Linux---守护进程
一·基本概念 (1) 守护进程是生存期长的一种进程。常常在系统引导装入时启动,仅在系统关闭时才终止。因为没有控制终端,所以说是在后台运行的 守护进程不受用户登录和销毁的控制,通常以d结尾表示为daemon,守护进程是孤儿进程。当前作业与终端无关(因为守护进程自成一个会话,所以不受终端控制) 二 相关指令 ps -axj
2017-07-06 15:31:14
271
原创 堆的应用----TopK问题和堆排序
用堆的数据结构常见解决问题是 TopK 和堆排序。1 TopK 问题 此问题需要在N个数中找出最大或者最小的K 个数。这里我们用找最大的K个数来举例。void AdjustDown(int* hp, int K, int i){ int parent = i; int child = i * 2 + 1; while (child < K) { if (child
2017-07-04 13:54:59
359
原创 Heap---堆的基本结构
堆数据结构是一种数组对象,可以被视为一颗完全二叉树。大堆:每个父节点都大于孩子节点小堆:每个父节点都小于孩子节点如上图为小堆存储:下面编写堆的基本代码:#include#include#includeusing namespace std;template //利用仿函数,可以完成代码的复用,这里我们假设建立大堆。struct Greater{ bo
2017-07-04 12:26:29
410
原创 C语言实现单链表
#includetypedef int DataType;typedef struct ListNode{ DataType data; struct ListNode* next;}Node;void PrintList(Node* pList){ while (pList) { printf( "%d \n",pList->data); pList = pLis
2017-06-15 11:17:33
241
原创 Linux之死锁
死锁的概念: 死锁可以被定义为一组相互竞争系统资源或进行通信的进程间“永久”阻塞。当一组进程的每个进程都在等待某个事件,而只有在这组进程中的其他被阻塞的进程才可以触发该事件,这时就称为这组进程发生死锁。 所有的死锁都涉及至少两个进程之间对资源的需求冲突。可重用资源与可消耗资源 可重用资源:一次只供一个进程安全的使用,并且不会因为使用
2017-06-07 19:39:25
657
原创 二叉树基本结构
#include#include#includeusing namespace std;//编写二叉树节点的结构体templatestruct BinaryTreeNode{ typedef BinaryTreeNode Node; T _data; Node* _left;//左孩子 Node* _right;//右孩子 BinaryTreeNode(const T&
2017-05-28 16:46:15
274
原创 STL中list用法解析
STL是StandardTemplateLibrary的简称,标准模板库,惠普实验室开发的一系列软件的统称。它是由AlexanderStepanov、MengLee和DavidRMusser在惠普实验室工作时所开发出来的。这可能是一个历史上最令人兴奋的工具的最无聊的术语。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集
2017-05-15 09:59:59
514
原创 二分查找实现与算法分析
二分查找又名折半查找。找到中间值与要找的数值进行比较,不过的缩小查找空间。这里我们用递归与非递归分别实现,并分析空间复杂度与时间复杂度//二分查找递归算法//时间复杂度 O(lg N)//空间复杂度 O(1g N)#includeusing namespace std;int Binary(int* arr, int data, size_t size, int left
2017-05-13 16:36:47
347
原创 斐波那契数列实现与分析
斐波那契数列指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...这个数列从第三项开始,每一项都等于前两项之和。下面将用递归算法和非递归算法分别实现,并求其时间与空间复杂度。////斐波那契递归算法////时间复杂度 O(2^N)////空间复杂度 O(N)#includeusing namespace std;int
2017-05-13 16:16:25
342
原创 C++智能指针auto_ptr(一)
在我们编写大型工程时,用new动态申请内存时,必须要用delete去释放。但若是出现异常时,我们不能保证申请的内存都被释放,这时我们需要一个在适当的时候自动释放的指针。这里我们引入智能指针。智能指针: (1)智能指针不是指针,而是一个类。类里封装了能够完成资源初始化的构造函数,析构函数完成对资源的释放。(这种思想方法称为RAII:资源分配及初始化) (2) 智能指针是
2017-05-11 09:17:14
240
原创 C语言模拟实现C++多态
#include#includetypedef void(*fun)();//定义一个函数指针类型;struct A{ fun f; int _a;};struct B{ A s; int _b;};void fA(){ printf("fA()\n");}void fB(){ printf("fB()\n");}int main(){ A a;
2017-05-10 09:07:44
261
原创 C++强制类型转换
C++为了加强类型转换的可视性,引入了四种命名的强制类型转换符1 dynamic_case : 用于将基类的对象的指针或引用转换为派生类对象的指针或引用。 当目标类型为某种类型的指针时,如果转换成功则返回目标类型的指针,否则返回NULL。 当目标类型为某种类型的引用时,如果转换成功则返回目标类型的引用,否则抛出异常,因为不存在NULL引用。 两个
2017-05-09 23:24:05
252
原创 C++异常处理
一 异常处理原则: C++异常处理机制将异常类型化,比传统错误处理用不同的数字表达不同类型的错误能更包含更多的信息。异常处理机制实际是一种运行时通知机制。异常处理机制的本质是在正真导致错误的语句即将执行之前,因此异常抛出时,正真的错误并未发生。二 异常类型和异常对象 任何一种类型都可以当做异常类型,即任何一个对象都可以当做异常对象,异常是通过类型来匹配的
2017-05-06 17:26:12
234
原创 C++模板函数,模板类
模板概念: 模板如字面的意思为模具模板,并不是一个正真的物体。例如,在编写比较两个数大小的代码中,我们可能要比较两个整数的大小,也能需要比较浮点数等等大小。在这些代码中,基本的逻辑都是相同的,只是比较数的类型不同。此时我们就可以用模板这个概念来完成对于不同类型的参数而相同的逻辑的操作。而模板会根据实际的参数类型推演出正真的代码。如上图所见,模板分为函数模板和类模板两种。函数模板
2017-04-29 11:54:45
318
原创 解析成员函数重载-- 隐藏-- 覆盖
概念:重载:在同一个作用域下,函数名相同,但函数参数列表不同(参数个数,类型,顺序)。隐藏:指派生类成员函数遮蔽了与这个函数同名的基类中的函数。 (1)派生类成员函数与基类成员函数同名,但参数列表不同。 (2)派生类成员函数与基类成员函数同名,且参数列表相同,但基类中函数并没有用virtual关键字修饰覆盖:派生类重写基类成员函数(多用于多态
2017-04-22 20:34:49
235
原创 浅谈队列及循环队列实现
一队列基本概念队列是队头和队尾的区别。队头进行元素的删除,队尾进行元素的插入操作。队列遵循先进先出的原则(FIFO)队列分类:1 顺序队列 2 循环队列 3 链式队列在这里,我们主要介绍循环队列。上图为循环队列的模型。循环队列的3种判断满或者空的方法:(capacity为容量)(1)少用一个存储单元, (rear+1)%capacity=
2017-04-22 16:39:06
317
原创 vim 配置入门 及分屏操作
Vim是一个类似于Vi的文本编辑器,Vim(和Vi)一个最大的优势在于它最常用的命令都是简单的字符,这比起使用复杂的控制组合键要快得多,而且也解放了手指的大量工作,学习使用这些命令的时间很快。 在这里,我也是以一新手的身份主要讲解vim的基本配置入门。 1 vim基本配置 首先我是在自己的主工作目录下touch了一个.vrmrc的文件 vim进入此文件,
2017-04-07 10:25:47
481
原创 updatedb: can not open a temporary file for `/var/lib/mlocate/mlocate.db'
在使用locate查找文件时会受到限制,因为locate寻找的数据是由己创建的数据库/var/lib/mlocate/里面的数据所查找的。但是数据库并不是实时更新,所以你可能会找到已经删除的文件,或者你刚刚创建的新文件并不能找到,此时需要手动更新数据库。直接输入updatedb就可以的,但必须要注意的是要在超级用户下才有此权限。此外updatedb会查找硬盘,所以当执行此命令时需要等待几分钟。
2017-03-31 11:08:27
681
原创 Linux中文件名查找---find,whereis,locate
在Linux中查找文件通常是使用whereis和locate。因为这两个命令是利用数据库查找数据,所以速度相当快。而find命令在查找中访问了硬盘,速度相对要慢。whereis(寻找特定文件)格式: whereis [-bmsu] 文件或目录名参数: -b 只找二进制文件 -m 只找说明文件manual路径下的文件
2017-03-31 10:27:06
763
原创 深浅拷贝
浅拷贝:多个对象共用同一块内存空间,在析构时会出现问题。例如:创建了三个String类对象String s1="hello";String s2(s1);String s3;s3=s2;s2创建时调用拷贝构造函数,使得s2的指针指和s1的指向都为“hello”这块空间。s3创建时调赋值运算符的重载,使得s1,s2,s3都指向同一空间,则在析构时会出现问题。并且会导致s3的内存泄漏
2017-03-29 01:11:40
275
原创 Linux之访问目标相关权限及粘滞位
1 进入目录相关权限:若所有者只有可读权限-----则使用LL可显示文件信息,不可进入文件。我们用chmod把02目标文件的拥有者权限改为可读。此时我们cd进入看会发生什么事情。此时我们发现已经进入02目录文件。若所有者权限设为rx-----此时可以显示文件信息并进入目录文件。此时我们把更改02的拥有者权限为rx,发现可以进入02目录文件
2017-03-25 15:24:44
519
原创 Linux之相关权限---chown chmod umask
在Linux中,一切皆文件。在查看文件时,会有查看者的区分,当然还有文件访问权限的不同。文件访问者的分类:(1)文件所有者:u------user(2 )文件所属组:g-------group (3) 其他用户: o---------other文件访问权限分类:(1)读---read ---r (2)写-----write ----w (3)执行------exec
2017-03-24 13:00:34
401
原创 C++ this指针解析
this指针用处: this指针是在学习c++中的类时提出的。一个类对象的this指针并不是对象本身的一部分,在用sizeof()计算对象大小时只有成员变量的大小。既没有成员函数的大小,也没有this指针的四个字节的大小。当在类的非静态成员函数访问类的非静态成员时,编译器会自动将对象的地址传给作为隐含参数传递给函数,这个隐含参数就是this指针。即使你并没有写this指针,编译
2017-03-11 13:14:59
315
原创 函数调用缺少参数列表;请使用“&Student::Printf”创建指向成员的指针 问题解析
函数调用缺少参数列表;请使用“&Student::Printf”创建指向成员的指针
2017-03-11 12:02:15
4761
原创 C++之浅谈继承
继承概念:继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。(简单来说,就是在原有的基础上,增加新的功能) 继承的格式例: classs Dress : public Base
2017-02-26 16:03:15
325
原创 左旋字符串K个字符的3种实现方法
第一种是先保存字符串第一个字符,然后循环实现。#include #include#includevoid strShift(char *str, int len, int step){ assert(str); assert(len > 0); step %= len; int i = 0; for (; i < step; i++){ char tmp = str
2016-11-13 16:06:41
301
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人