自定义博客皮肤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)
  • 收藏
  • 关注

原创 数据结构:树(3)【二叉树链式结构实现】【二叉树的前序,中序,后序遍历】【求二叉树全部结点个数】【求二叉树叶子结点个数】【求二叉树的深度】【单值二叉树】

二叉树的链式结构的实现相对于顺序结构的实现就没有那么多的讲究了。就是普通的链表,只不过多了一个指向的指针。我们其实就可以直接简单的手搓一个链式结构的二叉树了。然后就可以弄成二叉树了:逻辑结构就是这样的:这里链式结构比较简单,就不过多的介绍了。主要是后面的遍历,那些题目需要用到递归思想,有些难。

2024-05-23 14:39:06 525

原创 数据结构:树(2)【堆排序】【堆排序的时间复杂度】【topk】

之后的就是什么说的为什么上面代码for循环里的i等于(n-1-1)/2。其实这句话的意思就是从第一个非叶子节点开始向下调整。比如上图中的,如果要调整的话,我们就会从30这个数的位置开始调整。n代表堆里有多少个数据,n-1就是最后一个节点的下标,n-1-1除以2就是最后一个节点的父亲节点,然后在进行向下调整。

2024-05-21 20:07:41 437

原创 数据结构:树(1)【树的概念及结构】【二叉树的概念及存储结构】【二叉树的顺序结构及实现】

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。我们所看到的最上方的那个节点称为根结点,根节点没有前驱结点除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继注意:在子树中,子树之间不能有交集。否则就不是树形结构。关于树的一些名词大家还是要了解一下的。结点的度。

2024-05-17 21:38:32 813

原创 栈与队列OJ题【括号适配问题】【用队列实现栈】【用栈实现队列】【设计循环队列】

这一道题我们就可以用栈来解决:不了解栈的可以看我的上一篇博客。这个题主要需要注意的地方就是我们入栈入的都是左括号,右括号就单独的一个一个的与栈里的左括号相匹配。总的来说不算难,就是让我们了解一下栈的应用。

2024-05-13 22:51:20 273

原创 数据结构:栈和队列

栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除的一端称为栈顶,另一端称为栈底。栈里的元素遵循后进先出的原则。简单的说就相当于一个羽毛球筒,我们把羽毛球放进羽毛球筒,当我们想要把羽毛球一个一个的拿出来,那么我们第一个放进去的羽毛球就是我们最后拿出来的。

2024-05-10 21:00:58 746

原创 链表OJ:【环形链表】【环形链表二(找环形链表的头)】【随机链表的复制】

简单的说一下这个题要表达的意思,其实就是判断我们的链表里有没有环形。这种链表我们是不能遍历的,因为我们判断出循环的条件是为NULL,用这个条件的话会导致死循环。解决这个题的思想就是要清楚如果是环形我们需要什么条件(因为我们都是在一个圆圈里面循环的走,用快慢指针一直在圆圈里面转圈,如果存在相等那么这个链表就存在循环链表)。在这里给大家画个图:这里的直线就代表不是环形链表的一部分,圆就代表是环形链表的一部分。

2024-04-30 18:29:22 960 2

原创 项目实践:贪吃蛇

Windows这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外,它同时也是⼀个很大的服务中心,调用这个服务中心的各种服务(每⼀种服务就是⼀个函数),可以帮应用程序达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序(Application),所以便称之为Application Programming Interface,简称 API 函数。WIN32 API也就是Microsoft Windows 32位平台的应用程序编程接口。

2024-04-20 23:03:04 1054

原创 游戏实践:扫雷

虽然很多人玩过这个游戏,但还是介绍一下。在下面的格子里,埋的有10颗雷,我们通过鼠标点击的方式,点出你认为不是雷的地方,等到把所有没有雷的格子点完之后,及视为游戏胜利。上面的数字的意思就是它的一圈的格子有几颗雷。明白了游戏的玩法,那么我们就可以来写一下这个游戏。

2024-04-15 21:13:33 857 2

原创 数据结构:双向链表

最常用的链表就是单链表和双向链表。我们首先要知道,链表有八种分类。单链表是不带头单向不循环链表。而此篇博客要讲的是带头双向循环链表。结构如下:注意:带头链表里的头节点,实际为“哨兵位”,哨兵位节点不存储任何有效元素,只是站在这里“放哨的”。它存在的意义就是遍历循环链表避免死循环。我们所说的双向链表为空,跟单链表不同,双向链表就是只存在哨兵位。双向链表的实现就比单链表简单的多了。

2024-04-13 19:33:22 597 1

原创 单链表的一些练习【移除数组元素】【反转链表】【链表的中间节点】【合并两个有序链表】【约瑟夫问题】【分割链表】

下面是三种测试结果,分别对应三种情况: 这个就是需要单独判断一下传参过去的链表为NULL的情况。然后通过三个指针的移动来实现链表的反转。四.合并两个有序链表五.环形链表的约瑟夫问题 六.分割链表 做完这些题关于链表的知识我们基本上也有了一定的认识。感谢大家的观看,如有错误,请大家多多指出。

2024-04-12 22:52:05 479 1

原创 数据结构:单链表

因为我要改变第一个结点的指针,所以我们要用二级指针来改变它(如果用一级指针的话,在函数中会创建一个指针叫pphead,我们在之后给pphead赋值的时候,改变的就只是pphead,pphead指向了新节点,而不是我们真正的头结点)。提醒一下,后面在找尾的时候,其实就不需要用到二级指针了,因为我们进行的尾插操作,不再需要改变头节点,此时我们改变的是结构体内部的数据next。上面的*pphead=NULL的操作,如果是一级指针,我们只把pphead置为NULL了 ,而原来指向的头结点的指针没有置为NULL。

2024-04-10 21:59:01 1712 3

原创 题目:【序列中删除指定数字】【变种水仙花数】【数组串联】【交换奇偶位】【offsetof宏的实现】

(((s*)0)->m)),我们知道&的作用是拿地址,拿到的是相较于0号地址->m的地址(m的地址号其实就是偏移量,所以我们下面就需要一个强转的东西)。0000 0000 0000 0000 0000 0000 0000 1101我们就需要把奇数位给提取出来,这里我们需要用到&操作符。得出来的结果就是 : 0000 0000 0000 0000 0000 0000 0000 1000。得出来的结果就是 : 0000 0000 0000 0000 0000 0000 0000 0101。

2024-04-07 22:10:50 667 1

原创 数据结构(顺序表)

顺序表是线性表的一种。线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储。案例:蔬菜分为绿叶类、瓜类、菌菇类。线性表指的是具有部分相同特性的⼀类数据结构的集合 如何理解逻辑结构和物理结构?

2024-04-05 16:21:39 1222

原创 预处理详解

define reg register //为 register这个关键字,创建⼀个简短的名字;) //⽤更形象的符号来替换⼀种实现,这里是把forever定义为了一个死循环的for循环,以后在使用的时候这就是一个死循环case //在写case语句的时候⾃动把 break写上。// 如果定义的 stuff过⻓,可以分成⼏⾏写,除了最后⼀⾏外,每⾏的后⾯都加⼀个反斜杠(续⾏符)。在进行预编译的时候,#define定义的东西会被完全替换掉。

2024-04-04 22:09:03 1565

原创 编译和链接

我们平时写的所有的代码,其实都是文本信息,我们的代码是不能直接执行C语言代码的,计算机所能执行的是二进制的指令。想让计算机读懂我想要干什么,就需要把我们写的代码转化为二进制的指令(就是编译器的作用)。

2024-04-03 22:14:58 1444

原创 文件操作(2)【文件的随机读写】【文件读取结束的判定】

这个函数可以根据文件指针的位置和偏移量来定位文件指针(文件内容的光标)。当我把第一个字符a给读取出来后,光标就移动到了b的位置,但是我这里使用了fseek,SEEK_CUR是从当前位置开始,偏移量为4,直接走到了f这里。如果是用另外两中的话,只需要改变偏移量就可以随便读取我们想要的地方。

2024-04-02 16:00:00 780 1

原创 文件操作(1)【文件打开和关闭】【文件的顺序读写(各种函数)】【sprintf和sscanf的理解】

在程序设计中我们一般谈的文件有两种:程序文件和数据文件。

2024-04-01 12:54:02 796

原创 动态内存管理【malloc,calloc,realloc和free的理解】【柔性数组的概念】

当我们在申请空间后,不再用这块空间了,虽然,当程序结束的时候,操作系统会回收这一块空间,但最好是我们主动去用free释放,尽量做到谁(函数)申请的空间谁释放。因为如果我的这块空间一直不退出的话这一块内存就一直被占用着,谁也用不了。如果不能释放,要告诉使用的人,要记得释放。

2024-03-30 15:29:05 1216 1

原创 自定义类型:【联合体和枚举】

联合体像结构体一样,也是有一个或者多个成员组成,当然也可以不同的类型。但不同的是,比编译器只为最大的成员分配足够的内存空间,所有成员共用同一块内存空间。所以联合体也叫做:共用体。联合体与结构体最不同的是,给联合体里的一个成员赋值,其他的成员也会随之变化。联合体的声明其实也跟结构体大体一样其实就是把struct给换成了union。

2024-03-29 22:21:21 946 1

原创 自定义类型:【结构体】

位段,位段。这个位其实指的就是二进制位,关于位段先介绍几点需要注意的地方。1.位段的成员必须是int,unsigned int或signed int,在C99中位段成员的类型也可以选择其他类型。2.位段的成员名后面有一个冒号和一个数字(这个数字指的就是有多少个二进制位,也就是多少bit位)。int b : 5;int c : 10;int d : 30;我们知道一个整型是有四个字节的,32个比特位。

2024-03-28 21:16:58 1153

原创 数据在内存的存储(2)【浮点数在内存的存储】

根据根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V都可以存储为这样的形式:(1)(-1)^S表示符号位,当S为0时,V为正数;S为1时是负数。(2)M表示有效数字,M是大于等于1,小于2的(3)2^E表示指数位。举个例子:比如5.0,写成二进制是101.0,相当于1.01*2^2。则S=0,M=1.01,E=2.比如-5.0,相当于-1.01*2^2。则S=1,M=1.01,E=2.

2024-03-26 16:00:00 977

原创 数据在内存里的存储(1)【整数在内存中的存储】【什么是大小端】

在超过一个字节的数据在内存中存储的时候,就会出现存储顺序的问题。按照顺序,我们就会有大端字节序存储和小端字节序存储。这里可以看到,我给a的值是0x11223344。但是在内存中这个方向就完全反了过来。变成了44332211。这个就是我们说的小端字节存储。小端字节序存储:把一个数据的低位字节的内容存储到低地址处,而高字节的的内容存储到高字节处。大端字节存储:把一个数据的高位字节的内容存储到低地址处,而低字节的的内容存储到高字节处。大小端存储跟计算机架构有关。我用的是vs2022,用的是小端存储。

2024-03-25 16:00:00 546

原创 C语言内存函数(2)【memset函数的使用】【memcmp函数的使用】

这个函数有三个参数。这个函数的作用是设置。我就简单用代码来试一下这个函数的作用。这里主要要注意的是,这里的5是以字节为单位的。所以用这个函数来设置整型是做不到的,因为整型有四个字节。比如这个代码的结果不是我们期望的那样。那么这个函数大家可能就了解了用法,我们再来看一个函数。

2024-03-24 16:00:00 305 1

原创 C语言内存函数(1)【memcpy函数的使用与模拟实现】【memmove函数的使用和模拟实现】

关于内存函数有四个函数需要我们学习。分别是memcpy,memmove,memset和memcmp。都在头文件string.h里面。

2024-03-23 20:49:36 1167 1

原创 字符串函数(3)【strstr函数的使用与模拟实现】【strtok的使用】【strerror的使用】

这个函数是一个查找函数,比如在一个字符串中查找另一个字符串是否出现。也是有两个参数这个函数返回的是字符串str2在字符串str1中第一次出现的位置。可以写一个代码来看一下。这个输出的最终结果是is is an apple。这里还要提一下,如果str1里没有符合的字符串,那就返回一个空指针。

2024-03-21 16:00:00 1809 1

原创 字符串函数(2)【strcat的使用和模拟实现】【strncat的使用】【strcmp的使用和模拟实现】【strncmp的使用】

关于这个函数,跟strcpy函数一样,都是有两个参数,源字符串和目的地字符串。简单的说这个函数的作用就是在目标字符串后面追加字符串。有几点也需要注意。(1)源字符串必须以'\0'结束(2)目标字符串中也要有\0,否则没办法知道追加从哪里开始。(3)目标空间必须足够大,能容纳下源字符串的内容(4)目标空间必须可以修改。我先简单实现一下这个函数。这个最终的输出结果就是helloworld。这个主要就是注意一下两个字符串末尾都必须要有\0。

2024-03-20 16:00:00 1393 1

原创 字符串函数(1)【strlen的使用和模拟实现】【strcpy的使用和模拟实现】【strncpy的使用】

我先简单介绍一下strlen的功能和返回值,我们知道,字符串以'\0'为结束标志,(1)而strlen统计的是'\0'之前的所有的字符个数。(2)注意strlen的返回值是sizeof_t类型,是无符号的(3)strlen的实现必须包含头文件string.h。关于这strlen有很重要的点需要注意,先给大家看一个代码。这串代码的最终打印出来的是>,这里明明是3减去6为什么最终结果是大于呢?

2024-03-19 16:00:00 765 1

原创 深入了解指针(3)【数组指针变量】【函数指针变量】【typedef关键字】

说到数组指针,那必然要说一下指针数组,指针数组是什么呢?指针数组是一种数组,只不过这种数组存放的是地址(指针)。那把这两个词反过来,数组指针是什么?它是指针变量,还是数组?答案是:指针变量。这个指针有些特殊,它存放的是数组的地址,它是能够指向数组的指针变量。思考一下 int* p1[10] 和 int(*p2)[10]分别代表的是什么。int* p1[10]这里的p1是指针数组,有十个元素,每一个元素都是指针。p2是指针变量,指向的是一个大小为十个整型的数组。

2024-03-18 18:27:34 1137

原创 深入了解指针(2)【指针与数组】【二级指针】

关于数组,我在上次的博客中也提到了一些比较重要的知识点。首先就是数组名,数组名只有在两种情况下代表的是整个数组的地址,一个是在sizeof里面,一个是用&符号。那么为什么我们可以用指针来访问数组呢?因为数组在内存中是连续存放的,只要我们找到第一个地址,那么后面的地址不也是手到擒来的吗。我们先想一个简单的代码,先假设有一个数组a[10],这个数组的元素让我们去输入,而我想要把这十个元素按照顺序依次输入,是不是一下就可以想到咱们可以用for循环,创建一个变量i,依次递增很轻松就能写出这样一个代码。

2024-03-16 17:13:34 1045 1

原创 assert断言

assert接受一个表达式作为参数,如果表达式为真,assert不会有任何作用,程序会继续运行。如果已经确定程序没有问题,不需要在做断言,就在#include<assert.h>前面加上#define NDEBUG。如果程序又出现了问题,把#define NDEBUG注释掉,就相当于重新启用了assert()。assert是一个库函数,它的头文件是assert.h,用于在运行时确保程序符合指定条件,如果不符合,就会报错终止运行。但也是有缺点的,因为引入了额外的检查,增加了程序的运行时间。

2024-03-11 15:30:00 445

原创 【const修饰指针】【指针运算】【野指针】深入了解指针(1)

大家知道,变量是可以修改的,如果我们把变量的地址交给一个指针变量,我们通过指针变量也是可以修改这个值。那如果我们不希望这个变量被修改,我们应该怎么做,把这个值给固定住呢?const就起到了这样的一个作用。关于用const修饰,我们只需要记住,const就像是一把锁,把能修改的东西给上了锁。我写一个用const修饰的代码。这里如果调试的话就出现了错误。注意:这里的a变量用了const修饰,a就有了常属性(也就是不能被修改了)但a不是常量!但是!

2024-03-10 14:45:20 1118 1

原创 关于指针,我们该如何理解?

我们知道在计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中。那在我们的电脑中这些内存空间是如何高效管理的呢?其实也是把内存划分为一个个的内存单元,每个内存单元的大小取一个字节(就像是有楼房,咱们把楼房分成多层,来给用户住)每一个内存单元都有一个编号(就相当于楼房里的门牌号),有了这个编号,CPU就可以快速的找到某个内存空间。这个编号就相当于地址,你可以理解为在C语言中我们给这个地址取了一个新的名字叫做指针。简单的可以理解为内存单元的编号=地址=指针。

2024-03-07 20:33:34 494

原创 sizeof和strlen详细讲解

sizeof:1.sizeof是单目操作符。2.计算操作数所占内存的大小,单位是字节。3.不关注内存中存放什么数据。strlen:1.是库函数,使用时需要包括头文件string.h。2.是求字符串长度的,统计的是\0之前的个数。3.关注内存中是否有\0,如果没有\0,就会持续往后找,可能会越界。注意:如果sizeof里面有表达式,这个表达式是不参与计算的。

2024-03-06 21:31:33 1127 1

原创 qsort有什么用?该如何用?

简单来说,qsort函数是库函数,就是用来排序的。不过,qsort不仅仅可以用来排序整形数字,还可以用来排序小数,结构体,等等任意类型的数据。它的功能是十分强大的。

2024-03-04 20:13:49 940

原创 关于回调函数的理解

如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。此时我们可以创建一个函数calc(),把刚才冗余的代码搞进这个函数的内部,再通过指针找到我们需要的函数。这里就出现的大量的冗余,那么我们是否可以用一些方法来简化一下这段代码,把这些相似的代码抽象成函数。这个代码是一个简单的加减乘除运算,但是在这个代码中有些地方是很不简便的。

2024-03-03 16:14:36 432

原创 猜数字游戏的实现

先简单介绍一下这个游戏的规则:比如在1~100的数字内,随便挑选一个数字为“炸弹”,玩家轮流说出自己所猜想的数字,不断的缩小猜数字的范围,直到玩家说出带有“炸弹”数字,即视为游戏结束。

2024-02-14 14:40:12 463 2

原创 刚大一,二本院校软件工程专业学生的自述。

我就读于一个普通二本院校,目前的话还没有考虑好要不要考研。大家也都知道,二本院校想跟一本以上的院校抢工作是十分困难的,高中时的不努力必定注定我大学时期的后悔,但这也是没有办法的。我只有比别人付出更多的怒力才能跟其他人有一战之力。大一我决定先猛攻C。Python,Java放在C之后。不管怎么样,从现在开始,尽自己的一切努力,冲!大家好,我叫阿政,是一名刚大一的学生。

2024-02-07 16:32:00 397 1

空空如也

空空如也

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

TA关注的人

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