自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux----进程间关系和守护进程

进程组1.概念 进程组是一个或者多个进程的集合 2.特性 <1>.每个进程组有唯一的进程组ID <2>.每个进程组有一个组长进程,组长进程的标识是,其进程组ID等于其进程ID <3>.只要在进程组中有一个进程存在,该进程组就存在,这与其组长进程是否终止无关 3.命令ps <1>.功能:查看进程信息 <2>.选项: a...

2018-08-07 11:10:24 194

原创 C++---类和对象(2)--默认的成员函数

1.构造函数概念: 成员变量为私有的,要对它们进行初始化,必须用一个公有成员函数来进行。同时这个函数应该有且仅在定义对象时自动执行一次,这时调用的函数称为构造函数。 特征: 1.函数名与类名相同 2.无返回值 3.对象实例化时,系统自动调用对应的构造函数 4.构造函数可以重载 5.构造函数可以在类中定义也可以在类外定义 6.如果类定义中没有给出构造函数,则C++编译器自动产生一...

2018-07-24 16:48:28 215

原创 c++---类和对象(1)

1.什么是面向对象概念:(Object Oriented Programming,缩写OOP)是一种程序设计范型,同时也是一种程序开发的方法。 对象指的是类的实例,将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。 类是创建对象的模板,一个类可以创建多个对象。对象是类的实例化。 C++不是纯面向对象语言,而是基于面向对象的语言。 面向对象的三大特性: ...

2018-07-24 11:24:28 187

原创 C++---引用&指针

1.引用的概念及用法引用:引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名。 例如:int & b = a;b是a的引用,即b是a的别名。 引用的特点: a.一个变量可取多个别名 b.引用必须初始化(int &b;不知道b是谁的别名) c.引用只能在初始化的时候引用一次,不能改变为再引用其他的变量(例如,b是a的别名就只能是a的别名,不能在成为...

2018-07-21 22:05:04 132

原创 C++入门

1.C++大家对C++的印象是什么?难!还有呢?还是难! 所以这里首先给大家一点C++学习建议 C++可分为4个层次: 第一层次,C++基础,挑选一本入门书籍,如《C++ Primer》,《C++大学教程》等. 第二层次,正确高效的使用C++. 第三层次,深入了解C++. 第四层次,研究C++. 达到第二层左右便从工作实战中汲取经验,有兴趣才慢慢继续学习更高层次的知识。不然你会从...

2018-07-21 20:35:33 148

原创 海量数据处理问题

1.给定一个大小超过 100G 的文件, 其中存在 IP 地址, 找到其中出现次数最多的 IP 地址(hash文件切分) 思路:显然我们是不可能将这100G内存直接加载到内存中取处理的。所以我们可以对大文件进行划分,前提当然是相同IP地址会被划分在一块。假定我们将这个文件分为1024份,那么一个文件的大小大概为100M,然后利用哈希算法对IP地址进行映射,得到的值%1024,将同一个IP地址映...

2018-06-07 10:48:17 156

原创 数据结构 ---- 布隆过滤器

基本概念 如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表、树等等数据结构都是这种思路,但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢,不过还有一种叫哈希表的数据结构,它可以通过Hash函数将一个元素映射成一个位阵列中的一个点,这样一来,我们只要看看这个点是不是1就知道集合中有没有它了,这就是布隆过滤器的思想。Hash面临...

2018-06-06 17:09:26 227

原创 数据结构 ---- 位图的基本操作

首先位图结构体中有两个参数,一个指针用来开辟一段空间存储Bit位,还有一个参数是capacity即位图最多能容纳多少位; 实现代码如下: bitmap.h#pragma once #include <...

2018-06-06 15:18:01 237

原创 数据结构 ----- 哈希表(链地址法--开散列)

在上一篇文章中已经提到过链地址法,现在具体看下图例子: 实现代码如下: hash.h#pragma once#include <stddef.h>#define HashMaxSize 1000typedef int KeyType;typedef int ValType;//此结构相当于是链表的一个节点typedef struct HashElem{...

2018-05-31 15:59:37 697

原创 数据结构 ----- 哈希表(闭散列--线性探测)

关于哈希表首先来看两个概念:1.哈希函数哈希函数是一个映像,因此哈希函数的设定很灵活,只要使得任何关键字由此所得的关键值都落在表长允许范围之内即可;2.哈希冲突对不同的关键字可能得到同一哈希地址,这种现象称为哈希冲突;基于上面两个问题,我们来做说明: 哈希函数的构造 哈希函数的构造方法有很多,比如,直接定址法、数字分析法、平方取中法、折叠法、除留余数法等等,我们这里采用...

2018-05-30 15:06:06 472 1

原创 数据结构 --- 排序算法(2)

1.希尔排序希尔排序又称缩小增量排序,是对直接插入排序的优化; 希尔排序三重循环:第一重,生成步长序列,这里采用希尔序列,如:N/2、N/4、N/8、…..、1;第二重循环,处理每组的数据,注意竖着处理,即先处理第一行的第一个元素,在处理第二行第一个元素……;第三重循环,进行搬运,找到合适的位置,将值插入加进去(结合插入排序的思想);希尔排序的时间复杂度:取决于步长序列,对于希尔序列为O...

2018-05-29 21:47:36 110

原创 数据结构 --- 排序算法(1)

这里都是按照升序排序的; 交换函数如下:void Swap(int *a ,int *b){ int tmp = *a; *a = *b; *b = tmp; return;}1.冒泡排序方法一:首先,常规冒泡算法,外循环定义count 为排序的趟数,内循环为每趟进行比较并且交换,实现代码如下:void BubbleSort(int arra...

2018-05-28 14:48:39 125

原创 数据结构 ---- 搜索二叉树的基本操作(2)

实现非递归版本的搜索二叉树的插入、查找和删除插入:这里的思想是定义两个指针一个指向当前结点,一个指向当前结点的父节点,当前结点就是找要插入的位置,插入整体分为两步,第一步是找到要插入的位置,第二步判断要插入的值与此时父节点的大小,来决定是插入到左子树还是右子树即可; 代码实现:void SeachTreeInsert(SearchNode** pRoot ,SearchNodeType ...

2018-05-24 15:54:50 119

原创 数据结构 ---- 搜索二叉树的基本操作(1)

关于搜索二叉树,我们先用递归版本完成,非递归版本请关注下一篇文章;首先,什么是搜索二叉树? 定义:搜索二叉树是根结点的左子树的值比根结点小,右子树的值比根结点值大,所有子树都满足这个规则的就是搜索二叉树; 我们要完成关于搜索二叉树的如下操作: search_tree.h #pragma once ...

2018-05-24 12:09:21 136

原创 数据结构 ---- 堆的基本操作

首先,对于堆来说:1.堆是一个完全二叉树; 2.堆有两种:大堆和小堆; 3.以小堆为例, 这个树的根节点是这个树中的最小的元素 // 对于任意一个子树来说, 子树的根节点, 小于左右孩子节点的值. 4. 以大堆为例, 这个树的根节点是这个树种的最大元素 // 对于任意一个子树来说, 子树的根节点, 大于左右孩子节点的值. 堆的初始化:堆是用数组来定义的,并且在初始化时,...

2018-05-21 11:24:51 105

原创 数据结构 ----二叉树相关操作(3)

1.二叉树求镜像什么是二叉树的镜像? 如上,右边就是左边这棵树的镜像; 由上图可以看出,求一颗树的镜像就是将二叉树的左右子树交换即可; 这里用递归和非递归两种方法进行求解: 递归实现: void TreeMirror(TreeNode* root){ if(root == NULL){ re...

2018-05-17 22:20:50 87

原创 数据结构 ---- 二叉树的相关操作(2)

在上一篇文章中完成了二叉树的递归版本的先序、中序、后序遍历,现在来介绍非递归版本的三种遍历方法; 三种遍历均借助顺序栈来完成 先序遍历: 思路:先将根结点入栈,然后循环的进行取栈顶元素,同时出栈,并且将栈顶元素的左右子树入栈,当取栈顶元素失败说明,已经遍历完了,跳出循环; 代码实现: void TreePreOrderByLoop(TreeNode* root){ if(ro...

2018-05-17 15:29:30 107

原创 数据结构 ---- 二叉树的相关操作(1)

首先,什么是二叉树? 二叉树是一个根结点只有左右子树就叫二叉树;如下图就是一个普通的二叉树: 树有许多的表示方法,这里二叉树用孩子表示法。 之前关于链表我们知道,用头指针来表示单链表,这里用相同的思想:用根结点指针来表示一棵树; 这里先用递归的思想来完成二叉树的先序、中序、后序,层序这里需要借助之前的顺序队列来完成; 代码实现: bin_tree.h #pragma o...

2018-05-17 15:01:29 93

原创 迷宫求解3--带环的多出口迷宫求最短路径

假如有以下带环的多出口迷宫地图: 这里的思路与之前迷宫求解多出口求最短路径相似,不同的是,这里需要多传一个参数pre,保存当前要落脚的点的上一次走到这个点的大小 1.判定当前点是否能落脚 2.如果能落脚,进行标记,同时将当前点插入到cur_path栈中,更新pre 3.判断是否是出口 a)如果是出口,就比较cur_path与short_path的大小,如果cur_path小就代替s

2018-05-06 20:50:12 271

原创 迷宫求解2--多出口求最短路径

假如有如下一个迷宫地图: 与迷宫求解1中,简单迷宫找路径思路相似,不同的是:这里需要定义两个栈cur_path和short_path,来存放当前路径长度,与最短路径长度,每找到一条路径就与最短路径进行比较,如果比最短路径短,就用当前路径cur_path代替最短路径short_path; 1.判定是否能落脚; 2.如果能落脚进行标记,同时将当前点插入到cur_path顺序栈中; 3.判断当

2018-05-06 19:42:58 641

原创 迷宫求解1--简单迷宫是否存在路径

假如,有如下迷宫地图: 思路: 1.判定当前点是否能落脚 2.如果能落脚进行标记 3.判断当前点是否是出口 a)如果是出口,则找到了一条路径 b)如果不是出口,则以当前点为准则,采用递归的方式顺时针方向继续探测四周 解析: 这里判定落脚规则是,如果当前点为0即是墙,不能落脚,当前点是已经标记过的点,不能落脚; 这里的标记是,将已经走过的点赋值为2;代码如下:

2018-05-06 19:05:40 239

原创 数据结构--顺序表相关操作

顺序表可以看做一个数组,对数组进行操作,体会这一点,顺序表的相关操作就比较容易实现。 代码如下:seqlist.h #pragma once #include <stddef.h> #define

2018-05-04 17:37:57 110

原创 数据结构--二叉树的基本操作

首先通过一张图来认识树: 树:由N(N>=0)个结点构成的集合。对N>1的树,有: 1.有一个特殊的结点,称为根结点,根结点没有前驱结点 2.除根结点外,其余结点被分为M(M>0)个互不相交的集合T1、T2…..Tm,其中每一个集合Ti(1<=i<=m)有是一颗结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继。,因此,树是递归定义的。代码实现多采用递归的思想。二叉

2018-05-03 22:34:15 128

原创 实现一个简单shell

用下图的时间轴来表示事件的发生次序。其中时间从左向右。shell由标识为bash的方块代表,它随着时间的流逝从左向右移动。shell从用户读入字符串”ls”。shell建立一个新的进程,然后在那个进程中运行ls程序并等待那个进程结束。然后shell读取新的一行输入,建立一个新的进程,在这个进程中运行程序并等待这个进程结束。 所以要写一个shell,需要循环以下过程: 1.获取命令行 2.解

2018-05-03 21:15:54 675

原创 进程控制

进程的创建、等待和终止<1>.进程的创建Fork函数: 一个现有的进程可以调用fork函数创建一个新进程 由fork创建的新进程被称为子进程,fork函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新建子进程的进程ID。 Fork之前父进程独立执行,fork之后,父子两个的执行流分别执行,注意,fork之后,谁先执行完全由调

2018-05-03 20:45:05 94

原创 Linux开发工具

Linux开发工具一、调研除了vim, 还有哪些常用的牛逼的编辑器, 并能够横向对比编辑器之间的区别和优缺点.Vim是从vi发展出来的一个文本编辑器。代码补全、编译即错误跳转等 方便编程的功能特别丰富,在程序员中被广泛使用。和Emacs并列成为类Unix系统用户最喜欢的编辑器。Emacs:Emacs与vim比起来,编辑效率低下。Emacs强调统一的环境,便于编程,里面包含了源代码管理,邮件收发等,最

2018-05-03 11:09:21 101

原创 进程基本概念

一、基本概念进程有以下几个定义: a).正在执行的程序 b).正在计算机上执行的程序实例 c).能分配给处理器并由处理器执行的实体 b).具有以下特征的活动单元:一组指令序列的执行、一个当前状态和相关的系统资源集。 也可以把进程当成由一组元素组成的实体,进程的两个基本的元素是程序代码(可能被执行相同程序的其他进程共享)和代码相关联

2018-04-26 17:52:07 205

原创 栈和队列面试题(四)

四、一个数组实现两个栈(共享栈)思想:一个数组,前半部分为栈1,后半部分为栈2,栈1往后插入栈2往前插入;代码实现:#include &lt;stdio.h&gt;#define SharedStackMaxSize 1000typedef char SharedStackType;//[0,top1)区间表示第一个栈//[top2,SharedStackMaxSize)区间表示第二...

2018-04-25 11:13:10 75

原创 栈和队列面试题(三)

3.使用两个队列实现一个栈思想:创建两个队列,栈的特点为后进先出,而队列是先进先出,所以要出栈时,要先将队列1的元素出队列,同时入队列2中(此时的队列2为空),直到队列1中只有一个元素,此时这个元素就是要出栈的元素;入栈时,选择不为空的队列入队列即可;代码实现:#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include "seqqueue...

2018-04-25 10:58:51 124

原创 栈和队列面试题(二)

2.使用两个栈实现一个队列思想:创建两个栈,一个表示入队列的栈input,一个表示出队列的栈output,由于队列的特点为先进先出,而栈为后进先出,所以每次出队列时,要将input中的值,入栈到output中,然后在出栈output;而入队列时,将output中的值入栈到input中,然后将要入队列的值入栈input中即可;代码实现:#include &lt;stdio.h&gt;#includ...

2018-04-25 10:21:22 126

原创 栈和队列面试题(一)

一、实现一个栈,要求Push(入栈),Pop(出栈),Min(返回最小值的操作)的时间复杂度为O(1)。思想:创建一个栈,栈中保存着入栈的值和当前栈中的最小值,每次入栈时都入栈两个值,在入栈时先比较要插入的值与栈顶值得大小,通过打擂台的思想循环去比较,最终栈顶元素就是整个栈的最小值注意:入栈最小值与当前值时,必须先入栈当前值在入栈最小值,这样才能保证栈顶元素最小例如:序列 9  5  2  7 入...

2018-04-24 23:16:21 81

原创 线程的概念及基本操作

一、线程的概念:首先在Linux下无真正的线程(TCB),Linux下的线程是用进程来模拟的,Linux下的进程称为轻量级进程。当我们在一个进程中运行多个执行流时,我们并不可以开辟多个进程执行我们的操作,这里需要注意的是32位机每一个进程都认为自己独享4G内存资源,此时便引入了线程。例如当我们既需要浏览网页又需要下载内容时,此时就是多线程起作用。线程是在进程内部运行的执行流;是一个进程内部的控

2018-04-22 21:38:43 156

原创 链式队列基本操作的实现

直接上代码:linkqueue.h#pragma oncetypedef char LinkQueueType;typedef struct LinkQueueNode{ LinkQueueType data; struct LinkQueueNode* next;}LinkQueueNode;typedef struct LinkQueue{ LinkQueueNode* h...

2018-04-15 21:31:45 495

原创 顺序队列基本操作的实现

顺序队列和前面的顺序表一样,相当于一个数组,不同的是它的有效区间,当数组走到最大时,又会从头开始,这里用head 和tail两个下标来表示头和尾,即当tail到达size时,tail又从0开始,head也是同样的道理;代码如下:seqqueue.h#pragma once#define SeqQueueMaxSize 1000typedef char SeqQueueType;type...

2018-04-15 21:17:22 1600

原创 顺序栈基本操作的实现

首先,定义一个结构体,结构体中有一个指针data,顺序栈的大小,还有一个capacuty,即相当于之前顺序链表的Max_Size,表示data这段内存中能容纳的元素个数,用于扩容。1.初始化:给data开辟内存空间,size设为0,capacity自定义一个值,这里定义为1000;2.销毁:释放data,并且将size与capacity置为0;3.入栈:这里与前面学习的顺序表一样,将值直接插入si...

2018-04-15 20:58:00 747

原创 链式栈基本操作的实现

在单链表的基础上来实现链式栈就比较容易了首先,定义连个结构体,一个是结点的结构体,还有一个是链式栈的结构体,链式栈的结构体中有一个指针指向栈顶。依次实现下面的操作:1.初始化:初始化只需要将栈顶指针置为空即可;在这需要注意要先申请一个栈,才能进行初始化。2.销毁栈:如果栈不为空,则先将没一个元素进行出栈操作,最后释放栈空间;3.入栈:首先创建一个结点,再将这个结点入栈,最后修改

2018-04-15 20:31:23 661

原创 双向链表2

由于上一篇双向链表已经提到,这篇直接上代码,请结合上一篇双向链表来看:dblinklist.h//删除to_delete位置的元素void DLinkListErase(DLinkNode* head , DLinkNode* to_delete);//删除delete_value值,按照值来删void DLinkListRemove(DLinkNode* head , DLinkNode...

2018-04-13 17:16:31 63

原创 链表面试题2

有关单链表的面试题2复杂链表的复制//复杂链表的复制typedef struct ComplexNode{ LinkNodeType data; struct ComplexNode* next; struct ComplexNode* random;}ComplexNode;ComplexNode* CreateComplexNode(LinkNodeType va

2018-04-13 16:34:24 85

原创 链表常见笔试题

声明:typedef char LinkNodeType;typedef struct LinkNode { LinkNodeType data; struct LinkNode* next;}LinkNode;1.逆序打印单链表分析:应用递归的思想,遍历链表,递归出口为head==NULL,代码如下:void LinkListReversePrint(LinkNo

2018-04-09 18:01:34 954

原创 单链表的基本操作

以下操作针对不带头结点不带环的的单向链表首先linklist.h头文件代码:#pragma oncetypedef char LinkNodeType;typedef struct LinkNode { LinkNodeType data; struct LinkNode* next;}LinkNode;//初始化链表void LinkListInit (LinkN

2018-04-04 17:49:04 146

空空如也

空空如也

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

TA关注的人

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