自定义博客皮肤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)
  • 收藏
  • 关注

原创 Git中“ LF will be replaced by CRLF in... ”警告解决方法

原因不同操作系统行尾结束符不一样: Uinx/Linux --- \n(LF); windows --- \r\n(CRLF)在windows下用git拉取文件,会自动用CRLF替换掉LF; 同样,用git提交文件时,也需要将CRLF替换成LF。但是这个转换有时会出错,比如中文字符有换行符时。解决方法那么怎么消除掉这个警告呢?1.在git上配置通过设置core.autocr...

2019-07-27 10:25:01 976

原创 C++ --- 引用

指针我们之前了解过了,它也是一个变量,存的是地址,那引用是什么呢?什么是引用引用不是定义一个新的变量,而是给已经定义的变量重新起一个别名。定义的格式为: 类型 & 引用变量名 = 已定义过的变量名;引用的特点: 1.一个变量可取多个别名; 2.引用必须初始化; 3.引用只能在初始化的时候引用一次,之后不能改变,再引用其他的变量。普通引用void Te...

2018-08-22 11:44:27 248

原创 C/C++动态内存管理

C语言动态内存管理C语言使用malloc、calloc、realloc来进行动态内存的管理。 malloc仅仅开辟一块空间,calloc开辟空间的同时并把它初始化为0,而realloc可以进行动态内存的调整。前面博客中已经介绍了这三个函数,在此不再赘述。 浅谈malloc、calloc和realloc//C动态内存管理void Test(){ int *p1 = (int...

2018-08-20 20:42:53 190

原创 使用const、enum、inline代替宏

上面博客中我们主要区分了宏和函数的区别,了解了宏给我们带来方便的同时也有其自身的弊端。比如:下面这个例子:#define N 1024定义了一个常量,这时我们的程序运行时出错了,出错的地方刚好是我们定义的常量,这时编译器会抛出错误信息,提示1024有错,如果我们忘了1024表示什么?就会一直追踪1024去定位错误所在。 可是错误信息为什么是1024,而不是N呢?因为在预处理阶段,已经...

2018-08-20 00:16:29 391

原创 宏和函数的区别

先来看下面的这段代码:#include <stdio.h>#define Max(a,b) a * b == 8 ? a * b : bint max(int a,int b){ if(a * b == 8) { return a*b; } else { return b; }}int...

2018-08-19 21:43:15 1125

原创 string类的实现

class String{public: String(const char* str = "") :_size(strlen(str)) ,_capacity(_size) { _str = new char[_size+1]; strcpy(_str,str); } //swap(s1,s...

2018-08-19 12:38:08 141

原创 日期类的实现

 #include<iostream>using namespace std;class Date{public: //四个默认成员函数 // //构造函数 Date(int year = 2018,int month = 9,int day = 1) { _year = year; _month =...

2018-08-19 09:35:24 114

原创 浅谈malloc、calloc和realloc

malloc、calloc和realloc是动态内存开辟的函数,在了解他们之前先想一下为什么要动态内存开辟? 我们以前开辟内存时是通过下面这种方式:int val = 10; //在栈上开辟四个字节char arr[10] = {0};//在栈上开辟10个字节的连续空间这种方式是在栈上开辟内存,有以下特点: 1.开辟的空间是固定的; 2.数组在声明的时候,必须指定数组的长度,它...

2018-08-13 10:57:08 169

原创 string函数的实现

我们在学C语言的时候,用了很多的处理字符和字符串的库函数,今天我们就自己实现一下这些和字符串相关的库函数。1.求字符串的长度(strlen)字符串是以’\0’作为结束标志的,strlen函数返回的是在字符串中’\0’前面出现的字符个数(不包括’\0’)。 这里注意:strlen的返回值是size_t无符号的。 下面代码用三种方式实现了strlen://借助指针size_t m...

2018-08-08 00:40:16 413

原创 编译过程

一个源文件到可执行程序到底经历了哪几个过程? 它的编译链接过程分为四个步骤:预处理、编译、汇编、链接。1.预处理1)处理所有的#include预编译指令,将被包含的文件插入到预处理指令的位置。这个过程是递归的。 2)将所有的#define删除,并展开所有的宏定义。 3)处理所有的预处理指令,比如:#if、#denif、#ifdef、#else。 4)过滤掉所有的注释 “//” ...

2018-08-07 23:03:45 166

原创 结构体的内存对齐

首先,先来算一下,下面的这个例子,这些结构体的大小是多少呢?struct s4{ char c1; struct s3 a; double b;};struct s3{ double b; char c; int i;}s3,*p;struct s2{ char c1; char c2; int i;...

2018-08-02 00:12:08 163

原创 sizeof和&取地址

我们知道通过sizeof可以求得一个变量的大小,通过&符号可以取一个变量的地址,那当它们对一个变量或者数组操作时又有何不同呢?1. sizeof   首先,sizeof不是函数,而是一个表达式,可以求变量或者类型所占空间的大小.    1).变量      sizeof求变量的大小时可以不加(),如:sizeof a;但是求类型必须加(),sizeof(int) 。    ...

2018-08-01 23:27:03 1513 2

原创 浅谈大小端

 一般是如何看待一个类型的呢?我们应该从以下两个方面去考虑:1>开辟空间的大小  2>如何识别内存中的数据我们要想知道数据在内存中是如何存储的,以及怎样去识别,就要了解大小端。 可是为什么会有大小端之分?因为在计算机系统中,是以字节为单位的,每个地址单元对应一个字节,我们知道一个字节占8个bit位,除了8bit的char,还有16bit的short,32bit的int...

2018-07-29 23:49:05 162

原创 浅析const

1.const修饰变量 const修饰的变量不能被改变,当const修饰指针时:  1) 如果const在 * 左边,表示指针变量可以改变,但是指针变量指向的内容是不可以通过指针来改变;    int num = 10;     const int * p1 = #     *p1 = 20;  //运行出错,不可以通过指针变量来修改num     pr...

2018-07-26 17:07:59 141

原创 static的用法

1.static修饰局部变量     static修饰局部变量 —— 改变生命周期,不改变作用域;     static局部变量只被初始化一次,下一次依据上一次结果。 void test(){ //int num = 0;//临时变量,test 函数栈帧销毁, num随即释放 static int num = 0; //num被static修饰,改变了其生命周期...

2018-07-26 16:00:59 421

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

排序:就是将一组杂乱无章的数据按照一定的规律(升序或降序)组织起来。我们通常所说的排序算法往往指的是内部排序算法,及数据记录在内存中进行排序。 而外部排序指的是数据元素太多不能同时放在内存中,根据排序过程的要求不能在内存之间移动数据的排序。排序算法大致可分为两种: 一种是比较排序,时间复杂度在 O(nlogn)~O(n^2)之间,主要由:冒泡排序、选择排序、插入排序、堆排序、希...

2018-06-06 11:20:01 134

原创 数据结构 --- 开散列处理哈希冲突(哈希桶)

开散列什么是开散列? 开散列法又叫链地址法(开链法)。 首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于统一子集合,每一个子集合称为一个桶,各个桶中的元素通过单链表连接起来,各链表的头结点存储在哈希表中。假如一个元素集合的关键码为{37,25,14,36,49,68,57,11},散列表为HT[12],表的大小为12,散列函数为Hash(x) = x % 1...

2018-06-03 22:07:12 761

原创 数据结构 --- 闭散列处理哈希冲突(线性探测)

#include <stdio.h>#include<stdlib.h>#include"hash.h"///////////////////////////////////////////////////////该哈希表基于哈希函数,存储的是健值对类型//////////////////////////////////////////////////////...

2018-05-31 01:19:29 532

原创 数据结构 --- 哈希简介

我们在前面提过的顺序搜索和二叉搜索树中,元素存储位置和元素各关键码之间没有对应关系,因此在查找一个元素时,必须要经过关键码的多次比较。搜索的效率取决于搜索过程中元素的比较次数。因此我们就在想,有没有一种理想的搜索方法,可以不经过任何的比较,一次直接从表中得到要搜索的元素。 通过构造一种存储结构,用某种函数使得元素的存储位置和他的关键码之间能够一一对应起来,那么在查找时可以通过该函数快速地找到...

2018-05-30 14:53:36 261

原创 数据结构 --- 二叉搜索树的操作(递归和非递归版本)

二叉搜索树又称二叉排序树,它要么是一颗空树,要么满足以下性质: 1)如果左子树不为空,则左子树上所有节点的值都小于根节点的值; 2) 如果右子树不为空,则右子树上所有节点的值都大于根节点的值; 3)它的左右子树也分别为二叉搜索树。如图所示: 接下来,我们对二叉搜索树进行插入、查找和删除操作:正式操作前的一些准备工作:typedef char Searc...

2018-05-23 00:19:50 153

原创 数据结构---堆的相关操作

什么是堆? 堆满足完全二叉树 小堆(大堆)中:任一结点的关键码均小于(大于)等于它的左右孩子的关键码,位于堆顶结点的关键码最小(最大),从根结点到每个结点的路径上数组元素组成的序列都是递增(递减)的。我们来看下图: 现在,我们对堆进行如下操作: 头文件声明://动态扩容,最大尺寸为1024#define HeapMaxSize 1024typedef char...

2018-05-22 22:29:04 94

原创 数据结构 --- 二叉树的相关面试题

这里只介绍二叉树的以下几个面试题: 1.用非递归版本实现先序、中序和后序遍历 2.求二叉树的镜像 3.判断一棵树是否是完全二叉树 4.给一个前序遍历和中序遍历的结果重建二叉树 上一篇博客中我们详解了用非递归实现二叉树的先序、中序和后序遍历,在此不再赘述,有需要的参考。。。。,下面我们直接来看后面这三个问题。1.求二叉树的镜像 镜像类似于我们生活中照镜子一样,除过左右发生了交换以外,...

2018-05-21 10:51:51 301

原创 数据结构 --- 二叉树的先序、中序和后序遍历(非递归版本)

之前,我们写过二叉树的一些基本操作,大部分是通过递归来实现的。想想看,要是不采用递归的方式,我们该如何对二叉树进行操作? 下面,我们用非递归方式完成二叉树的先序、中序和后序遍历。1.通过循环实现树的先序遍历还是我们的那颗二叉树: 我们先想一下,先序遍历的顺序是:根结点 —> 左子树 —> 右子树。只要我们先打印根结点,然后再打印根结点的左右子树,每一个节点都这样循环的进...

2018-05-20 23:07:24 864

原创 Linux---进程组、作业、会话

1.进程组 每个进程除了有一个进程ID之外,还属于一个进程组。进程组是一个或多个进程的集合。通常,它们与同一作业相关联,可以接收来自同一终端的各种信号。每个进程组有一个唯一的进程组ID,可以有一个组长进程。 组长进程的标识是,其进程组ID等于其进程ID。组长进程可以创建一个进程组,创建该组中的进程,然后终止。只要某个进程组中存在一个进程,则该进程就存在,这与组长进程是否终止无关。上面

2018-05-06 01:02:26 189

原创 Linux---守护进程

1.什么是守护进程 守护进程也称为精灵进程,是运行在后台的一种特殊进程。它独立于控制终端,与用户交互断开并且周期性地执行某种任务或等待处理某些发生的事情。 大部分的守护进程都是孤儿进程,父进程是init进程,并且自成进程组,自成会话。它没有控制终端,所以任何输出,无论是向标准输出设备stdout还是标准出错设备stderr的输出都被丢到/dev/null中。 守护进程是一种很

2018-05-05 00:32:11 158

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

提起树,大家肯定想到了平时生活中见到的树,它由根、树枝和树叶组成。而我们这里说的树,其实就是把生活中的树的模型给颠倒过来了。如下图所示: 二叉树是通过上述5种形式的组合或嵌套而形成。 二叉树的概念: 一棵二叉树其实是结点的一个有限集合,该集合要么为空,要么由一个根结点再加上两棵分别称为左子树和右子树的二叉树组成。 二叉树的特点: 每个结点最多有两棵子树,及二叉树不存在度大

2018-05-02 00:33:23 126

原创 Linux---popen、system函数

system函数 在一个程序中执行命令字符串很方便。例如,我们想把时间和日期放到一份文件中,先用time得到当前日历时间,接着调用localtime将日历转换为年、月、日、时、分、秒,然后调用strftime对上面结果进行格式化处理,最后将结果写入到文件中。但是我们如果用stystem函数呢? 直接system(“data>file”),显然很方便。system函数原型#include<stdi

2018-05-01 14:52:12 212

原创 Linux---创建、等待、终止进程

进程创建 父进程通过 fork(), vfork() 函数创建子进程 fork()测试代码:#include<stdio.h>#include<unistd.h>int main(){ printf("Before:pid is %d\n",getpid()); pid_t pid = fork();//创建子进程 if(pid < 0) { p

2018-05-01 09:52:35 100

原创 Linux---环境变量

基本概念: 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,通常具有全局属性。 例如:当我们在写c/c++代码时,我们并不知道所链接的动态静态库在哪里,但照样可以链接成功。这是因为有相关环境变量帮助编译器进行查找。常见的环境变量 ·PHAT*:指定命令的搜索路径 ·HOME*:指定用户的主工作目录(及用户登陆到Lin

2018-04-30 14:34:18 119

原创 Linux---模拟实现僵尸进程和孤儿进程

我们先了解一下进程都有哪几种状态。 kernel源代码里定义了进程的如下状态: · R 运行状态(running):表明进程要么是在运行中要么是在运行队列里。 · S 睡眠状态(sleeping):意味着进程在等待事件完成,有时叫做可中断睡眠。 · D磁盘休眠状态(Disk sleep):不可中断睡眠状态,在这个状态进程通常会等待I/O的结束。 · T 停止状态(stopped):

2018-04-30 11:46:21 211

原创 Linux---浅谈进程PCB

在说PCB是什么之前,我们先了解一下进程到底是什么。它和程序又有什么区别? 程序:二进制可执行文件,是一个机器代码指令和数据的集合,存储在硬盘里,是一个静态的实体。 //指令+数据 进程:是操作系统对一个正在运行的程序的一种抽象,将二进制可执行文件加载到内存里。 //指令+数据+PCB那么PCB到底是什么呢?...

2018-04-27 17:58:12 871

原创 数据结构---复杂迷宫求解(多路径带环)

上一篇博客我们提到了多出口迷宫的情况,但是在此基础上迷宫路径如果带环呢,如何解决? 情况如下图: 可以看出,红色圈出来的部分形成了一个环。那如果我们还是采用上次的办法,看看能不能找出最短路径。 通过上图,我们可以看到并不能达到预期效果,打印出来的并不是最短路径。这是为什么呢? 原因在于我们按照顺时针“上右下左”的顺序探测该点四周能否能落脚时,如下面 A 图所示,先找到了第一条路径即...

2018-04-27 00:50:38 720

原创 数据结构---多出口迷宫找出一条最短路径

前面我们实现了基础版本的迷宫求解,只有一条路径。现在如果有多个出口,我们该如何去找到一条最短的路径。我们先来思考一下我们是如何在一个数组里找最小值的? 有下面一个数组: 我们可以先把第一个数设为最小值,然后遍历数组,拿它和后面的元素进行比较,把两个数中较小的赋给min,直到遍历完整个数组,min中就是数组中的最小值。同样的,找最短路径也是一样的思路。我们可以定义两个栈,一个cur_...

2018-04-26 20:45:55 910

原创 Linux--自主shell加强版(支持输入输出重定向)

前面我们写了一个基础版本的shell,但有些功能没有实现。这次我们直接在上次的基础上将代码稍加修改,使其支持输入输出重定向。 过程还是一样: · 获取命令行 · 解析命令行 · 创建子进程(fork) · 替换子进程(execvp) · 父进程等待子进程退出(wait) 只不过这次解析命令行时需要对输入重定向 (<)和 输出重定向 (>)做特殊处理。 输入

2018-04-26 00:43:54 159

原创 数据结构---回溯法解决迷宫问题

回溯法:深度优先搜索,对一个包括有很多个结点,每个结点有很多个搜索分支的问题,把原问题分解为若干个子问题求解的算法;当搜索到某个结点发现无法在继续搜索时,就让搜索过程回溯(回退)到该结点的前一个结点,继续搜索该结点外的其他尚未搜索到的分支;如果发现该结点无法在搜索下去,就让搜索过程回溯到这个结点的前一结点继续这样的搜索过程;这样的搜索过程一直持续到问题的解或者搜索完了全部可搜索分支没有解为止...

2018-04-25 18:19:44 516

原创 Linux---进程的调度算法

系统中的cpu资源是有限的,当同时有多个进程处于就绪状态,要竞争cpu资源时,操作系统就要负责完成分配资源的任务。在操作系统中,由调度程序来完成这一选择分配的工作,调度程序所使用的算法即是调度算法。 调度算法一般有以下几种: 一、 先来先服务算法(FCFS:First Come,First Served) 1&gt; 算法原理: 依据进程进入就绪队列的先后顺序排列,谁先排队,就先执行谁,谁...

2018-04-23 00:29:43 250

原创 Linux-简单的shell实现

当我们在Linux下打开一个终端时,可以通过在上面输入一些命令,来实现与终端的互动。例如: 可以看到,当我们输入一条命令后,终端会等待下一条命令的输入。这就类似于一个死循环,不停的输入命令。 在编写shell解释器之前,我们先看一下shell脚本执行过程: fork创建子进程后执行的是和父进程相同的程序(但有可能是不同的代码分支),子进程调用exec函数以执行另一个程序。此时,该进程...

2018-04-19 00:44:30 272

原创 数据结构-栈和队列相关面试题

1.实现一个最小栈,每次取得都是栈里面的最小值,时间复杂度为O(1) 思路:每次入栈两个元素,一个存当前值,一个存当前栈的最小值,先将当前值入栈,再将最小值入栈,出栈时也一次出两个。如图所示: 代码如下:#include"seqstack.h"#include&lt;stdio.h&gt;typedef struct MinStack{ SeqStack stack...

2018-04-17 00:39:23 222

原创 数据结构-顺序队列和链式队列的实现

上篇博客说的栈是操作受限制的线性表,同样的,队列也是操作受限制的线性表,不同于栈,它的头和尾两头都受限制,只能在一端进行插入(只进不出),我们称为队尾,在另一端进行删除(只出不进),称作队首。 遵循的原则是:”先进先出“(first in first out),简称”FIFO”.我们生活中的排队现象就是队列的一种应用,先来的人先进入队伍亦先买到东西离开,即先进先出。 队列也有顺序和链式两种存储...

2018-04-13 18:31:47 1104

原创 数据结构-顺序栈和链式栈的实现

栈是一种特殊的线性表,它特殊在对线性表的操作进行了限制,只能在它的一端进行插入和删除,如下图所示: 遵循的是“先进后出”(first in last out)的规则,简称为”FILO”。 既然栈也是线性表,那么线性表的存储结构同样也适用于栈,通常有顺序栈和链式栈两种。 1.顺序栈的实现 头文件声明:seqstack.h#pragma once#include&lt;std...

2018-04-13 17:00:30 393

空空如也

空空如也

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

TA关注的人

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