自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 剑指offer25:合并两个排序的链表

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然使递增排序的。例如:输入下图的链表1和链表2,则合并之后的升序链表如图链表3所示。 链表定义如下: struct ListNode { int value; ListNode* next; };...

2019-10-04 21:53:18 218

原创 剑指offer24:反转链表

题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 链表定义如下: struct ListNode { int value; ListNode* next; }; 思路:首先将pCur和pNext指向第一个数据结点,phead的指针域置...

2019-10-04 11:12:09 228

原创 剑指offer23:链表中环的入口节点

题目:如果一个链表中包含环,如何找出环的入口节点?例如,在下图所示的链表中,环的入口节点是节点3。 (1)判断一个链表是否包含环? 可以用两个指针来解决这个问题,定义一个慢指针和一个快指针,这两个指针同时从链表的头节点出发,慢指针一次走一步,快指针一次走两步,如果快指针追上了慢指针,说明链表就包含环,如果快指针走到了链表的末尾都么追上慢指针,说明链...

2019-10-03 19:51:33 184

原创 剑指offer22:链表中倒数第k个结点

题目:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1,2,3,4,5,6。这个链表的倒数第3个节点是值为4的节点。 链表定义如下: struct ListNode { int va...

2019-10-03 13:50:26 187

原创 剑指offer21:调整数组顺序使奇数位于偶数前面

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。 分析:这道题目的要求是把奇数放在数组的前半部分,偶数放在数组的后半部分,因此所有的奇数应该位于偶数的前面,也就是说,在扫描数组的时候,如果发现偶数出现在奇数的前面,则交换它们的顺序,交换之后就符合要求了。 思想:可以采用两...

2019-10-03 11:09:59 161

原创 剑指offer17:打印从1到最大的n位数

题目:输入数字n,按顺序打印从1到最大的n为十进制数。比如输入3,则打印出1,2,3一直到最大的3位数999。 看到这个问题之后,最容易想到的办法就是先求出最大的n位数,然后用一个循环从1开始逐个打印。于是很容易写出以下代码:void Print1ToMaxOfNDigits_1(int n){ int number=1; int i=0; w...

2019-10-02 20:45:56 165

原创 剑指offer16:数值的整数次方

题目:实现函数double Power(double base,int exponent),求base的exponent次方,不得使用库函数,同时不需要考虑大数问题。 一、第一种方法 大体分为以下四种情况: (1)底数为0,则返回0; (2)底数不为0,若指数为0,则返回1; (3)底数不为0,若指数为正数,调用Power...

2019-10-02 20:45:46 170

原创 智能指针----auto_ptr、scope_ptr、shared_ptr、weak_ptr

一、为什么要引入智能指针? 先来看一个例子:#include <iostream>using namespace std; void func(int *ptr){ int *p=new int; if(ptr==NULL) { throw exception("ptr is null"); } *p=*ptr; delete p;}...

2019-09-09 12:33:18 316

原创 内联函数inline

在C语言中,使用宏定义函数这种借助编译器的优化技术来减少程序的执行时间,在C++中,使用内联函数这种借助编译器的优化技术来减少程序的执行时间。 1、内联函数 在返回值类型前面加上inline关键字的函数称为内联函数,所有类中定义的函数都默认声明为内联函数,虚函数不允许使用内联,内联函数在编译阶段发生,当编译器处理调用内联函数的语句时,不会将该语句编译成函...

2019-08-21 23:14:02 305

原创 SQL----存储引擎、索引、事务、日志、触发器

一、存储引擎 (1)MyISAM MyISAM的存储文件有3个,后缀名分别为.frm(表的定义文件)、.MYD(数据文件)、 .MYI(索引文件), MyISAM只支持表锁,不支持事务,MyISAM采用B+Tree作为引擎结构,由于 MyISAM 中的索引和数据分别存放在不同的文件,所以在B+ 树的叶子节点中存的数据是该索引对应的数据记录的地址,由于数据与索引...

2019-08-21 19:09:39 212

原创 工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)

在面向对象的系统设计中经常会遇到以下两类问题: (1)为了实现高内聚和低耦合,我们经常会抽象出一些类的公共接口以形成抽象基类或者接口,这样我们可以通过声明一个基类的指针指向实际的子类来实现,达到了多态的目的。这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就编写诸如new XXX的代码,这里带来两个问题:1>客户程序员必须知道实际子类...

2019-08-18 11:17:51 1024

原创 单链表的相关操作(头插、尾插、删除、销毁、打印、逆置)

单链表是一种链式存储的线性表,其存储结构的特点是用一组地址任意的存储单元存放链表中的数据元素,链表中的数据以结点来表示,每个结点的构成为为:数据域+指针域,存储数据元素信息的域称为数据域,存储直接后继元素存储位置的域称为指针域,通过指针域可以将所有数据连接起来。 单链表的特点的快速的插入和删除,相比于数组,在插入和删除时链表不需要将其数据移动,直接修改结点的指向即可...

2019-08-17 17:57:26 493

原创 超文本传输协议HTTP

HTTP协议定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网,以及服务器怎样将文档传送给浏览器。从层次角度看,HTTP是面向事务的应用层协议,它是万维网上能够可靠的交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。 HTTP不仅可以传送完成超文本跳转所必须的信息,还可以传送任何可从互联网上得到的信息,如文本、超文本、声音和图像等。 1、万维网...

2019-08-14 19:59:28 794 1

原创 IP协议

IP协议是TCP/IP协议族的核心,IP协议为上层协议提供无状态、无连接、不可靠的服务。 无状态是指IP通信双方不同步传输数据的状态信息,无须为保持通信的状态而分配一些内核资源,也无须每次传输数据时都携带状态信息。因此所有IP数据报的发送、传输和接收都是相互独立、没有上下文关系的。这种服务最大的缺点是无法处理乱序和重复的IP数据报。比如发送端发送出的第N个IP数据报...

2019-08-13 17:26:57 574

原创 tcp/ip协议族

tcp/ip协议族是一个四层协议系统,从下到上依次为:数据链路层、网络层、传输层和应用层。每一层完成不同的功能,且通过若干协议来实现,上层协议使用下层协议提供的服务。如下图所示: 1、数据链路层 数据链路层实现了网卡接口的网络驱动程序,以处理数据在物理媒介(比如以太网、令牌环网等)上的传输。不同的物理网络具有不同的电气特性,网络驱动程序隐藏了...

2019-08-13 15:13:30 540

原创 线程同步----信号量、互斥量、读写锁、条件变量

当多个控制线程共享相同的内存时,需要确保每个线程看到一致的数据视图。如果每个线程使用的变量都是其他线程不会读取或修改的,那么就不存在一致性问题。 同样地,如果变量是只读的,多个线程同时读取该变量也不会有一致性问题。但是当某个线程可以修改变量,而其他线程也可以读取或者修改这个变量的时候,就需要对这些线程进行同步,以确保它们在访问变量的存储内容时不会访问到无效的数值。 线...

2019-08-10 15:12:19 538

原创 线程基础

1、什么是线程? 线程是进程内部的一条执行序列,或者执行流,每一个进程至少有一条线程,称之为主线程,从代码角度看,就是main函数的函数体,在主线程中可以通过线程库创建其他线程(函数线程),主线程和函数线程会同时向下运行。线程是计算机中独立运行的最小单位,运行时占用很少的系统资源。由于每个线程占用的CPU时间是由系统分配的,因此可以把线程看成操作系统分配CPU时间的基...

2019-08-07 14:30:29 150

原创 进程替换

使用fork函数或vfork函数创建子进程后,子进程通常会调用exec函数来执行另外一个程序。系统调用exec用于执行一个可执行程序以代替当前进程的执行镜像。进程的映像是指内核在内存中如何存放可执行程序文件,在将程序转化为进程的过程中,操作系统将可执行程序由硬盘复制到内存中。 调用exec函数并没有生成新进程,一个进程一旦调用exec 函数,它本身就“死亡”了。就好...

2019-08-07 10:46:52 206

原创 进程的创建和退出

1、进程的创建 创建进程有两种方式,一是由操作系统创建,二是由父进程创建。由操作系统创建的进程,它们之间是平等的,一般不存在资源继承关系,而对于由父进程创建的进程(通常称之为子进程),它们和父进程存在隶属关系,子进程又可以创建进程,这样形成一个进程家族,子进程可以继承其父进程几乎所有的资源。在系统启动时,操作系统会创建一些进程,它们承担着管理和分配系统资源的任务,这些进程通常被称为...

2019-08-05 23:33:32 493

原创 进程的管理、运行状态和加载

1、什么是进程? 进程是一个动态的实体,是程序的一次执行过程,进程是操作系统资源分配的基本单位。进程与程序的区别在于进程是动态的,程序是静态的,好比程序是乐谱,进程就是演凑的过程,进程是运行中的程序,程序是存储在磁盘上的可执行的二进制文件。2、进程的管理 操作系统为了管理进程,通过一个task_struct的结构体来记录进程的信息(进程标识符、进程状态、优先级、程序...

2019-08-03 22:50:05 545

原创 Linux中常见的文件操作函数

C语言中常用的文件操作函数有fopen(),fread(),fwrite(),fclose(),fseek(),这些函数称为库函数。Linux中常用的文件操作函数有open(),read(),write(),close(),seek(),stat(),这些函数称为系统调用函数。系统调用函数:系统调用函数是操作系统为内核代码提供给用户或上层使用的一些函数接口,调用在用户态,执行在内核态。库函数:库...

2019-08-01 15:24:36 710

原创 进程间通信(4)----共享内存

进程间通信的方式有:管道、信号量、消息队列、共享内存和socket套接字 管道、信号量、消息队列、共享内存适用于单机,即完成一台主机上的两个进程或多个进程之间的通信,socket套接字适用于网络通信,通信的进程可以运行在不同的主机上。 无名管道:无名管道是一种半双工通信方式,数据只能单方向流动,而且只能在具有亲缘关系的进程间使用,进程的亲缘关系通常指父子进程关系...

2019-08-01 15:22:21 518

原创 进程间通信(3)----信号量

进程间通信的方式有:管道、信号量、消息队列、共享内存和socket套接字 管道、信号量、消息队列、共享内存适用于单机,即完成一台主机上的两个进程或多个进程之间的通信,socket套接字适用于网络通信,通信的进程可以运行在不同的主机上。 无名管道:无名管道是一种半双工通信方式,数据只能单方向流动,而且只能在具有亲缘关系的进程间使用,进程的亲缘关系通常指...

2019-07-29 23:31:06 246

原创 进程间通信(2)----消息队列

进程间通信的方式有:管道、信号量、消息队列、共享内存和socket套接字 管道、信号量、消息队列、共享内存适用于单机,即完成一台主机上的两个进程或多个进程之间的通信,socket套接字适用于网络通信,通信的进程可以运行在不同的主机上。 无名管道:无名管道是一种半双工通信方式,数据只能单方向流动,而且只能在具有亲缘关系的进程间使用,进程的亲缘关系通常指...

2019-07-29 19:36:24 252

原创 进程间通信(1)----管道

进程间通信的方式有:管道、信号量、消息队列、共享内存和socket套接字 管道、信号量、消息队列、共享内存适用于单机,即完成一台主机上的两个进程或多个进程之间的通信,socket套接字适用于网络通信,通信的进程可以运行在不同的主机上。 无名管道:无名管道是一种半双工通信方式,数据只能单方向流动,而且只能在具有亲缘关系的进程间使用,进程的亲缘关系通常指...

2019-07-25 23:43:20 236

原创 Linux中文件的操作

1、Linux的文件结构在Linux中文件的存储结构像一颗倒叉树,文件存储时都以根目录“/”开始,在固定的地方存放对应的文件。/bin:用于存放普通用户可执行命令,系统中的任何用户都可以执行该目录中的命令,如ls、cp、mkdir等命令。/dev:设备文件的存储目录,如硬盘、光驱等。/etc:用于存放系统的配置文件,比如用户账号及密码存放在配置文件/etc/password和/etc/s...

2019-07-24 20:35:06 327 1

原创 函数重载

为什么会存在函数重载? 在C语言中,有时候需要根据不同的数据类型调用不同名的函数,如果这种情况较多的话,对于写程序的人来说,要分别编写功能相同但名字不同的函数是很不方便的,所在在C++中引入了函数重载。函数重载就是用来实现功能类似而处理的数据类型不同的问题。例如下面的代码,都是实现两个数求和,但由于参数类型的不同,写出了4个求和函数,如果这种情况较多的话,对于写程序的人来说,要分...

2019-07-22 20:41:06 290

原创 将字符串转换为整型

下面将字符串转换为不同类型整数,转换规则如下:1、字符串前几位遇到空格忽略2、若字符串第一位为负号,表示将这个字符串转换为对应进制的负数3、若字符串前两位为0x,表示将这个字符串转换为16进制的数4、若字符串第一位为0,表示将这个字符串转换为8进制的数5、若字符串第一位为正常数字(除0以外),表示将这个字符串转换为10进制的数int Hex_Str_Int(const char *...

2019-07-21 17:43:28 10803

原创 单例模式----懒汉

单例模式是设计模式中最简单、最常见、最容易实现的一种模式,单例模式的主要思想是保证整个系统中一个类只有一个实例对象,并提供一个访问它的全局访问点,该实例被整个程序模块共享。实现方法一般是将构造函数、拷贝构造函数和赋值运算符重载函数声明为私有,这样可以禁止他人创建实例,提供一个共有的静态方法获得这个类唯一的一个实例化对象。单例模式一般有两种实现模式:饿汉模式:所谓饿汉,就是饿了饥不...

2019-07-21 16:19:20 213

原创 单例模式----饿汉

单例模式是设计模式中最简单、最常见、最容易实现的一种模式,单例模式的主要思想是保证整个系统中一个类只有一个实例对象,并提供一个访问它的全局访问点,该实例被整个程序模块共享。实现方法一般是将构造函数、拷贝构造函数和赋值运算符重载函数声明为私有,这样可以避免他人创建实例,在提供一个共有的静态方法获得这个类唯一的一个实例化对象。单例模式一般有两种实现模式:饿汉模式:所谓饿汉,就是饿了饥...

2019-07-21 13:41:43 338

原创 调用约定

1> _cdecl C标准调用约定2>_stdcall windows标准调用约定3>_fastcall 快速调用约定4>_thiscall 类成员方法调用约定函数的调用约定,约束了:1、符号的生成规则,不同调用约定下相同的函数是无法进行调用的int __cdecl Sum(int,int) --> (?Sum@@YAHHH@Z)int _...

2019-07-20 15:43:38 205

原创 函数的堆栈调用

下面通过一个例子来看看函数调用堆栈的过程#include <stdio.h>int Sum(int lhs,int rhs){ int tmp=lhs+rhs; return tmp;}int main(){ int a=10; int b=20; int rt=0; rt=Sum(a,b); return 0;}将上面代码转到反汇编:ma...

2019-07-20 15:27:01 377

原创 4G虚拟地址空间

在linux系统中,用户空间和内核空间所占的比例为3:1在windows系统中,用户空间和内核空间所占的比例为2:2下面以linux系统为例:.text 指令段,也叫代码段,局部变量也是指令,但局部变量存储在栈上,当代码运行时才在栈中预留好的区域中开辟。.data 数据段存储代码中的各种数据,包括已初始化且初始化不为0的全局变量、静态变量。.bss 数据段存储代码中的各种数据,包括未初...

2019-07-20 15:26:36 190

原创 c++中const的用法

const在c语言和c++的使用是不同的 在c语言中,const修饰的变量叫常变量,在编译阶段编译器会检查常变量有没有做左值,剩下的和普通变量相同,具体用法可参考小编的另一篇博客 — —const的用法。 在c++中,const用法有以下几点需要注意:1、const修饰的变量叫常量,定义时一定要初始化,因为在编译阶段编译器会把用到常量的地方替换成常量初始化的值,在...

2019-03-23 16:55:24 4473

原创 TCP与UDP的区别

TCP和UDP是OSI模型中传输层中的两个协议TCP协议的特点:面向连接的 可靠的 字节流服务UDP协议的特点:无连接的 不可靠的 数据报服务为什么这样说呢,下面以我们来分析以上三点一、服务类型1、字节流服务 当发送端应用程序执行多次写操作,TCP模块先将这些数据放入TCP发送缓冲区中,当TCP模块真正开始发送数据时,发送缓冲区中等待发送的数...

2019-03-23 16:32:39 143

原创 malloc和new的区别

动态申请内存时,malloc和free配套使用,new和delete配套使用,下面我们来看看malloc和new有那些区别1、malloc和free是C语言/ C++中的标准库函数,new和delete是C++中的关键字,它们都可以动态申请内存;2、malloc函数在堆上分配内存,new关键字在自主存取区域分配内存;3、malloc函数只分配内存,不会做初始化, new关键字分配内存,...

2018-11-29 09:47:03 238

原创 编译链接原理

为什么要进行编译链接?1、人们通常写的都是高级语言,对于计算机来说,只认识二进制的机器指令,不认识高级语言,所以要通过编译将高级语言转换为计算机可识别的低级语言2、编译链接是在磁盘上,运行时要加载到内存中hello.c#include <stdio.h>int main(){ printf("Hello World\n"); return 0;}在l...

2018-11-15 11:36:52 276

原创 结构体

一、结构体类型的定义1、定义结构体类型的一般形式为:struct 结构体类型名{     成员列表};花括号{}外的分号不能省略,表示结构体类型说明的中止。eg:对学生信息结构体类型的定义struct Student{ int num; char name[10]; int age; char sex; float score;};//自定义数据类型,定义完成以后,等同于内置类型2、结构体类型中的...

2018-05-26 16:04:34 330

原创 二维数组

二维数组是指数组元素是双下标变量的数组。二维数组可以看作是一个矩阵,第一个下标表示行,第二个下标表示列。下标都是从0开始的。1、二维数组的定义类型说明符 数组名[整型常量表达式1][整型常量表达式2];eg:int b[3][4];定义了一个二维数组b,该数组有12个元素构成,其中每一个数组元素都是整型数据,它们在内存中是连续排列的,如下所示:b[0][0]b[0][1]b[0][2]b[1][0...

2018-05-11 15:28:53 2741

原创 字符串处理函数

用字符串处理函数时我们常使用string.h中的库函数来实现求字符串的长度、字符串的连接、复制和比较等操作,下面我们来看看如果不使用这些库函数它是如何实现的。1、求字符串的长度strlen(str)    功能:统计以str为起始地址的字符串的长度,长度不包括字符串的结束标志'\0',将其长度作为函数值返回。#include &lt;stdio.h&gt;#include &lt;assert....

2018-05-10 20:17:20 423

空空如也

空空如也

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

TA关注的人

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