自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【C++】-适配器模拟实现栈和队列

文章目录1. 什么是适配器2. STL标准库中stack和queue的底层结构3. deque的简单介绍(了解)3.1 deque的原理介绍3.2 deque的缺陷4. STL标准库中对于stack和queue的模拟实现4.1 stack的模拟实现4.2 queue的模拟实现1. 什么是适配器适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成用户希望的另外一个接口。2. STL标准库中stack和queue的底层结

2021-07-27 21:34:10 257

原创 信号处理的基本过程

我们知道信号的递达方式共有三种,默认,自定义捕捉和不处理,默认和不处理的过程比较简单,先不谈。本文我带大家分析一下信号捕捉的基本过程。1. 信号递达是立即发生的吗?我们来先看这样一段代码:#include <stdio.h>int main(){ int arr[100]; int i = 0; for(; i < 200; i++) { arr[i] = i; } printf("run here!?\n"); return 0;}

2021-07-22 18:12:57 4103 3

原创 进程间通信---system V 共享内存

文章目录1. 认识共享内存1.1 概念1.2 共享内存示意图2. 共享内存函数2.1.ftok2.1.1 功能2.1.2 声明2.1.3 实例2.2. shmget2.2.1 功能2.2.2 声明2.2.3 实例2.3 shmctl2.3.1 功能2.3.2 声明2.3.3 实例2.4 shmat函数2.4.1 功能2.4.2 声明2.5 shmdt函数2.5.1 功能2.5.2 声明2.5.3 实例3. 进程间通信3.1 common.h(头文件)3.2 server.c(服务器)3.3 client.c

2021-07-09 16:24:49 348

原创 【Linux】-CentOS 7 动静态库生成打包原理及使用

文章目录1. 动静态库的概念2. 动静态链接原理2.1动态链接原理2.2 静态链接原理2.3 总结3. 静态库的打包及使用3.1 链接的本质3.2 静态库打包3.3 静态库使用4. 动态库的打包及使用4.1 动态库打包4.2 动态库的使用1. 动静态库的概念静态库(.a):程序在 编译链接 的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库(.so):程序在 运行 的时候才去链接动态库的代码,多个程序共享使用库的代码。我们都知道一个操作系统本身就会自带许多动静态库文件,一般

2021-06-05 10:28:41 916 1

原创 【C++】-教你实现一下简单的string类(面试常问)

C++面试时,面试官总是喜欢让学生自己来模拟实现一个string类。由于时间原因,这个string类肯定不能包含STL库里的全部功能,但至少要能进行简单的资源管理,比如初始化,赋值,释放。我认为面试应该需要给出一下四个接口:构造函数、析构函数、拷贝构造函数、赋值运算符重载。本篇文章中我会向大家介绍这四个接口的两种实现方式供大家参考,分别是传统版写法和现代版写法。下面开始介绍。1. 传统写法1.1 成员变量由于只进行简单的资源管理,因此此处string类的成员变量只设置一个指向动态数组的一个字符指

2021-05-27 16:54:50 719 1

原创 【C++】-模板初识

前言本篇文章主要面向C++初学者,所介绍内容包括模板由来,函数模板及类模板的使用方法与基本原理相关,属于模板的初阶认识,不涉及模板特化,分离编译等问题。下面开始介绍。文章目录前言1. 泛型编程2. 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.4.1 实例化的概念2.4.2 隐式实例化2.4.3 显示实例化2.5 模板参数的匹配原则3. 类模板3.1 类模板的定义格式3.2 类模板的实例化1. 泛型编程我们在日常编程时常常会碰到这样一种情况:

2021-05-10 17:18:55 640 13

原创 【C++】-动态内存管理(new/delete用法及其原理)

1. C++内存管理方式C语言的内存管理方式malloc/free在C++中可以继续使用,但在部分地方略显无能为力而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。首先我们要区分清楚一点,C语言中开辟空间所使用到的malloc、calloc、free等等这些都属于函数,而C++中的new和delete是关键字,这一点是本质上的区别。3.1 new/delete操作内置类型下面我们来看new/delete操作内置类型的用法:int mai

2021-05-09 20:37:01 1084 13

原创 【Linux】 - 深度理解进程地址空间

测试环境Linux kernel 2.6.3232位平台文章目录1.程序地址空间回顾2. 地址空间的“领地意识”3. 地址空间是物理内存吗?4. 虚拟地址空间5. 为什么要存在地址空间?好处1:保护内存好处2:将空间连续化处理6. 地址空间的本质1.程序地址空间回顾相信大家在学习C/C++或者其它语言的时候,一定见到过一幅类似于这样空间布局图:语言阶段我们应该是将这幅图称之为“程序地址空间分布图”,不过这幅图可能和你在学习语言阶段所见到的图有些许的差别。大家以前见到的图应该不是完整的,那是

2021-05-05 19:52:08 526 2

原创 【C++】-引用的用法

引用是C++中非常重要的一个概念。首先要告诉大家的是C++中的引用类比的是C语言中的指针,我们知道c++完善了许多C语言语法的不足之处,而引用就是为了完善指针而提出的一个新语法。有了引用的概念之后,除非在一些特定的情况下会使用指针外,其它大多数情况下都可以使用引用来解决。本篇文章我将详细的为大家讲解引用的用法,并会在最后为大家总结指针和引用的区别(这是面试中出现频率极高的考点)。下面开始介绍。1. 引用概念首先我们要知道,引用的还有一个叫法叫“取别名”。用生活中通俗一点的话来说就是取外号。举一个

2021-04-13 16:06:34 1433 1

原创 【C++】-命名空间的概念及使用

本篇文章我将向大家介绍C++中一个非常重要的语法,命名空间的概念。首先一开始我想先请大家一段C语言代码:#include <stdio.h>int scanf = 0;int main(){ printf("%d\n", scanf);}很简单的一段代码,这里我问一个最简单的问题,我的这段代码有没有错?这个时候可能有人觉得,必然是错的,scanf是C语言的一个标准输出函数啊,你怎么能用函数名来当变量呢?我要告诉大家的是,C语言中共有32个关键字,而C语言语法中只是规定不

2021-04-09 19:35:12 4208 3

原创 归并排序递归实现+非递归实现(C语言版)

本篇文章我将主要向大家介绍归并排序的递归实现和非递归实现。文章目录1. 归并的思想2. 归并排序的递归实现3. 归并排序的非递归实现4. 归并排序的特性总结1. 归并的思想归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。我来简单总结一下上面的说法,归并排序实际上是

2021-04-04 18:10:18 1889 2

原创 【C语言】-快速排序递归实现(左右指针法,挖坑法,前后指针法)+ 非递归实现(栈模拟)+两种优化思路(三数取中,子区间优化)

首先很开心你能阅读这篇文章,本篇文章我将主要向大家介绍快速排序实现。快排的重要性不言而喻,实际上快排的实现方法有很多种,而多数人往往只掌握了一种实现方法,这不论是在未来面试还是工作实践中都是远远不够的。这里我帮大家总结了几种常见的快排实现算法,以及各种优化思路,相信一定会为你带来帮助。下面开始介绍文章目录1. 什么是快排?2. 三种常见实现方法2.1 左右指针法2.2 挖坑法2.3 前后指针法3. 快排优化思路3.1 三数取中法选key3.2 递归到小的子区间时可以考虑插入排序4. 快排非递归实现

2021-03-27 11:25:53 1249 1

原创 直接插入排序+希尔排序(C语言实现)

本篇文章我将向大家介绍两种插入排序算法:直接插入排序和希尔排序。其中直接插入排序是一种比较基础的排序方法,较容易理解,但是效率不高。而希尔排序算是直接插入排序的一个改进版,虽然不是很好理解,但是实现之后的效率相比直接插入排序会大大的提高。接下来我会详细的讲解这两个排序算法的思路,以及实现代码,下面开始介绍。1. 插入排序的思想基本思想:插入排序是一种基础的排序法,把待排序的数据按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插完为止,得到一个新的有序序列。实际中我们在玩

2021-03-24 10:40:58 1181 3

原创 【Linux】-剖析目录权限+粘滞位

本篇文章我将向大家详细介绍Linux中两个非常重要的知识点目录权限以及粘滞位,这两点也是在面试中经常会被问到的两个问题,我会尽自己最大的努力来让大家有所收获。1. 目录的三大权限可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容.可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件. 可执行权限: 如果目录没有可执行权限, 则无法cd到目录中.下面我们先来通过几个例子来感受一下目录的三种权限。1.1 可读权限dir1是当前路径下的一

2021-03-22 11:43:24 322 1

原创 堆的构建(C语言版)

文章目录前言1.认识堆1.1 堆的概念1.2 堆的性质1.3 大根堆和小根堆2. 建堆2.1 设计堆结构2.2 向下调整算法2.3 堆的构建2.4 建堆的时间复杂度前言堆是一种重要的数据结构,现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储。需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆(堆区)是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。我个人也是在前段时间刚刚结束了堆的学习,不得不说的是堆的难度相较于数据结构前期所学的顺序表、链表、栈、队列等要更上一个台阶。不过在

2021-03-12 20:32:13 1597 1

原创 C语言设计实现队列

文章目录前言1. 认识队列2. 设计队列结构3. 队列相关功能实现3.1 队列的初始化3.2 数据入队3.3 数据出队3.4 获取队头数据3.5 获取队尾数据3.6 检测队列是否为空,如果为空返回非零结果,如果非空返回03.7 获取队列中有效元素个数3.8 销毁队列前言队列是线性表中一种特殊的结构,用来存储和管理数据,并解决一些相关的问题。提起队列就不得不提起栈了,栈和队列两种结构十分类似,所以在大多数知识体系中都是将栈和队列放在一块对比学习。这一点我是十分认可的,因此我觉得大家在学习队列之余可以参考

2021-03-10 17:50:17 384 1

原创 C语言设计实现栈

目录前言1.认识栈2. 栈的实现2.1 底层结构的选用2.2 栈的内存结构3.栈的相关功能3.1 初始化栈3.2入栈3.3 出栈3.4 获取栈中有效元素个数3.5 检测栈是否为空,如果为空返回非零结果,如果不为空返回03.6 获取栈顶元素3.7 销毁栈前言栈是线性表中一种特殊的结构,用来存储和管理数据,并解决一些问题。本篇文章我会系统的向大家介绍栈的相关概念,并用C语言实现栈的一些基本功能,比如入栈、出栈、返回栈顶元素等等…下面开始介绍。1.认识栈栈:一种特殊的线性表,其只允许在固定一端进行插

2021-03-04 15:45:27 511 1

原创 双链表----增删查改(C语言版)

前言本篇文章我将会向大家介绍数据结构中另一种常用的链表结构, 带头双向循环链表(双链表)。这种链表结构最复杂,一般用在单独存储数据。实际中使用的链表顺序结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后就会发现结构会带来很多优势,实现反而简单了,后面我们代码实现了就知道了。我将会介绍双链表的以下功能:初始化、打印、尾插、尾删、头插、头删、查找、任意位置前插入、删除任意位置,销毁。每一个功能我都会向大家展示相应的效果,并且分析它就是如何来实现的,下面开始介绍。1. 概念及结构

2021-03-01 21:22:10 977 1

原创 单链表----增删查改(C语言版)

前言链表是数据结构中一种特别重要的结构,它和顺序表同属于线性表的一种。不同于顺序表的是,链表并没有局限于物理内存上的连续性,而是一种在逻辑上连续的线性表,因此链表可以实现很多顺序表难以实现的功能。形象的理解,链表结构就像现实中链条一样,将一串单个物体串联在一起。数据结构中的链表是主要这样:链表分为多种类型,有单向链表、双向链表、带头链表、不带头链表等等……虽然链表类型多种多样,但实际中最常用的只有以下两种:本篇文章我将主要向大家介绍无头单项非循环链表(单链表),这种链表结构简单,一般不会单

2021-02-19 22:51:26 1174 2

原创 顺序表----增删查改(C语言版)

前言顺序表是线性表的一种,是实际中运用非常广泛的一种数据结构,也应该是每一个初学者所接触到的第一种数据结构。所谓万事开头难,学好顺序表实现就是为数据结构的学习开了一个好头。顺序表一般分为两种,一种为静态顺序表,实质上是一个静态的数组。还有一种是动态顺序表,动态顺序表的内存可以根据使用者需求来自主调整大小。本篇文章我将主要向大家介绍动态顺序表的以下功能:初始化、销毁、打印、尾插、尾删、头插、头删、查找、任意位置的插入、任意位置的删除。每一个功能我都会向大家展示相应的效果,并且分析它就是如何来实现的,下面

2021-02-15 16:08:27 1048 2

原创 时间复杂度和空间复杂度(含例题讲解)

时间复杂度和空间复杂度前言算法效率时间复杂度1.时间复杂度的概念2.大O的渐进(估算)表示法推导大O阶方法(重点!!!):另外有些算法的时间复杂度存在最好、平均、和最坏情况(重点!!!):3.常见时间复杂度计算举例实例1:实例2:实例3实例4:实例5:空间复杂度1.空间复杂度的概念2.常见空间复杂度计算举例实例1:实例2:前言时间复杂度和空间复杂度的求解可以说是所有数据结构初学者所面对的第一个重点,它是衡量一段代码优劣的重要指标。本篇文章博主会详细的向大家介绍求解一段代码时间复杂度和空间复杂度的方法,并

2021-02-13 20:43:15 3484

原创 【C语言】-#define定义的标识符和宏

#define定义的标识符常量和宏前言define定义标识符语法举例提问define定义宏宏的定义宏的声明方式宏的应用宏和函数的对比宏命名约定undefdefine替换规则前言define这个关键字是C语言中一个非常重要的关键字,也是我们特别常见的一个关键字。和这个关键字相关主要有两个功能,一个是define定义的标识符,还有一个是define定义的宏。本篇文章博主就主要围绕这两点展开向大家介绍和关键字define相关的一些知识。define定义标识符语法#define name stuff

2021-02-02 22:16:38 3569

原创 【C语言】-文件操作

什么是文件磁盘上的文件就是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件。1.程序文件包括源程序文件(后缀为.c),目标文件(Windows环境后缀为.obj),可执行程序(Windows环境后缀为.exe)。2.数据文件文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。本篇讨论的是全是数据文件。我们通常C语言所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。其实有时候

2021-01-30 12:42:38 851

原创 【C语言】-动态内存管理详解+笔试题练习

动态内存管理为什么存在动态内存分配动态内存函数的介绍mallocfreecallocrealloc常见动态内存分配错误1.对空指针的解引用操作2.对开辟空间的越界访问3.对非动态开辟内存使用free释放4.使用free释放一块动态开辟内存的一部分5.对一块动态内存多次释放6.动态开辟内存忘记释放(内存泄漏)几个经典的笔试题题目1:题目2:题目3:题目4:为什么存在动态内存分配我们常见的内存开辟方式有:第一种int val = 20;在栈空间上直接开辟四个字节第二种char arr[10]

2021-01-22 10:22:30 778

原创 【C语言】- 通讯录实现详解

今天向大家介绍一个利用C语言实现通讯录的过程。通讯录相信大家都听说过,存放一个人的信息,用来方便联系。下图为我们即将实现通讯录的功能:图中已经描述的很清楚了,这个通讯录的容量为1000,所录入的信息包括名字、电话、地址、QQ、性别和年龄这五个部分。该通讯录有7个功能,增加、删除、查找、修改、排序、展示和退出。下面就来介绍用C语言来实现的过程。首先我们还是在一个项目中创建三个文件,两个源文件,一个文件存放主函数,一个文件来存放通讯录的实现函数,还有一个头文件来声明函数。声明模块接下来我们来看头文件

2021-01-20 18:16:01 3214 1

原创 【C语言】-杨氏矩阵的实现

今天来向大家介绍一个用C语言实现杨氏矩阵的问题。题目如下:有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。要求:时间复杂度小于O(N);题干中所描述的矩阵被称作杨氏矩阵,然后让你在这个这个矩阵中查找一个数字。其实在矩阵中查找一个数字并不难,只需采取遍历的方式,将矩阵中每个元素拿出来比较即可。但这道题还有一个要求就是时间复杂度必须小于O(N),也就是说不能采用遍历的方式来查找。因此我们需要根据杨氏矩阵的特点来写一个新的算法进行查找。如

2021-01-19 11:42:35 567 4

原创 【C语言】- memcpy函数和memmove函数的使用及模拟

今天我来向大家介绍两种重要的内存操作函数memcpy函数和memmove函数。简单观察一下这两个函数你会发现,它们起始的三个字母都是mem.这里的mem实际上是memory的缩写,memory这个词最常见的意思是记忆,而在计算机中它被翻译为内存。所以如果以后大家遇到以这个三个字母mem为开头的函数,那基本上都是和内存相关的。闲话不多数,下面直接来介绍这两种函数。memcpy函数定义:在缓冲区之间复制字符。函数声明:void * memcpy ( void * destination, co

2021-01-16 11:32:21 1183

原创 【C语言】- 回调函数之qsort函数使用及冒泡法模拟

今天我们通过一个qsort函数的模拟实现来让大家感受回调函数的概念。1:qsort函数的使用首先先简单的介绍一下qsort函数,这个函数是我们C语言中的一个库函数,它的功能是实现一组数据的快速排序。说到这里大家肯定能想到,这个函数就是实现一个排序功能的函数,而我们也曾写过冒泡排序的函数,那么这个库函数究竟有什么与众不同的地方呢?接下来我想先请大家回忆起冒泡排序的函数,代码如下:#include <stdio.h>void print_arr(int arr[], int sz){

2021-01-03 20:29:51 380 1

原创 【C语言】-获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列

题目:获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列拿到这个问题首先我们要好好的理解一下题意,获取一个整数二进制序列中所有的偶数位和奇数位,我们知道二进制序列在计算机中的存储有32位,例如11的二进制序列就是00000000000000000000000000001011,而他的奇数位和偶数位各占16位。奇数位就是这32位单数位的数,偶数位就是双数位的数。像这个二进制序列的奇数位就是00000000000000001.当然偶数位就是0000000000000011.其实剖析之后不难发

2020-11-01 08:59:13 1901 6

原创 【C初阶】-扫雷

今天再来给大家分享用C语言知识来实现一个简单的扫雷游戏过程。扫雷这个游戏的原理想必大家都是比较清楚的了,这里再来向大家简单的介绍一下。下面是一个9*9的扫雷棋盘我们首先随机的在棋盘上点击一个位置,如果该位置被布置了雷,那么很遗憾你直接被炸死了,如果没有雷,那么他会在该位置显示出他周围八个位置雷的个数,如果该位置有一个雷,就显示数字1,有两个雷就显示数字2,依次类推。玩家根据提示把全部的安全位置都找到后,就会获得游戏的胜利。这就是扫雷游戏的简单规则。接下来介绍C语言的实现过程。在上一篇中我们刚刚介

2020-10-11 09:51:12 382 3

原创 【C初阶】-三子棋

今天我们将运用前面所学的知识向大家介绍一个应用实例:三子棋。相信大家都玩过五子棋小游戏,三子棋和五子棋的游戏原理是相同的,只要一方玩家在横、竖和斜直线上将三颗棋子连在一起,那么就会获得游戏的胜利。接下来我们开始介绍C语言的实现方法。首先,我想先简单的向大家展示三子棋程序一次成功的运行过程。如下图:我们现在可以简单的先分析一下这个游戏。游戏刚开始给了我们一个菜单,让我们进行选择,输入1开始游戏,输入0结束游戏。接下来我们开始游戏,然后系统给了我们一个3*3的棋盘,并提示玩家先走,下棋的步骤是输入

2020-10-09 16:18:18 216 1

原创 【C语言】-字符串逆序

题目:编写一个函数 reverse_string(char * string)(递归实现)实现:将参数字符串中的字符反向排列。要求:不能使用C函数库中的字符串操作函数。这里先提一点,很多人拿到这道题的时候就把题意理解错了,题目的要求是将字符串的字符反向排列,而不是把字符串的字符反向打印到屏幕上。假使我们使用数组存放的这组字符串,那么函数的功能应该就是是数组中的字符串按逆序排列。先来看递归写法:...

2020-10-06 12:28:10 3075 3

原创 【C语言】-打印100~200之间的素数

题目:写一个代码:打印100~200之间的素数素数:素数是只能被1和它本身整除的数字算法一:我们可以写一个循环让这个数n和2-(n-1)这些数试除,如果该数被整除,则说明它不是素数,如果除到n-1还没有被整除,那说明他是一个素数,将他打印到屏幕上当然,为了方便起见,我们可以定义一个变量count来统计打印素数数量,从i=开始每打印一个素数,给count的值加一代码如下:#include <stdio.h>//写一个代码:打印100~200之间的素数//素数是只能被1和它本身整除的

2020-10-06 11:23:31 1358 2

原创 【C语言】-求两个数的最大公约数

题目:给定两个数,求这两个数的最大公约数。这道题我们介绍两种算法一是暴力求解法,二是辗转相除法我们首先应该知道一点,一个数如果是另一个数的约数,则一个数可以被另一个数整除,即a%b==0,也就是说他们相除的余数值为0算法一:暴力求解法我们先输入两个数,然后比较出两个数的较大值和较最小值把较大值放到a中,较小值放到b中然后让两个数同时和较小的数相除,如果不能整除,则给较小的数减一,继续相除直到找到能同时整除这两个数的值,就是这两个数的最大公约数由于我们求的是最大公约数,所以从大往小里除,可以

2020-10-06 11:02:15 2373

空空如也

空空如也

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

TA关注的人

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