C/C++
文章平均质量分 50
CairBin
这个作者很懒,什么都没留下…
展开
-
CMake基础用法
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述安装(编译)过程。他能够输出各种各样的makefile或者project文件。笔者主要用CMake来构建CPP项目(但不仅限于CPP)。由于makefile通常依赖于当前的编译平台,编写makefile相较于麻烦一些,依赖也容易出错,而CMake恰好能解决上述问题。原创 2023-09-09 01:59:35 · 204 阅读 · 0 评论 -
写一个基于C语言的保守垃圾回收器
最近在实现链表的时候总是忘记释放内存,所以心想能不能在C语言的基础上实现一个像Java那样的垃圾回收机制来帮助程序员更好地管理内存。虽然技术有限,这个垃圾回收器不能够像JVM那样强大,但是没关系,许多计算机界的大佬做的项目最初并不一定用到了多么高大上的技术,重点在于它们做出了第一个这样的东西。所以,我们只需要设计出一个雏形,日后加以改进就行了。原创 2022-09-16 13:05:48 · 633 阅读 · 0 评论 -
C/C++函数指针
我们仍以上文的add函数为例,定义一个名为fp指向add函数的指针很显然,函数指针定义就是把函数声明中的函数名替换成了(*函数指针名)原创 2022-08-05 13:36:36 · 208 阅读 · 0 评论 -
C/C++ void类型指针
空类型指针,只储存地址的值,丢失类型,如果要访问所指对象的值必须进行类型转换。所有类型指针可隐式转换成void类型的指针,void转其他类型指针需要强制转换。原创 2022-08-03 22:14:28 · 307 阅读 · 0 评论 -
[转载]Qt C2001报错:“常量中有换行符”且部分中文显示黑框
解决方案旧方案在新电脑做一个简单的Qt项目时,在debug输出的时候,出现了C2001错误,提示“常量中有换行符”,比如就会出现常量中有换行符,肉眼确实没看出来…但是却可以顺利通过编译,试了很久改了编码也不行,即便编译通过界面显示却会乱码。最后通过网上百度,找到了3种解决方式:1、将字符中的中文字符用英文字母或单词代替,这样解决的好处是代码规范,语言统一,缺点就是没有中文表达那样直接、清晰。(如果是这样我就不会去用中文了!!!)2、使用中文字符常量时,用QStringLiteral修饰中文字符,格式转载 2022-06-16 16:16:24 · 303 阅读 · 0 评论 -
C++元组(tuple)类型
元组tuple是C++的一个模板,不同tuple类型的成员类型也不相同,但是一个tuple可以有任意数量的成员。每个tuple类型的成员个数是一定的,但是不同的tuple成员个数可以不同。原创 2022-06-12 23:43:20 · 13590 阅读 · 2 评论 -
C语言malloc与calloc区别
C语言malloc与calloc区别区别开门见山,malloc与calloc在内存分配时,前者分配一整块,后者分配n块,并且后者在分配时会将内存置为0,前者不会内存里是垃圾数据。另外它们参数不同,malloc参数只有一个无符号整型的num表示分配的字节数,函数原型如下void *malloc(size_t num);calloc参数有两个,分别是无符号整型num表示分配的对象的个数,以及无符号整型size表示每个对象的大小void *calloc(size_t num, size_t size原创 2022-05-13 04:16:25 · 8838 阅读 · 1 评论 -
数据结构——堆
堆堆的概念堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象,即是一种顺序储存结构的完全二叉树。1提示:完全二叉树完全二叉树:对一棵深度为k、有n个结点二叉树编号后,各节点的编号与深度为k的满二叉树相同位置的结点的编号相同,这颗二叉树就被称为完全二叉树。2堆的性质堆中某个结点的值总是不大于或不小于其父结点的值堆总是一棵完全二叉树除了根结点和最后一个左子结点可以没有兄弟结点,其他结点必须有兄弟结点最大堆最小堆3最大堆:根结点的键值是原创 2022-04-09 15:52:08 · 2338 阅读 · 0 评论 -
欧几里得算法
欧几里得算法介绍概念欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。公式计算公式gcd(a,b) = gcd(b,a mod b)GCD、LCM注:最大公因数求法还有辗转相减法等方法GCD(最大公约数)//求a,b最大公约数int find_gcd(int a, int b){ return b==0?a:gcd(b,a%b);}LCM(最小公倍数)//求a,b的最小公倍数int find_lcm(int原创 2022-04-06 14:31:00 · 560 阅读 · 0 评论 -
数据结构——并查集
并查集说明并查集是一种精巧使用的数据结构,主要用于处理一些不相交的集合合并问题。经典的例子有连通子图、最小生成树Kruskal算法和LCA等。原理将编号分别为1~n个对象分为不相交的集合,每个集合中,选择其中某个元素代表所在的集合。在这个集合中,并查集的操作有初始化、合并、找查。步骤初始化定义数组int s[]是以结点i为元素的并查集,在开始的时候没处理点与点朋友关系,所以每个点都属于独立的集,并且以元素i的值表示它的集s[i].//初始化void init_set(int n原创 2022-04-03 18:44:00 · 1038 阅读 · 0 评论 -
二叉树及其遍历
二叉树及其遍历二叉树概念定义什么是二叉树二叉树特点是每个节点最多只能有两棵子树,且有左右之分的树。注:关于数据结构——树的一些基本概念可以参考《树的概念及基本术语》 - CairBin’s Blog二叉树的基本性质关于二叉树的基本性质前面已经写的很详细了,可以回顾文章《二叉树》 - CairBin’s Blog二叉树结构体定义结构体定义及其构造函数//链式二叉树结构体定义typedef struct _BinTree{ int data; //存放数据 struct _BinT原创 2022-03-07 01:28:51 · 721 阅读 · 0 评论 -
DFS与N皇后问题
DFS与N皇后问题DFS什么是DFSDFS是指深度优先遍历也叫深度优先搜索。它是一种用来遍历或搜索树和图数据结构的算法注:关于树的一些知识可以去看《树的概念及基本术语》这篇文章它会不断地沿着节点的深度方向(该深度方向为其邻接点的方向)进行遍历DFS如何实现DFS主要步骤有以下几步访问并从某节点向邻接点出发,访问路径向深处走若走到最深处还有节点没访问,则再回到该层访问该节点(回溯)依次重复上述步骤,直至所有路径都被访问(递归)DFS时空复杂度空间复杂度DFS算法实际上是一个递原创 2022-03-05 23:38:30 · 744 阅读 · 0 评论 -
哈希排序算法
哈希排序算法说明哈希算法是一种以空间换取时间的算法。下面以一个例题的方式来进一步说明这个算法。时间复杂度 O(n)例题问题描述HDU 1425 “Sort”给你n个整数,请按从大到小的顺序输出其中前m大的数。输入:每组数据有两行,第一行有两个数n和m(0<n,m<1000000),第2行包含n个各不相同,且都处于区间[-500000,500000]的整数输出:对每组测试数据从大到小的顺序排列并输出前m大的数输入样例:5 33 -35 92 213 -644原创 2022-03-04 21:55:49 · 2549 阅读 · 0 评论 -
排序之归并排序
归并排序定义归并排序是一种采用分治法,即先使每个子序列有序,再使子序列段间有序,然后合成一个完整的有序表的有效排序方法。主要步骤划分排序合并实际过程实际过程如下图(图片来自百度)代码核心代码merge()因为我们在此使用了递归的方式,对于临时数组temp在此函数内不好写,所以为了简洁我们不直接调用该函数,而是再次封装的mergeSort()//R为排序数组,l为左界,r为右界,temp为临时数组void merge(int R[],int l, int r,int te原创 2022-02-15 21:08:05 · 542 阅读 · 0 评论 -
高精度减法(C++实现)
高精度减法简介用于计算含有超过一般变量存放不下的非负整数高精度加法这个过程是模拟的小学竖式减法计算注:在本文中,我们默认输入的第一个数为被减数,且被减数大于减数原理基本上与高精度加法相同,仅在核心代码处有些区别,因此本文较为简略,建议先阅读文章《高精度加法(C++实现)》 主要步骤清零逆置转换相减计算(包含退位)代码实现逆置因为数组存放的元素顺序与我们计算的顺序是相反的,在竖式计算中我们是将其右对齐(个位对个位,十位对十位,以此类推),而读取数字后的两个数组是左对齐的,因此我们原创 2022-01-24 15:31:42 · 1185 阅读 · 0 评论 -
高精度加法(C++实现)
高精度加法简介用于计算含有超过一般变量存放不下的非负整数高精度加法这个过程是模拟的小学竖式加法计算步骤以下有顺序之分数组清零输入获取长度逆置字符型数字转成对应的整型数字计算并输出简单来看重要的步骤也就以下几步清零逆置转换相加计算(包含进位)代码实现逆置因为数组存放的元素顺序与我们计算的顺序是相反的,在竖式计算中我们是将其右对齐(个位对个位,十位对十位,以此类推),而读取数字后的两个数组是左对齐的,因此我们要将里面的元素逆置//参数:需要逆置的数组,数组长度v原创 2022-01-16 15:13:32 · 4499 阅读 · 0 评论 -
快速幂及其模
快速幂及其模快速幂时间复杂度O(log2(N))原理幂指数以二进制的形式参与计算然后把a^b转化为 通项为**a(2n(0或1))**求0到n项和的多项式代码ll quick_pow(ll a, ll b){ ll res = 1; while (b) { if (b & 1) res = res * a; a *= a; b /= 2; } return res;}快速幂的模原理由模运算a^b%p = ((a%p)^b)%p结合快速幂的原创 2022-01-05 13:20:09 · 104 阅读 · 0 评论 -
队列及其操作
队列队列的定义队列简称队,是一种受限制的线性表,仅允许在表的一端插入,在表的另一端进行删除。进行插入的一端叫做队头进行删除的一端叫做队尾队的特点**先进先出(FIFO) **顺序队(循环队列)顺序队主要以循环队列的形式出现循环队列的要素队空状态 qu.rear == qu.front队满状态 (qu.rear+1)%MAXSIZE == qu.front结构体定义#define MAXSIZE 1024typedef struct _Queue{ int原创 2021-12-18 18:13:52 · 260 阅读 · 0 评论 -
数据结构——二叉树
二叉树二叉树的定义二叉树在一般的树上加了两个限制条件:每个结点最多只有两个子树子树有左右之分,不能颠倒二叉树的形态空二叉树只有根结点只有左子树,右子树为空只有右子树,左子树为空既有左子树,又有右子树满二叉树、完全二叉树以及非完全二叉树满二叉树:所有的分支结点都有左、右子节点,并且所有叶子结点都集中在最下层的二叉树。完全二叉树:对一棵深度为k、有n个结点二叉树编号后,各节点的编号与深度为k的满二叉树相同位置的结点的编号相同,这颗二叉树就被称为完全二叉树非完全二叉树:没有满原创 2021-11-21 15:28:22 · 890 阅读 · 0 评论 -
DevC++ 报错[Error] Id returned 1 exit status
DevC++ 报错[Error] Id returned 1 exit status起因学校机房的计算机总是二次编译总是报错报错提示[Error] Id returned 1 exit status解决方案前提首先查看下你的程序的控制台窗口有没有关闭,关闭后再重新编译是否报错。以下方案针对关闭窗口后依然报错的情况操作右键Dev C++图标 —> 属性 —>兼容性 —> 打钩“以管理员身份运行此程序"打开Dev C++ --> 工具 --> 编译选项原创 2021-11-20 13:22:44 · 4463 阅读 · 0 评论 -
排序之选择排序
选择排序代码void selSort(int R[], int n){ for(int i=0; i<n; i++) { int temp = i; int j; for (j=i+1; j<n; j++) { if (R[j]<R[temp]) temp=j; } if ( temp!=i )原创 2021-11-05 13:36:04 · 87 阅读 · 0 评论 -
字符串定义及操作
串串的定义概念串是由零个或多个字符数组组成的有限序列。串中字符的个数称为串的长度,含有零个元素的叫空串。串是限定了元素为字符的线性表(注:串与一般的线性表操作有很大区别,线性表主要针对表内的某个元素,而串操作主要针对子串)代码在C语言中,一个串可以如下定义,但仅以’\0’作为结束符时需要我们遍历整个数组,时间复杂度为O(n),这并不是我们想要的最优结果,其他方法会在下文“串的结构体定义”部分有详细描述,这里仅举个例子char str[] = "as123";对C语言来讲,串主要由原创 2021-11-05 01:17:18 · 804 阅读 · 0 评论 -
树的概念及基本术语
树树的定义树是一种非线性数据结构,它是若干结点的集合。是由唯一的根和若干不相交的子树组成的。子树又是一颗树,因此树的定义是递归的。树的结点数目可为0,此时称之为空树。树的基本术语结点(结点包含数据元素和指向子树的分支)路径:一个结点和另一个经过的边和结点的序列根(根结点):一棵树的顶点结点的度:结点拥有子树和分支的个数。树的度:树中结点度的最大值。叶子结点(终端结点):度为0的结点。分支结点(非终端结点):度不为0的结点。孩子:结点的子树的根。双亲(父结点):指向该结点的原创 2021-10-31 16:49:08 · 294 阅读 · 0 评论 -
寻找素数算法
找素数暴力求解时间复杂度: O(n*sqrt(n))原理暴力求解是对[m,n]的每一个整数都判断是否为素数,由数学可知,一个数i的最大质因子不超过sqrt(i),故我们只需判断[2,sqrt(i)]的整数中有没有i的因数即可代码vector<int> fuckingFindPrime(int m,int n){ vector<int> prime; if(m<=n) { for(int i=m; i<=n; i++) { bo原创 2021-10-30 16:34:02 · 725 阅读 · 0 评论 -
排序之快速排序
代码/* 快速排序 对low至high的位置进行排序 */void QuickSort(int R[], int low, int high){ int temp, i = low, j = high; if(i<j) { temp = R[low]; //下面将小于temp的数放置在temp左面,否则放右面 while(j>i&&R[j]>=temp) j--; if(i&原创 2021-10-25 13:28:42 · 70 阅读 · 0 评论 -
冒泡排序的实现
代码/** 冒泡排序* 参数: 参与排序的数组, 数组元素个数*/void BubbleSort(int R[], int n){ int i, j; bool flag; for(i = n-1; i>=1; i--) { flag = false; //用于标记本次循环是否发生交换 for(j=1; j<=i; j++) if(R[j-1]>R[j]) {原创 2021-10-17 09:29:49 · 231 阅读 · 0 评论 -
排序算法之插入排序
本文为了方便理解,先上代码再做解释插入排序代码void InsertSort(int R[], int n){ int i,j, temp; for(i = 1; i<n; i++) { temp = R[i]; j = i-1; while(j >= 0 && temp < R[j]) { R[j+1] = R[j]; j--;原创 2021-10-13 23:59:03 · 308 阅读 · 0 评论 -
链栈的操作
链栈的定义#include <iostream>using namespace std;//链栈,理论上只要内存够大不存在上溢,只存在下溢(栈空后继续取出元素)typedef struct _QNode{ int data; struct _QNode *next;}StNode;链栈的操作初始化bool initStack(StNode* &st){ st = new StNode; if(!st) return false; st->next原创 2021-10-10 15:17:57 · 146 阅读 · 0 评论 -
顺序栈的操作
栈的定义#include <iostream>#define MAXSIZE 1000using namespace std;//顺序栈typedef struct{ int data[MAXSIZE]; //存放栈顶元素 int top; //栈顶指针}SqStack;栈的操作初始化//初始化顺序栈bool initStack(SqStack &st){ st.top = -1; return tr原创 2021-10-07 20:50:49 · 538 阅读 · 0 评论 -
Linux内核链表之共享双链表
说明共享双链表意义在于,可以用一套函数维护不同数据类型的双链表准备定义双链表#include <iostream>#include <string>using namespace std;//此处并不包含数据域,仅有指针域用于连接结点typedef struct _DbLinkList{ struct _DbLinkList *next; struct _DbLinkList *prev;}DbLinkList;定义结构体//定义数据类原创 2021-10-05 14:21:14 · 174 阅读 · 0 评论 -
双链表的操作
双链表的代码定义#include <iostream>using namespace std;typedef struct _DLNode{ int data; //结点数据域 struct _DLNode *next; //指向后继的指针 struct _DLNode *prev; //指向前驱的指针 }DbLinkNode,DbLinkList;双链表的操作初始化双链表//初始化双链表bool initDbLinkList(原创 2021-09-28 11:40:54 · 102 阅读 · 0 评论 -
顺序表的应用——逆置问题
顺序表应用——逆置问题问题描述给定一个顺序表,将其中的元素逆置例子给定一个顺序表,其中有0至10共11个元素从小至大排列,请将这11个元素逆置使其从大到小排列以下是解题代码代码#include <iostream>#define MAXSIZE 100typedef struct{ int data[MAXSIZE]; int length;}Sqlist;//输出元素void printList(Sqlist L){ for(int n = 0;原创 2021-09-25 11:06:13 · 344 阅读 · 0 评论 -
循环链表应用——约瑟夫置换
约瑟夫问题介绍约瑟夫问题,又称约瑟夫置换、丢手绢问题。一般形式(本部分内容来自百度百科)约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。代码问题描述本文以以下问题为例编号为1-10的10 个人围成一圈,从第一个开始报数,第9个被淘汰出圈,剩下的组成新的圈。依次这样下去,求最后一个人的编号解决注意:该段代码与上篇文章——《 循环链表定义及操作 》相接//解答约瑟夫问题b原创 2021-09-18 23:16:59 · 235 阅读 · 0 评论 -
循环链表定义及操作
循环链表定义定义与单链表一样,操作时将末结点的指针指向开始结点即可typedef struct _LinkNode{ int data; struct _LinkNode *next;}LinkList;循环链表操作初始化循环链表bool InitList(LinkList* &L){ L = new LinkList; if(!L) return false; L->next = L; L->data = 0; //原创 2021-09-18 22:16:21 · 1115 阅读 · 0 评论 -
单链表的操作
单链表代码定义typedef struct LinkNode{ int data; //data存放结点的数据域(以int类型为例) struct LinkNode *next; //结点的指针域}LinkNode, LinkList;单链表的操作初始化单链表bool initList(LinkList* &L) //L类型为引用类型的指针{ L = new LinkNode; //为L分配一个动态内存 if(!L) return false;原创 2021-09-12 13:56:54 · 483 阅读 · 0 评论 -
算法题——Cantor表
题目介绍描述现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:1/1, 1/2 , 1/3, 1/4, 1/5, …2/1, 2/2, 2/3, 2/4, …3/1, 3/2, 3/3, …4/1, 4/2, …5/1, ……我们以Z字形给表上每一项编号。第一项是1/1,然后是1/2, 2/1, 3/1, 2/2, …输入格式整数N(1<= N <=10^7)输出格式表中的第N项样例输入:7输出:原创 2021-09-03 17:08:01 · 2312 阅读 · 0 评论 -
链表的定义
链表链表的概念定义:链表是一种物理存储单元上非连续、非顺序的存储结构,由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。在链表的储存上,每个结点不仅包含所存的元素信息,还包含元素间的逻辑信息。链表的特性不支持随机访问:不能通过知道第一个元素的地址(即储存空间的首地址)可以轻松访问储存的所有数据。节点的储存空间利用率相对顺序表较低:链表中的每分一个结点需要划出一部分空间来储存指向下一个结点位置的指针支持储存空间的动态分配:链表中当前结点的位置是由其前驱结点中的地址信息所指原创 2021-08-19 21:32:56 · 4047 阅读 · 0 评论 -
顺序表的操作
顺序表的操作这里先定义个顺序表#include <iostream>using namespace std;#define MAXSIZE 100typedef struct{ int *elems; int length; int size;}Sqlist;Sqlist list;顺序表初始化定义bool类型函数 initList() ,初始化成功为true,失败为false//初始化顺序表,创建一个空表bool initList(Sqlist原创 2021-08-09 17:40:58 · 395 阅读 · 0 评论 -
顺序表的概念及定义
顺序表节点的概念节点 :节点是内存中一片由用户分配的储存空间,只有一个地址来表示它的存在,没有显式名称。在学习顺序表时,一般不会去特别强调节点的概念,此概念往往在链表学习中涉及,但并不代表节点与顺序表无关,所以我特意把节点的概念放在此处以加深对顺序表的理解。顺序表的概念定义:把逻辑上相邻的节点储存在物理位置上的相邻储存单元中,节点的逻辑关系由储存单元的邻接关系来体现通俗来讲,顺序表就是把线性表中的所有元素按照其逻辑顺序,依次储存到从指定的储存位置开始的一块连续的储存空间中。第一个元素的储存位置原创 2021-08-09 14:30:14 · 1967 阅读 · 0 评论 -
C语言结构体指针与结构体变量作形参的区别
区别结构体变量结构体变量作为函数参数,传递的是结构体变量本身,是一种值传递形参结构体变量成员值的改变不影响对应的实参构体变量成员值的改变结构体指针结构体指针作为函数参数,传递的是指向结构体变量的本身结构体指针指向的变量成员值的改变影响对应的实参构体变量成员值的改变代码直接说有些抽象难懂,敲代码演示一遍就很清楚了#include <stdio.h>#include <stdlib.h>#include <string.h>struct st原创 2021-07-31 15:00:27 · 2459 阅读 · 6 评论