自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++IO流

IO

2022-08-30 14:47:25 128

原创 模拟实现priority_queue(优先级队列)

【代码】模拟实现priority_queue(优先级队列)

2022-08-29 13:41:06 115

原创 互斥锁(mutex)

互斥锁

2022-07-27 11:09:56 888

原创 AVL树的c++实现

AVL树的c++实现1.概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当 于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年 发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之 差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。 一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:它的左右

2022-05-16 13:36:27 144

原创 Map和Set

Map和Setmap和set都是stl中的关联容器,map以键值对的形式存储,key=value组成pair,是一组映射关系。set只有值,可以认为只有一个数据,并且set中元素不可以重复且自动排序,如果需要重复则使用multiset,要说区别的话,存储的东西不一样,应用场景不一样,支持的操作也不一样,很多不同。  map和set支持快速查找和删除,一般使用RB树来实现,当然后面还有用hashtable实现的,使用rb树作为底层结构增删数据都很快,不存在内存移动也就不容易出现迭代器失效的问题,这也就是区

2022-05-10 14:59:55 107

原创 轻量级进程(线程)ID与进程ID

在Linux下,线程又被称为轻量级进程。每一个用户态的线程,在内核中都对应一个调度实体,也拥有自己的进程描述符(task_struct结构体)。 没有线程之前,一个进程对应内核中一个进程描述符,对应一个进程ID。但是引入线程的概念之后,一个用户进程下管辖N个用户态线程。每个线程作为一个独立的调度的实体,在内核态中都有自己的进程描述符,进程和内核描述符一下变成了1:N的关系。POSIX标准又要求同一进程中的线程调用getpid函数时返回相同的进程ID, 于是Linux内核就引入了线程组的概念。多线程的进程,

2022-05-07 14:41:48 311

原创 C++实现搜索二叉树

C++实现搜索二叉树#pragma onceusing namespace std;template<class K>struct BSTreeNode{ BSTreeNode<K>* _left; BSTreeNode<K>* _right; K _key; BSTreeNode(const K& key) :_left(nullptr) , _right(nullptr) , _key(key) {}};template

2022-04-15 18:03:14 1027

原创 C++中的继承和多态

C++中的继承和多态1.继承1.1继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。class Person{public: void Print() { cout << "name:" <<

2022-04-13 12:09:25 748

原创 c++模拟实现stack、queue

c++模拟实现stack、queue#pragma once#include<vector>#include<list>#include<forward_list>#include <deque>using namespace std;namespace shichun{ template<class T, class Container = deque<T>> class stack {

2022-03-28 12:59:42 777

原创 list的模拟实现

list的模拟实现#pragma oncenamespace shichun{ template<class T> struct ListNode { ListNode<T>* _next; ListNode<T>* _prev; T _data; ListNode(const T& data = T()) :_next(nullptr) , _prev(nullptr) , _data(data) {}

2022-03-22 17:38:21 70

原创 程序地址空间

程序地址空间研究环境kernel2.6.3232位平台敲一段代码:#include <stdio.h>#include <unistd.h>#include <stdlib.h>int g_val = 0;int main(){ pid_t id = fork(); if(id < 0) { perror("fork"); return 0; } else if(id ==

2022-03-15 11:08:49 373

原创 模拟实现vector

模拟实现vector#define _CRT_SECURE_NO_WARNINGS 1#pragma oncenamespace shichun{ template<class T> class vector { public: // Vector的迭代器是一个原生指针 typedef T* iterator; typedef const T* const_iterator;

2022-03-13 18:43:53 65

原创 C++中模拟实现string类

C++中模拟实现string类#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>#include <assert.h>using namespace std;namespace shichun{ class string { friend ostream& operator<<(ostream& _cout, const shichun::string&am

2022-03-02 17:07:42 83

原创 C++中的模板

C++中的模板1.泛型编程如何实现一个通用的交换函数呢?void Swap(int& left, int& right){ int temp = left; left = right; right = temp;}void Swap(double& left, double& right){ double temp = left; left = right; right = temp;}void Swap(char& left, cha

2022-02-20 13:09:45 73

原创 Linux常见指令和权限

Linux常见指令和权限01. ls 指令语法: ls [选项][目录或文件]功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。常用选项:-a 列出目录下的所有文件,包括以 . 开头的隐含文件。-d 将目录象文件一样显示,而不是显示其下的文件。 如:ls –d 指定目录-i 输出文件的 i 节点的索引信息。 如 ls –ai 指定文件-k 以 k 字节的形式表示文件的大小。ls –alk 指定文件-l 列出文件的详细信息。-n 用数字的 UID,

2022-01-25 18:43:05 102

原创 赋值运算符的重载

赋值运算符的重载运算符重载C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类 型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。函数名字为:关键字operator后面接需要重载的运算符符号。函数原型:返回值类型 operator操作符(参数列表)注意:不能通过连接其他符号来创建新的操作符:比如operator@重载操作符必须有一个类类型或者枚举类型的操作数用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不 能改变其含义

2022-01-17 12:04:23 494

原创 初识C++

初识C++1.C++关键字(C++98)C++总计63个关键字,C语言32个关键字asm do if return try continue auto double inline short typedef for bool dynamic_cast int signed typeid public break else long sizeof typename throw case enum mutable static union wchar_t catch explicit namespace

2022-01-15 11:01:09 63

原创 用C语言实现各种排序(附动图)

用C语言实现各种排序算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。算法复杂度相关概念稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。时间复杂度:对排

2021-11-22 10:47:58 3182 1

原创 用c语言实现各种排序(插入、希尔、选择、堆排、冒泡、递归和非递归快排、归并)

用c语言实现各种排序(插入、希尔、选择、堆排、冒泡、递归和非递归快排、归并)由于快排的非递归实现需要用到堆,所以我们先导入堆的代码Stack.h#pragma once#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <stdbool.h>typedef int STDataType;typedef struct Stack{ STDataType* a;

2021-11-21 15:39:51 131

原创 用c语言实现各种排序(插入、希尔、选择、堆排、冒泡、递归和非递归快排、归并)

用c语言实现各种排序(插入、希尔、选择、堆排、冒泡、递归和非递归快排、归并)由于快排的非递归实现需要用到堆,所以我们先导入堆的代码Stack.h#pragma once#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <stdbool.h>typedef int STDataType;typedef struct Stack{ STDataType* a;

2021-11-19 11:23:10 741

原创 链式二叉树的创建销毁及其应用

链式二叉树的创建销毁及其应用因为层序遍历和判断是否为完全二叉树需要队列实现,所以要引入队列Queue.h#pragma once#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <stdbool.h>typedef int QDataType;typedef struct QueueNode{ struct QueueNode* next; QData

2021-11-14 21:26:06 182

原创 链式二叉树相关问题

链式二叉树相关问题#define _CRT_SECURE_NO_WARNINGS 1// 二叉树前序遍历 void PreOrder(BTNode* root){ if (root == NULL){ printf("NULL "); return; } printf("%c ", root->data); PreOrder(root->left); PreOrder(root->right);}// 二叉树中序遍历void InOrder(BTNo

2021-11-12 15:08:00 357

原创 用c语言实现顺序表

顺序表test.c#define _CRT_SECURE_NO_WARNINGS 1#include "SeqList.h"void Test(){ SL s; SeqListInit(&s); SeqListPushBack(&s, 1); SeqListPushBack(&s, 2); SeqListPushBack(&s, 3); SeqListPushBack(&s, 4); SeqListPushBack(&s, 5);

2021-11-12 15:05:43 492

原创 用c语言实现链表

链表slist.h#pragma once#include <stdio.h>#include <assert.h>#include <stdlib.h>// slist.htypedef int SLTDateType;typedef struct SListNode{ SLTDateType data; struct SListNode* next;}SListNode;// 动态申请一个节点SListNode* BuySListNode

2021-11-12 15:05:00 49

原创 用c语言实现队列

队列Queue.h#pragma once#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <stdbool.h>typedef int QDataType;typedef struct QueueNode{ struct QueueNode* next; QDataType data;}QueueNode;typedef struct Queue

2021-11-12 15:04:17 691

原创 带头循环双向链表

带头循环双向链表lish.h#pragma once#include <stdio.h>#include <assert.h>#include <stdlib.h>typedef int LTDateType;typedef struct ListNode{ LTDateType data; struct ListNode* next; struct ListNode* prev;}LTNode;LTNode* ListInit();voi

2021-11-12 15:02:50 187

原创 用c语言顺序表实现栈

用c语言顺序表实现栈栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。Stack.h#pragma once#include <stdio.h>#include <stdlib.h>#include <asse

2021-10-29 11:18:25 733

原创 链表的回文结构

链表的回文结构描述对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。思路:我们可以先找到链表的中间节点然后逆置中间节点后的节点,然后依次遍历head和rHead直到空为止,如果值一直相等则为回文结构具体代码实现如下:/*struct ListNode { int val; struct ListNode *next;

2021-10-24 21:29:27 155

原创 相交链表!!!

相交链表给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。先定义curA和curB遍历链表,看看最后一个节点是不是一个,如果是再寻找第一个相交的节点,如果不是直接返回null。遍历时计算出各自的链表长度,然后长的链表先走两个长度的差,A、B链表再同时走第一个相等的节点就是第一个相交的节点。代码实现如下:/** * Definition for singly-linked list. * struct List

2021-10-24 21:19:10 1295

原创 链表分割!!!

链表分割现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。我们先开一块空间命名为lessHead、lessTail存放小于x的节点,greaterHead、greaterTail存放大于x的节点如图所示:依次挪动,lesstail、greatertail、cur跟着挪动挪到最后如图所示这是我们的逻辑图,最后我们还要在代码上吧两个链表连接起来并把大的链表的最后置空具体代码如

2021-10-24 21:05:38 56

原创 C语言文件操作

C语言文件操作1.文件的打开和关闭文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。 在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了 指针和文件的关系。 ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。//打开文件FILE * fopen ( const char * filename, const char * mode );//关闭文件int fclose ( FILE * stream );打开方式如下:文

2021-09-27 15:01:26 69

原创 memmove函数的实现

memmove函数的实现我们查找函数的信息具体实现步骤如下[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lnq6Dohu-1631930607503)(https://i.loli.net/2021/09/18/BldzithbLq42OcD.jpg)]代码实现如下#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <assert.h>#include <str

2021-09-18 10:04:12 117

原创 qsort函数的使用

qsort函数的使用qsort是用来排序的的一个函数,具体怎么使用呢我们在MSDN中查的的解释如下从上方可以看出:第一个参数就是void*类型的指针变量,因为void *可以用来接收任意类型的指针变量,用来存放地址第二个参数是内部元素个数第三个参数是元素大小,也就是占用多少字节第三个参数是比较规则,用来区分不同类型元素的比较比较规则如上图所示,元素1小于元素2返回一个小于零的数,元素1大于元素2返回一个大于零的数,元素1等于元素2返回零内部函数实现规则如下边的代码所示struct S

2021-09-07 17:45:45 86

原创 用c语言实现简单版通讯录

在vs2019创建新项目,然后添加两个源文件contact.c和test.c,接着创建一个头文件contact.h。contact.h:#include <stdio.h>#include <string.h>#include <stdlib.h>#define MAX 1000#define MAX_NAME 20#define MAX_TELE 12#define MAX_ADDR 100#define MAX_QQ 12#defin.

2021-08-25 15:02:33 69

原创 字符串左旋

实现一个函数,可以左旋字符串中的k个字符。例如:ABCD左旋一个字符得到BCDAABCD左旋两个字符得到CDAB#include <stdio.h>void left_move(char* arr, int k){ int len = strlen(arr); int i = 0; for (i = 0; i < k; i++) { int j = 0; int tmp = *arr; for (j = 0; j < len - 1; j+

2021-08-23 10:13:40 47

原创 深度理解取余取模运算

深度理解取余运算向零取整首先打印一段代码#include <stdio.h>int main(){ int i = -2.9; int j = 2.9; pritnf("%d\n, i");// -2 pritnf("%d\n, j");// 2 return 0;}打印出来发现,i的结果是-2,j的结果是2,有一个trunc函数和这个例子同作用向负无穷取整#include <stdio.h>#include <

2021-08-22 11:51:04 141

原创 浮点型在内存中的存储

浮点型在内存中的存储我们先来敲一串代码:int main(){ int n = 9; float *pFloat = (float *)&n; printf("n的值为:%d\n",n); //正常打印9 printf("*pFloat的值为:%f\n",*pFloat); //9二进制为00000000 00000000 00000000 00001001 //S=0,M=0.00000000000000000001001,E= 1- 127 = -126

2021-08-09 16:24:54 69 1

原创 函数栈帧的创建和销毁

·局部变量是怎么创建的?·为什么局部变量的值是随机值?·函数是怎么传参的?传参的顺序是怎样的?·形参和实参是什么关系?·函数调用是怎么做的?·函数调用后是怎么返回的?解决这些问题前我们先来写一串代码#include <stdio.h>​int Add(int x, int y){ int z = 0; z = x + y; return z;}​int main(){ int a = 10; int b = 20...

2021-08-06 19:28:55 79

原创 C语言代码中的bug

我们这有一段代码如下:int main(){ int i = 0; int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; //0~9 for (i = 0; i <= 12; i++) { arr[i] = 0; printf("hehe\n"); } return 0;}运行时发现造成死循环调试过程中发现i和arr[12]中的地址是一样的,所以就会把0赋值给i造成死循环画图分析...

2021-08-03 15:19:03 262

原创 用C语言实现简单版的扫雷小游戏

在vs2019创建新项目,然后添加两个源文件test.c和game.c,接着创建一个头文件game.h。test.c:#include "game.h"void game(){ char mine[ROWS][COLS] = { 0 }; char show[ROWS][COLS] = { 0 }; InitBoard(mine, ROWS, COLS, '0'); InitBoard(show, ROWS, COLS, '*'); SetMine(mine, ROW, C

2021-07-28 17:44:06 69

空空如也

空空如也

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

TA关注的人

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