
C语言合集
文章平均质量分 74
本专栏是对于C语言学习的一些讲解和指导,本人并不是很有水平,但是仍然希望自己的作品能够得到大家的喜欢
Dream_Snowar
这个作者很懒,什么都没留下…
展开
-
[数据结构]排序
本篇主要是对常见排序的分类和一些排序的详解。原创 2024-04-01 21:53:07 · 1083 阅读 · 2 评论 -
[数据结构]oj二叉树的几道选择题
如果这棵树每一层都是满的,则它的深度最小,假设它为一个四叉树,高度为h,则这个数的节点个数为(4^h - 1) / 3,当h = 5, 最大节点数为341, 当h = 6, 最大节点数为1365,所以最小深度应该为6。由后序遍历确定子树的根,后序遍历从后向前看,最后一个元素为根,和前序遍历刚好相反,从后向前看后序遍历,应该是根,右,左,根据中序遍历确定子树的左右区间。通过前序遍历找到子树的根,在中序遍历中找到根的位置,然后确定根左右子树的区间,即根的左侧为左子树中所有节点,根的右侧为右子树中所有节点。原创 2024-03-31 22:19:17 · 835 阅读 · 0 评论 -
[数据结构]插入和希尔排序
插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。原创 2024-03-28 22:54:24 · 1099 阅读 · 3 评论 -
[数据结构]二叉树的层序遍历
设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。原创 2024-03-25 19:51:54 · 1055 阅读 · 4 评论 -
[数据结构]二叉树与递归OJ
上回我们手撕了一棵二叉树,并且通过递归完成了遍历,这回我们将深入理解用递归解决相关的二叉树问题,数量使用分治的思想.原创 2024-03-24 20:37:22 · 741 阅读 · 4 评论 -
[数据结构]二叉树的建立与遍历(递归)
首先我们拥有如下二叉树:要了解二叉树遍历,我们得先了解二叉树的三种遍历方式:前序遍历,中序遍历,后序遍历。原创 2024-03-24 19:27:08 · 797 阅读 · 0 评论 -
[堆的数据结构oj]找出一大堆数据中最大的前十个数
之后遍历10亿个数,把每个数与堆顶比较。遍历结束后,堆里面的就是最大的10个数。首先我们知道100亿个数char类型需要越40G的空间,如果我们通过排序来看,我们不难发现需要大量的时间。如果我们直接用堆排序,我们的速度就是N*logN所以我们的这种新方法效率明显高于堆排序。这道题是找N个数中最大的K个数,我们这个算法可以把效率提高到K+(N-K)*logK。这里我们来实验一下,先造10亿个数,然后找最大的前10个。1.我们可以建立一个堆存放10个数字,做小堆.如何在100亿个数据中找出最大的前10个数。原创 2024-03-23 20:34:52 · 312 阅读 · 0 评论 -
[数据结构]二叉树(下)
我们可以假设二叉树有N个节点,深度为h我们可以恒容易得到满二叉树每行的节点数,然后错位相减,算出节点与高度的关系。原创 2024-03-23 19:58:27 · 452 阅读 · 0 评论 -
[数据结构]堆
堆是一种完全二叉树的定义:完全二叉树的形式是指除了最后一层之外,其他所有层的结点都是满的,而最后一层的所有结点都靠左边。,从左到右连续。教材上定义如下:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。原创 2024-03-18 12:32:11 · 1081 阅读 · 0 评论 -
[数据结构]二叉树(上)
对于深度为K 的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对 应时称之为完全二叉树。但是我们发现这样子有个很大的问题,我们发现是不是有很多的空间开辟了确没有存放数据,造成了空间的浪费,如果缺的数据多的话,会造成大量的空间浪费。概念:一棵二叉树是结点的一个有限集合,由一个根节点加上两棵别称为左子树和右子树的二叉树组成(可以为空)。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继,因此,树是递归定义的。:一个节点含有的子树的根节点称为该节点的子节点;原创 2024-03-14 20:13:56 · 832 阅读 · 6 评论 -
[数据结构]OJ用队列实现栈
官方题解:https://leetcode.cn/problems/implement-stack-using-queues/solutions/432204/yong-dui-lie-shi-xian-zhan-by-leetcode-solution/首先我们要知道栈是一种后进先出的数据结构,元素从顶端入栈,然后从顶端出栈。队列是一种先进先出的数据结构,元素从后端入队,然后从前端出队。原创 2024-03-07 22:07:38 · 756 阅读 · 4 评论 -
[数据结构]OJ一道------用栈实现队列
每次 pop 或 peek 时,若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈,这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序。然后我们可以遍历IN栈,然后把存储的内容压入OUT栈,我们知道栈只能头插,所以我们在这些操作后会发现OUT栈和IN栈中数据的顺序颠倒了。然后是判断队列是否为空,这里我们可以直接判断两个栈是否是空的如果都是空的,则队列也是空的.因为我们知道队列只能头删,而OUT现在正好是颠倒的栈,对其尾删其实就是对输入的数进行头删。我们可以先创建栈,以及其相应的功能。原创 2024-03-05 20:40:58 · 528 阅读 · 7 评论 -
[数据结构]队列
只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有:进行插入操作的一端称为:进行删除操作的一端称为。原创 2024-03-05 19:29:54 · 406 阅读 · 2 评论 -
栈的OJ一小道-->Leetcode有效的括号
所以我们可以这样想,创建一个栈,当我们获得一个左括号时,我们将其放入栈,然后等出现右括号时,与左括号比较,如果不匹配就返回false,匹配就将这个符号出栈.反正我们只要记住,这道题我们乍一看可能会选择暴力遍历法,但这题我们可以选择栈,这样可以大大降低我们的时间复杂度.这题要求非常简单。如果检测到左括号则返回相应右括号,这样之后我们只需要让出现的右括号和栈顶的右括号比较就可以知道是否匹配了.那么我们就可以尝试实现代码了,但其实有一种情况,我们不需要遍历就能知道括号不匹配,那么是什么情况呢?原创 2024-03-04 19:20:39 · 422 阅读 · 0 评论 -
[数据结构]栈
一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出的原则。:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。:栈的删除操作叫做出栈。出数据也在栈顶。此图来源与网络这里我们可以比作肉串,我们先把肉串好,后串上的肉,是先吃的.原创 2024-03-03 20:10:27 · 573 阅读 · 0 评论 -
[数据结构]链表OJ--环形链表判断是否有环(快慢指针法)
当慢指针和快指针从链表上的同一个节点开始移动时,如果该链表中没有环,那么快指针将一直处于慢指针的前方;等到慢指针进入环时,由于快指针的速度快,它一定会在某个时刻与慢指针相遇,即套了慢指针若干圈。我们想可以考虑给的链表为空的情况,而且我们观察例子,我们可以看出存在只有一个头的没有下一个节点的链表,所以我门要对这两种情况进行判断。然后我们让指针跑起来如果最后有一个指针跑到NULL说明,这个链表没有环,如果快慢指针不相等就接着跑,知道两个指针相遇.说明有环。它默认给我们创建了一个链表,给了这个链表的表头的地址。原创 2024-03-03 19:13:20 · 384 阅读 · 0 评论 -
时间复杂度和空间复杂度
这里我们默认CPU的每个单元运行消耗的时间都是相同的。随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这称,记为O是什么呢?算法导论是这么写的:大O用来表示上界的,当用它作为算法的最坏情况运行时间的上界,就是对任意数据输入的运行时间的上界。那么我们怎么算呢?实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要1、用常数1取代运行时间中的所有加法常数。2、在修改后的运行次数函数中,只保留最高阶项。3、如果最高阶项存在且不是1。原创 2024-02-06 09:09:10 · 646 阅读 · 0 评论 -
[C语言]C语言实战项目------单链表通讯录
今天我们将用单链表的知识去完成一个通讯录。我们需要完成通讯录的增删查改以及通讯录每次写入的内容的存储和下次使用的导入。原创 2024-02-06 08:54:04 · 1224 阅读 · 0 评论 -
C语言实战项目<贪吃蛇>
我们这篇会使用C语言在Windows环境的控制台中模拟实现经典小游戏贪吃蛇 实现基本的功能: 结果如下:本次实现呢我们会用到一些Win32 API的知识(WIN32 API也就是Microsoft Windows 32位平台的应用程序编程接口):我们在C语言中可以用函数system来执行,入上面这两个,我们可以这么写:给坐标赋值:实例:这个结构体,包含有关控制台光标的信息 实例: 7)SetConsoleCu原创 2024-01-31 22:48:03 · 1036 阅读 · 2 评论 -
【数据结构】链表的分类和双向链表
本篇是基于上篇单链表所作,推荐与上篇配合阅读,效果更加。原创 2024-01-24 21:54:45 · 1500 阅读 · 2 评论 -
【数据结构】单链表
1. 链表的概念及结构上回我们一起学习了线性表中的顺序表,今天我们将一起来学链表中的单链表。1. 链表的概念及结构概念:链表是⼀种的存储结构,数据元素的是。链表的结构跟火车车厢相似,淡季时车次的车厢会相应减少,旺季时车次的车厢会额外增加几节。只需要将火车的某节车厢去掉/加上,不会影响其他车厢,每节车厢都是独立存在的,且每节车厢都有车门,你只能再火车上移动,车厢是独立存在的,只能从所以前面的车厢一节一节的往后走,从这节车尾到下节车头。在链表里,每节“车厢”是什么样的呢?原创 2024-01-23 20:07:24 · 1007 阅读 · 0 评论 -
[数据结构]顺序表
1、顺序表的概念及结构1、顺序表的概念及结构1.1 线性表线性表()是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储。案例:蔬菜分为绿叶类、⽠类、菌菇类。线性表指的是具有部分相同特性的⼀类数据结构的集合2、顺序表分类2.1顺序表和数组的区别。原创 2024-01-22 20:33:19 · 1255 阅读 · 1 评论 -
【C语言】预处理
当宏参数在宏的定义中出现超过一次的时候,如果参数带有副作用,那么你在使用这个宏的时候就可能出现危险,导致不可预测的后果。所以用于对数值表达式进行求值的宏定义都应该用这种方式加上括号,避免在使⽤宏时由于参数中的操作符或邻近操作符之间不可预料的相互作用。答案是肯定的,可以,但是这样做查找的效率就低些,当然这样也不容易区分是库文件还是本地文件了。2. 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。这里我们想想,写⼀个函数求2个数的较大值的时候,不同的数据类型就得写不同的函数。原创 2024-01-22 14:51:12 · 1413 阅读 · 0 评论 -
[C语言]编译和链接
在ANSI C的任何⼀种实现中,存在两个不同的环境。1)翻译环境:将源代码被转换为可执行的机器指令2)执行环境:实际执行代码。原创 2024-01-19 16:08:04 · 883 阅读 · 0 评论 -
【C语言】文件操作
文件名:⼀个文件要有⼀个唯⼀的文件标识,以便用户识别和引用。文件名包含3部分:文件路径+文件名主干+⽂件后缀例如:为了方便起见,文件标识常被称为文件名。我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存释放,数据就会丢失 ,等下一次次运行程序,是看不到上次程序的数据的,如果要将数据一直保存,我们可以使用文件。我们⼀般谈的文件有两种:程序文件、数据文件。程序文件:我们可能看到过一些文件后缀为.c .obj .exe等这些都是程序文件,.c是源程序文件,。原创 2024-01-18 22:03:45 · 958 阅读 · 0 评论 -
动态内存管理
这是如果结束时,要free需要将他们两个分别free释放,你自己肯定知道,但如果你是写给用户的那这就可能导致部分内存未释放,用柔性数组,可以让用户一个free就释放干净。有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时 候内存,我们⼀定会对内存的大小做灵活的调整。3.包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。3.这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间。原创 2024-01-17 23:34:47 · 840 阅读 · 0 评论 -
C语言内存函数
(在vs2022中memcpy可以处理重叠的内存,但这对于C语言并不规范,且对环境有要求,所以不推荐)总结:这节我们介绍了C语言内存函数,下节我们要学习C语言中相对重要的内容,动态内存开辟。如果source和destination有任何的重叠,复制的结果都是未定义的。• 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以。memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。• 比较从ptr1和ptr2指针指向的位置开始,向后的num个字节。原创 2024-01-17 22:38:28 · 479 阅读 · 2 评论 -
字符函数和字符串函数
这个头文件中说明的,C语言程序启动的时候就会使用⼀个全面的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会讲对应的错误码,存放在errno中,而⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。比较str1和str2的前num个字符,如果相等就继续往后比较,最多比较num个字母,如果提前发现不⼀样,就提前结束,大的字符所在的字符串大于另外⼀个。如果num个字符都相等,就是相等返回0.原创 2024-01-13 18:07:17 · 784 阅读 · 0 评论 -
qsort的使用
该函数不返回任何值,而是通过对数组的元素进行重新排序来修改所指向的数组的内容,如所定义的那样。此函数使用的排序算法通过调用指定的函数来比较元素对,并将指向元素的指针作为参数。对于可以使用常规关系运算符进行比较的类型,常规函数可能如下所示:compar。对 所指向的数组元素进行排序,每个元素的长度为字节,使用函数确定顺序。具体写法大家都看懂了吗,一样定义相关的函数,然后按照格式使用。本片主要讲的是qsort函数排序的使用,不讲解原理。关于字符串的函数我们讲完指针后就讲,这里我多解释。对数组的元素进行排序。原创 2023-12-19 18:53:12 · 85 阅读 · 10 评论 -
冒泡排序的理解
它的基本思想是对所有相邻记录的关键字值进行比较(也就是相邻的两个数进行比较),如果是逆顺(a[j]>a[j+1]),则将其交换,最终达到有序化。但是这么写真的好吗?第一轮排序排序后变成2 7 8 4 5 3 1 6 9我们确定了最大的数,并将其放在最后一位。上回我们介绍了指针,这里我准备插入一个排序,冒泡排序,也和我之后的快速排序的应用星辰对比。然后进行第二轮排序,但由于已经确定一位所以这次我们只要排8位。我们先创建一个数组,因为9>2所以9和2的位置交换,然后9>7所以9和7的位置。原创 2023-12-12 13:17:22 · 70 阅读 · 2 评论 -
指针的理解(3)与转移表计算机
今天我们要学习的内容为:1. 字符指针变量2. 数组指针变量3. ⼆维数组传参的本质4. 函数指针变量5. 函数指针数组。原创 2023-12-13 20:53:10 · 82 阅读 · 1 评论 -
指针与回调函数
时,被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用,且是在特定的事件或条件发生时由另外的⼀方调用的,用于对该事件或条件进性响应。如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被用来调用其所指向的函数。上回我们写了转移表计算器,我们可以用回调函数进行优化。将add,sub,mul,div放入一个函数calc。回调函数就是⼀个通过函数指针用的函数。我们也可以跟上次的对比一下。原创 2023-12-19 10:58:15 · 59 阅读 · 1 评论 -
指针的理解(2)
这次我们来进一步理解指针。上回我们学习了指针的基本内容和定义,这回我将要从以下几个方1.数组名的理解首先,我们都知道数组吧?数组,顾名思义,就是“存储数据的容器,保证多个数据的数据类型要一致,长度固定。我们呢?不是要讲数组,我们讲的是数组名,其实数组名是一个地址,是数组首元素的地址。运行结果如下:因此我们不难得出。但一定是这样吗?结果如下:是20,是不是很奇怪,前面才说数组名是首元素的地址,这里应该是4/8,怎么也不可能是20,对不对?原创 2023-12-11 20:12:48 · 83 阅读 · 3 评论 -
结构体的初步理解
3. 结构体传参。原创 2023-12-04 19:39:11 · 92 阅读 · 3 评论 -
大小端字节序和字节序判断
什么是大小端?原创 2023-11-28 19:48:25 · 79 阅读 · 2 评论 -
浮点数和整数在内存中的存储
在讲操作符时,我们就讲过了整数,,整数在内存中以补码的方式存储具体可见于。原创 2023-11-29 20:17:42 · 69 阅读 · 3 评论 -
Strlen的多种模拟实现方式
本篇章,只是对作业题目的总结,如有帮助,请多多支持!原创 2023-11-26 20:21:34 · 59 阅读 · 1 评论 -
指针的初步理解
指针变量是一种用来存放指针的变量就像就像存放整型数字的变量我们称为整型变量,那么存放指针的变量,我们就成为指针变量。int c = 0;//我们将0复制给c,c是整型变量。//我们把c的地址赋值给p,p是指针变量int* p1;//定义了指向整型的指针变量,指针变量的类型是:int*float* p2;//定义了指向浮点型的指针变量,指针变量的类型是:float*char* p3;//定义了指向字符型的指针变量,指针变量的类型是:char*这里都又“”这个符号,它说明p1,p2,p3。原创 2023-11-26 15:56:57 · 58 阅读 · 1 评论 -
位操作符的妙用
正常我们将一个字符转换成数字或者将一个数字转换成字符我们一般会根据ASCII码表+-‘0’,这里我将用一种很新的方法。最近考试周了,我现在才在百忙之中写(敷衍)博客,这回的内容基本都是整活,大家看个乐呵我也就满足了!这里我写下代码,具体过程不作展示了,详情可以看上一篇博客。这个很好理解我就不深入展开讲了,不懂的看我上一篇博客。因为a^a=0-,0^a=a,所以我们可以得到上式。依次右移在按位与上1,来输出。如果要将一个数乘以2。很简单我们只需要这样。原创 2023-11-21 15:09:51 · 80 阅读 · 0 评论 -
移位操作符和位操作符详解
今天我们重点学习了操作符中的一位操作符和位操作符,好好利用它们,将给我们带来不少便利。ps:最近考试周,好忙!原创 2023-11-14 20:44:58 · 115 阅读 · 0 评论