自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 c++入门

但在C++里,这样的定义容易引发一些类型不匹配等混淆情况,例如在函数重载场景中,如果有一个函数接受指针参数,另一个接受整型参数,传入 NULL 时就可能出现意外的调用结果。- 与宏的区别:虽然内联函数和宏( #define 定义的宏)在某些方面有相似之处,比如都可以让代码看起来像是直接嵌入的,但内联函数是真正的函数,遵循函数的语法规则,有类型检查等机制,而宏只是简单的文本替换,容易出现一些意想不到的错误(如没有类型检查、宏展开可能导致的优先级问题等),内联函数相对更安全、规范。

2024-11-29 23:12:21 994

原创 堆(c语言实现)

没有子节点的节点称为叶节点(leaf node)。这意味着除了最后一层外,其他每一层的节点都是满的,并且最后一层的节点从左到右依次排列。即根节点是整个堆中的最大值,并且沿着任意一条从根节点到叶节点的路径,节点的值都是递减的。即根节点是整个堆中的最小值,并且沿着任意一条从根节点到叶节点的路径,节点的值都是递增的。2. 二叉搜索树:左子树中的所有节点的值都小于根节点的值,右子树中的所有节点的值都大于根节点的值。1. 文件系统:文件系统中的目录结构可以用树来表示,根目录是树的根节点,子目录和文件是树的节点。

2024-10-28 10:22:25 337

原创 队列(c语言实现)

1. 先进先出(FIFO,First In First Out):就像排队买东西一样,先进入队列的元素先被处理。1. 任务调度:操作系统中可以用队列来管理等待执行的任务,按照任务到达的先后顺序进行处理。3. 广度优先搜索:在图的遍历算法中,用队列来存储待访问的节点,实现广度优先搜索。2. 消息队列:在分布式系统中,用于在不同组件之间传递消息,保证消息的有序处理。3. 查看队首元素(peek):获取队首元素的值,但不删除它。2. 只允许在队尾插入元素,在队首删除元素。四、队列实现(vs2019)

2024-10-26 16:47:34 244

原创 《C++求解地球可持续发展下的最大养活人数问题》

今天刷题时,引发了我的思考,在我们的日常生活中,资源的可持续利用是一个至关重要的问题。今天我们来探讨一个有趣的问题:假设地球上的新生资源按恒定速度增长,地球上现有资源加上新生资源可供一定数量的人生活特定的年数,那么为了实现可持续发展,地球最多能够养活多少亿人呢?后面又想到了,如果需要可持续发展,那每年地球新产生的资源就要大于等于人类消耗的资源,如果动用了原始资源,那就会每年多消耗一点,导致枯竭。所以原始资源是万万不能动用的。所以我得到了每年地球增长的资源=Z亿人的消耗的资源,就有了下图Z存在图中关系。

2024-10-26 00:07:16 238

原创 栈(c语言实现)

这是我的gitee账号链接,上面可能有大家需要的源码,需要自取。如果大家想自己也实现一下的话,我用的是编译器是vs2019。

2024-10-23 08:38:40 922

原创 双向循环带头链表

带头链表是指在链表的最前端有一个额外的节点(头节点),这个头节点不存储实际的数据,主要用于方便链表的操作,比如在表头插入或删除节点时不用特殊处理空链表的情况。双向链表是指链表中的每个节点不仅存储了下一个节点的位置(后继指针),还存储了前一个节点的位置(前驱指针)。这使得从链表的任何一个节点开始,既可以向前遍历,也可以向后遍历。双向循环链表是双向链表的一种特殊形式,它的最后一个节点的后继指针指向头节点,头节点的前驱指针指向最后一个节点,形成一个环形结构。

2024-10-23 08:12:31 902

原创 深入理解程序的编译(预处理操作)和链接

总之,程序的编译(预处理操作)和链接是一个复杂而又精细的过程,每个阶段都承担着特定的任务,共同协作将我们编写的源代码转化为能够在计算机上运行的可执行程序。- 定义宏函数: #define SQUARE(x) ((x) * (x)) ,可以实现类似函数的功能,但宏只是简单的文本替换,不会进行类型检查和参数传递等操作。链接器会将程序中使用到的库函数的代码合并到最终的可执行文件中。- 链接器会查找目标文件中引用的外部符号(如函数和变量),并在其他目标文件或库中找到它们的定义,建立正确的引用关系。

2024-10-20 22:51:03 333

原创 单链表(c语言简单实现)

2. 插入和删除操作高效:在特定位置进行插入和删除操作时,只需修改指针,时间复杂度为 O(1)(在头部或尾部插入/删除)或 O(n)(在特定位置插入/删除,n 为链表长度)。- 特定位置插入:先找到目标位置的前一个节点,然后进行插入操作个节点,然后进行插入操作。- 头部插入:操作简单,只需将新节点的指针指向原链表的头节点,然后更新链表头指针。- 首先找到要删除节点的前一个节点,然后将其指针指向要删除节点的下一个节点。1. 插入节点:可以在链表的头部、尾部或特定位置插入新节点。单链表是一种常见的数据结构。

2024-09-20 20:56:58 342

原创 顺序表(c语言实现)

3. 插入和删除操作可能比较耗时:在中间位置插入或删除元素时,需要移动大量后续元素以保持连续性。1. 随机访问:可以在常数时间内访问特定位置的元素,例如,通过下标可以快速找到对应元素。通常使用数组来实现顺序表。2. 当数据规模相对稳定,且不需要频繁进行插入和删除操作时,顺序表是一种高效的选择。2. 存储密度高:不需要额外的指针来链接元素,所有空间都用于存储数据本身。顺序表是一种数据结构,它在计算机内存中以连续的存储位置来存储数据元素。1. 适合频繁进行随机访问的情况,如查找特定位置的元素。

2024-09-16 23:22:29 276

原创 算法的时间复杂度和空间复杂度

对数时间复杂度 O(log n):算法执行的时间与输入数据的大小呈对数关系。例如,二分查找算法。- 线性时间复杂度 O(n):算法执行的时间与输入数据的大小呈线性关系。例如,遍历一个数组。- 线性对数时间复杂度 O(n log n):常见于一些高效的排序算法,如快速排序和归并排序。- 平方时间复杂度 O(n²):算法执行的时间与输入数据的大小的平方呈正比关系。例如,冒泡排序算法。- 立方时间复杂度 O(n³)及更高:算法执行的时间与输入数据的大小的立方或更高次方呈正比关系。

2024-09-09 07:22:53 465

原创 数据结构的简单认识

在设计算法时,需要考虑算法的时间复杂度和空间复杂度,以确保算法的效率和可行性。不同的数据结构具有不同的特性和操作方式,为算法提供了不同的存储和组织数据的方式。例如,在排序算法中,如果对大量数据进行排序,选择合适的数据结构(如数组或链表)以及相应的排序算法(如快速排序、归并排序等)可以大大提高排序的效率。例如,在图的最短路径问题中,需要使用图这种数据结构来表示问题中的节点和边的关系,然后采用合适的算法(如 Dijkstra 算法或 Floyd 算法)来求解最短路径。反过来,算法的需求也推动了数据结构的发展。

2024-09-04 15:17:01 678

原创 c语言中文件操作和相关函数

在计算机领域,文件是存储在某种存储介质(如硬盘、闪存等)上的具有名称的一组相关数据的集合。一、文件的组成部分1. 数据内容- 文件包含实际的信息,可以是文本、图像、音频、视频、程序代码等各种形式的数据。- 例如,一个文本文件可能包含一篇文章、一份报告或一段程序代码;一个图像文件则包含像素数据,用于表示图像的颜色和形状。2. 文件名- 用于唯一标识一个文件。文件名通常由字母、数字、下划线和其他特殊字符组成,但不能包含某些特殊字符(如斜杠、反斜杠、冒号等)。

2024-09-03 22:46:42 1199 1

原创 c语言中的动态内存管理

功能: calloc 函数用于在内存的动态存储区中分配 n 个长度为 size 字节的连续区域,并将分配的内存初始化为 0。它接受一个参数 ptr ,这是一个指向要释放的内存块的指针。1. 确保只释放已分配的内存:传递给 free 的指针必须是由动态内存分配函数返回的有效指针,否则可能会导致未定义的行为。- 表现:申请了动态内存但没有在合适的时候释放,导致内存资源一直被占用,随着程序的运行,可能会耗尽系统。表现:指针指向的内存被释放后,指针没有被置为 NULL 或重新赋值,继续使用该指针会导致未定义行为。

2024-09-02 11:02:17 900

原创 c语言中自定义类型

在这个联合体中,如果 int 通常占用 4 个字节, float 通常占用 4个字节,而 char 占用 1 个字节,那么这个联合体的大小将是 4 个字节,因为 float/int 是其中最大的成员类型。4. 如果嵌套了结构体,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。在 C 语言中,联合体(union)是一种特殊的数据类型,它允许在同一内存空间存储不同的数据类型,但在同一时刻只能存储其中一种类型的值。

2024-09-01 22:10:19 1124

原创 结构体内存对齐(sizeof(结构体)大小的求解)

c2 是 1 字节,可放在 i 后面的任意地址,但为了满足结构体总大小是最大对齐数(4)的整数倍这一规则,结构体 s1 的总大小需要是 4 的整数倍,4+4+1=9,找到最小的4的倍数,所以 c2 后面会填充 3个字节的空白,使得结构体 s1 的大小为 12 字节。这表明了,一个结构体的里面的类型相同,不同顺序的排列,也会使开辟的空间大小不同。4. 如果嵌套了结构体,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。

2024-07-17 23:51:18 493

原创 模拟strstr库函数

"中的起始位置是 7。在 C 语言中, strstr 函数用于在一个字符串中查找另一个字符串首次出现的位置。5. 如果在比较过程中出现不匹配的字符,就将主字符串的指针向后移动一位,重新开始比较。1. 首先,定义一个函数,接受两个字符串指针作为参数,分别表示主字符串和子字符串。4. 如果当前字符匹配,就继续比较后续的字符,直到子字符串的所有字符都匹配成功。3. 从主字符串的开头开始,每次将主字符串的当前位置与子字符串的开头进行比较。6. 如果子字符串的所有字符都匹配成功,返回主字符串中匹配开始的位置指针。

2024-07-13 23:56:25 473

原创 模拟strcmp库函数

如果 str1 小于 str2 , strcmp 函数返回一个负数;如果 str1 大于 str2 , strcmp 函数返回一个正数;它的作用是比较两个字符串的大小。其函数原型为 int strcmp(const char *str1, const char *str2)。比较的规则是按字典顺序对两个字符串自左至右逐个字符进行比较(按照 ASCII 码值大小),直到出现不同的字符或遇到 '\0' 为止。strcmp 是 C 语言标准库中的一个字符串比较函数。

2024-07-13 00:24:52 147

原创 strlen函数的相关计算

而 strlen(*arr) 、 strlen(arr[1]) 、 strlen(&arr) 、 strlen(&arr + 1) 等用法是不正确的,可能会导致未定义的行为或错误的结果。strlen 的功能是计算一个指定字符串的长度,函数原型为 size_t strlen(const char *s) ,它会从字符串的首地址开始向后遍历,直到遇到第一个空字符 '\0' 停止,并返回遇到 '\0' 之前的字符个数。strlen 函数返回的是字符串的长度,其单位是字符个数。

2024-07-10 23:48:09 520

原创 sizeof的计算

a + 0 的类型是指向整数的指针,指针大小通常为 4 字节(32 位系统)或 8 字节(64 位系统)(这里a不是单独在sizeof里面,加了一个0,所以这里的a可不能看成整个a的大小,要看成首元素的地址,地址加0,还是地址)// 输出 16,因为数组 a 的大小为 4 个整数,每个整数 4 字节,共 16 字节,补充一点,数组名是首元素地址,但是和sizeof搭配使用时,数组名代表整个数组(单独搭配哈),所以求出也是整个数组的大小,这个点不懂得,可以看我的文章中,名叫数组名的理解的文章。

2024-07-10 00:07:52 423

原创 C语言中的库函数qsort(回调函数的范例)

在上述示例中, intCompare 函数定义了整数的比较规则, qsort 函数根据这个规则对数组进行排序。- compar :指向比较函数的指针,用于确定排序的顺序。在 C 语言中, qsort 函数用于对数组进行快速排序。// 根据比较规则返回负数、0 或正数。- base :要排序的数组的起始地址。// 负数表示 a 排在 b 之前。// 正数表示 a 排在 b 之后。// 0 表示 a 和 b 相等。- nmemb :数组中的元素数量。// 比较函数,用于按升序排列整数。

2024-07-08 00:22:01 195

原创 函数指针和回调函数

将一个函数的指针作为参数传递给另一个函数,当特定的事件或条件发生时,接收这个指针的函数就可以通过指针调用被传递进来的函数,这个被传递进来的函数就是回调函数。函数指针在很多场景中非常有用,比如实现回调函数、动态选择要执行的函数等,能够增加程序的灵活性和可扩展性。简单来说,回调函数就是由你自己定义,但不是由你来调用,而是由系统在特定条件下自动调用的函数。使用函数指针时,需要先将其指向一个具体的函数,然后通过指针来调用函数。在 C 语言中,函数指针是一种特殊类型的指针,它指向一个函数。那接下来说一下回调函数。

2024-07-07 23:56:08 213

原创 指针数组和数组指针

对它取地址,取的是整个数组的地址(这个地方不懂可以看看我前面说的数组名的理解的那个地方),那取出来的地址,存放指针变量中,该怎么表示呢,我们知道arr的类型是int [10],你会不会就想直接int [10] *,按理解确实该这样,但是,不是呢,规定应该是int(*变量名)[10]。再介绍这个之前,我们回顾一下指针,指针是一个变量(一个存放地址的变量,比如存放一个int的变量,指针类型就是int *),所以就有整型指针,字符指针等等,同理数组指针就是存放数组的地址的变量。数组是同一个类型的数的集合。

2024-06-22 02:56:36 232

原创 整型和浮点数在内存中的存储

对于 11 位的 E,这个中间数是 1023。根据乘2取整法,将小数部分乘以2,然后取整数部分,剩下的小数部分继续乘以2,然后取整数部分,剩下的小数部分又乘以2,一直取到小数部分为零为止。因为这里是正的1,(正数原码,反码,补码相同),(负数原码,反码=原码符号位不变,数值位(其他位)按位取反,补码=反码+1)- 对于64位的浮点数,最高的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M。- 对于32位的浮点数,最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M。

2024-06-05 20:08:34 877

原创 冒泡排序算法(升序为例)

从数组的开头开始,依次比较相邻的两个元素,如果前一个元素大于后一个元素,就将它们交换位置。这样一趟比较下来,最大的元素就会出现在数组的末尾。然后对除了已排好的最大元素之外的其他元素继续进行这样的操作,经过多轮比较交换,最终使整个数组按从小到大(或从大到小)的顺序排列。每一轮比较后,参与比较的元素范围会逐渐缩小。虽然算法简单直观,但效率相对不是特别高。如果这个代码本来就是升序的,那flag就不会被改变,直接跳出循环,所以节约时间,提高效率。例如上述代码,就要执行很多次,所以优化了一下。

2024-06-03 22:38:45 278

原创 在 C 语言中,“static”主要修饰的两种情况:

我们都知道,在一个函数中的局部变量,调用时创建,出来就销毁了。如上图中test函数中的a,如果没有加上关键字 static,调用完就销毁a,那就是每次调用都是新创建,所以下面代码就会打印10个6。但是,加上static,a就不会被销毁,打印结果为 6 7 8 9 10 11 12 13 14 15。- 静态局部变量:在函数内定义,它的值在整个程序运行期间都保持存在,并且只在该函数内可见。- 静态全局变量:限制该变量只能在定义它的源文件内使用,其他源文件不能直接访问。

2024-06-03 09:51:49 286

原创 写一个函数返回二进制中1的个数

版本一里讲的内容就是我觉得的奇妙解法t&(t-1)可以达到一个使二进制最右的1消失,原理就是当t=11111100时,t-1就会把最右边的1借走,变为(11111011),然后按位&,最右边的1就消失了,所以截止条件就是当这个二进制一直与它-1的二进制按位与时,赋值结果为0停下。比如二进制数 1010,从右往左依次为 0 乘以 2 的 0 次方、1 乘以 2 的 1 次方、0 乘以 2 的 2 次方、1 乘以 2 的 3 次方。所以我们第一想到的就是移位(左移和右移)➕按位与&(有0为0,全1为1),

2024-06-01 10:10:41 154

原创 整型提升(表达式求值)

00000101➕01111111,得到10000100,打印的时候,char c3要按照%d(有符号整型类型打印),就要用上整型提升(从8个比特位变为32个比特位的01序列),其他位不变,符号位补全,转换为1111111111111111111111111110000100(补码),正数的原码反码补码都相同,负数的反码由原码按符号位不变,其他数值位按位取反( 0变1,1变0),补码由反码➕1。这里介绍两个概念,以防初识得宝子们,看不懂我在说啥,比如1+1,+就是操作符,它左右的两个1就是它的操作数。

2024-05-31 15:54:32 367

原创 数组名的含义

我们知道按照原来的讲法,数组名是首元素,arr就是一个地址,地址的大小是看在不同地址线的,只有4或者8两种结果,如果是首元素便不成立,所以这里的数组名表示整个数组,计算的也是整个数组的大小。今天分享一下数组名的含义,在学习c语言时,我们总是会听到老师说,数组名是首元素地址,但是,有一些特殊情况下,它并不是这样的。第六个打印➕1,跳过整个数组(40个字节)。所以,&取地址,取出来的整个数组的地址。第三个打印,arr[0],也是首地址。第一个打印,是arr是数组名首地址。第五个打印&arr,也是首地址。

2024-05-31 15:08:57 269

原创 2023年5月31日-getchar

但是你会发现当你输入A时,输出的是a*,接下来告诉你们为什么会这样,当我们写一个字符进去时,都会敲一个回车让它跑起来,而getchar获取字符时,它不是直接从键盘获取的,而是在一个输入缓冲区的地方拿字符,我们敲A进去的同时,也敲了\ n,回车就是\ n,当我们的代码执行时,第一次getchar拿掉了A ,然后缓冲区中还有\ n,然后现在循环再上去,缓冲区里还有\ n,\ n的ASCII码加32就是*的ASCII码,所以为了解决这个问题我们应该。由于ASCII码里大写字母转换为小写字符,是大写的值加32,

2023-05-31 19:44:18 61

原创 2023年5月23-扫雷

今天分享一下扫雷,我的想法是用两个数组来处理,但是你也可以用一个数组,但是雷和非雷位置,和统计出来的信息就要放在一个数组中,比较冗余,所以我这里采用两个数组,并且两个数组一样大。改进的地方就是点到一个非雷的位置,周围8个坐标也没有雷,它会展开一片,然后再以周围的八个坐标再展开,直到周围八个坐标存在雷,但是我展开,你是我的周围坐标,你展开,我是你周围坐标,这样就会存在死递归问题,所以记得标记已经排查过的坐标。如果想要代码可以打开这个链接https://gitee.com/tgxqqcom/

2023-05-24 00:04:12 74

原创 c语言-三字棋

今天分享一下我写三字棋比较好的地方,我判断输赢的哪里,返回的值就是下的最后一个棋,这样就不用特别麻烦,还有棋盘的行和列,用的是宏定义,如果后期想把棋盘改一大一些,都不用改太多的地方。需要改进的地方就是判断输赢的判断行列,对角线那个地方,最好可以由前面的宏定义行列控制,我的直接用的固定值,想改进的可以试试,还有电脑也可以搞得智能化一些比如堵一下。

2023-05-21 18:56:32 91 1

原创 初识递归思想及递归函数

以上两条限制条件,都是因为我们的栈空间是有限的,我们每次调用函数,形参都会开辟空间,递归函数又是要拿到最里面的结果在返回次内层的函数,导致无限下去,栈就会因为放不下,出现栈溢出。我们知道最大的一位数是9,所以当等于9的时候,我们就可以不继续调用递归了,所以这里就把9作为限制条件。这里我就写一下递归函数,主函数的调用,你们就自己来吧。今天来分享一下递归函数吧,递归函数就是自己调用自己的函数,但是它要能正常使用,它便有两个限制条件。1,存在极限条件,当满足这个极限条件,递归便不再继续。

2023-05-13 00:56:37 60

原创 switch语句

/这里switch后面的整型表达式3。会跳到case3:这里开始执行,由于我这里没有break;所以想实现真正的分支,就要加上break语句,然后这里为了格式好看,我们一般把default放最后,但是你也可以这样。//这种情况就是上面都不满足,所以要执行的。今天给大家分享一下,switch语句,它的基本格式是这样的。愿我的分享对你有点用,而别人的分享对我有点用。case 整形表达式的结果:,后跟语句,case 整形表达式的结果:,后跟语句,case 整形表达式的结果:,后跟语句,

2023-04-30 08:23:15 46

原创 分支语句(单分支和双分支)

表达式为真,执行语句1,表达式为假, 执行语句2,切记else后面不需要再跟反 表达式的。第三种就是当满足表达式1,就执行语句1,若表达式1不满足,就试试表达式2,那个表达式为真,就执行它后面的语句。表达式为真,执行语句,表达式为假,不执行。希望我分享的分支语句,大家可以用的上。else if (表达式2)else if(表达式3)今天来介绍一下分支语句,2,if(表达式1)3,if(表达式1)

2023-04-13 19:56:28 170

原创 逗号表达式

有这样一个表达式d=( a= b+3,b=c+a, c=5-b),它就是一个逗号表达式,逗号表达式是从左往右计算的,比如这里a= b+3,由于b=4,所以a=7,那求b= c+a时,a 用的值便是7,在之前,我一直以为用初始值,所以学习永远都需要谦虚,b=5+7=12,那c=5-12=-7,所以整个表达式的值是-7,d=-7,这时候你打印a,b, c的值时,它也是随之变化的,a=7,b=12,c=-7,希望这篇文章可以对你们学习逗号表达式有用。

2023-04-08 18:24:56 117

原创 条件运算符

当a=3, b=4时,( a>b)?1:3,此时这个表达式结果就是3,在这种比较两个数大小时,是不是这种表达方式就比if …else语句代码来的简短精练些,但是具体问题,具体分析。当exp1是真时(条件成立),则整个表达式的结果为exp2。当exp1是假时(条件不成立)则整个表达式的结果为exp3。它的格式为exp1?exp2:exp2,我今天学习了c语言中的条件运算符,

2023-04-07 23:35:44 46

原创 简单认识c语言的概念

今天初识了c语言,知道c语言是一门计算机语言,和它一样属于计算机语言的还有java, c++等等,c语言提供了许多低级处理功能,还有很好的跨平台性,二十世纪八十年代,美国国家标准局为c语言制定一套标准语法,称为ANSIC,目前c11是第三个官方标准,也是c语言的最新标准,c语言是面向过程的语言。数据类型有char, short,int, long,long long,float, double及其大小。由于生活有许多事物是变化的,有一些是不变的,所有有了变量和常量。而编译器主要有Glang, MSVC。

2023-03-30 18:07:13 68

空空如也

空空如也

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

TA关注的人

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