自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据结构(树)

通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。如图:每一个结点都有自己孩子结点和兄弟结点,如果没有就存NULL,这样就可以表示每一个结点了。:若一个结点含有子结点,则这个结点称为其子结点的父结点;:以某结点为根的子树中任一结点都称为该结点的子孙。:一个结点含有的子树的根结点称为该结点的子结点;如上图:B是A的孩子结点。:度为0的结点称为叶结点;:具有相同父结点的结点互称为兄弟结点;:一个结点含有的子树的个数称为该结点的度;

2024-05-23 16:54:42 1322

原创 C语言期末习题之求二维数组中的最大值

2. 使用两层循环遍历数组 a,比较每个元素和变量 max 的值,如果该元素的值大于 max,则将该元素的值赋给 max,并记录该元素的行和列值。3. 遍历完整个数组后,变量 max 中保存的就是数组中的最大值,而当前记录的行和列值就是最大值所在的位置。1. 声明变量 max,用于保存数组中的最大值,将其初始化为数组中的第一个元素 a[0][0]。个数的最大值,输出结果。在屏幕上输出最大值,最大值所在的行值和列值。

2024-05-22 20:24:59 300 1

原创 C语言期末习题之数组逆序存放

1. 使用一个循环遍历数组 a 的前一半元素,将其和数组 a 对应位置的后一半元素交换位置。2. 使用两层循环遍历数组 a,将 a 中每个元素倒序放入数组 b 的对应位置中。1. 在函数内部定义一个大小为 n 的新数组 b,用于保存逆序后的结果。也可以在原数组中进行操作,避免创建新的数组。3. 遍历完整个数组后,将数组 b 中的结果返回给主函数。2. 遍历完整个数组后,原数组 a 中的元素已经逆序存放。写一个函数将数组中的数逆序存放,例如i。思路2:在原来的数组上交换。思路1:创建新数组存放。

2024-05-22 20:17:41 486 1

原创 C语言期末习题之二维数组转置

3. 然后将这个元素与同一行中的对应位置的元素进行交换,即将 `x[i][j]` 的值赋给 `x[j][i]`,将 `x[j][i]` 的值赋给 `x[i][j]`。这个题可以使用两层循环来遍历给定的二维数组,然后将每一列的元素与对应行的元素进行交换,从而实现转置操作。1. 使用两层循环遍历整个二维数组,外层循环控制列的位置,内层循环遍历列中的所有元素。4. 最后将 `temp` 中保存的值赋给新位置的元素,从而完成一次交换操作。写一个函数,使得给定的。转置,即进行列互换。接下来手搓代码qwq。

2024-05-22 20:05:17 310

原创 C语言期末习题之统计大写字母,数字和其他字符的个数

我们可以使用 `getchar()` 函数来一次读取一行字符,然后使用 `if-else` 分支语句对每个字符进行分类计数,最后输出统计结果。输入一行字符,分别统计出大写英文字母、数字,其他字符和字符总数的个数,并输出统计的结果。1. 声明三个计数器变量,分别用于统计大写字母、数字和其他字符的个数。2. 使用 `getchar()` 函数读取一行字符,并计算字符总数。4. 输出统计结果,分别输出大写字母、数字、其他字符和总字符数。- 如果是其他字符,则将其他字符计数器加 1。下面让我们来实现代码吧~

2024-05-22 19:52:05 216

原创 数据结构(队列)

概念:队列是一种线性表,它只能从一端插入数据,从另一端删除数据,在插入数据的一端称为队头,在删除数据的一端称为队尾。队列遵循先进先出的原则。队列的实现建议使用链表来实现,因为如果用数组的话出队列要调整数组,比较麻烦,而使用链表实现就可以避免这个问题。生动形象一点就跟我们日常排队一样,先排的人先走,后排的人后走。

2024-05-22 19:31:00 219

原创 数据结构(栈)

概念:栈是一种线性表,它只能从固定的一端进行数据的插入和删除,这一端称为栈顶,另一端称为栈底。栈遵循先入后出的原则。栈的实现可以用数组或者链表来作底层,用数组的结构来实现会更简单一些,数组的插入数据也比较方便。压栈:栈的插入操作可以称为进栈/压栈/入栈,入数据在栈的顶部。检测栈是否为空,如果为空返回非零结果,如果不为空返回0。栈用数组来实现可以用定长数组也可以用变长数组实现。出栈:栈的删除操作叫出栈,出的数据也是在栈顶。

2024-05-22 09:49:43 464

原创 实现双链表的增删查改

双向链表的构建和单链表类似,可以从头部或尾部插入节点,也可以从头部或尾部删除节点,可以在双向链表中任意节点前或后插入节点,也可以删除任意节点。在编写插入时有一个小技巧,我们可以先让新创建的结点的指针先指向链表,然后再去修改链表的头结点和尾结点的指针,这样可以避免在插入新结点过程中造成混乱。双向链表是一种数据结构,它是单链表的扩展,每个节点除了有指向后继节点的指针之外,还有指向前驱节点的指针。双向链表的节点有三个部分组成:数据域、指向前驱结点的指针和指向后继结点的指针。这样新结点就插入成功啦!

2024-05-19 23:18:18 298

原创 数据结构(链表)

存储空间上 物理上一定连续 逻辑上连续,但物理上不一定连续。插入 动态顺序表,空间不够时需要扩容 没有容量的概念。概念:链表是一种物理上不连续,非顺序的存储结构,数据元素的逻辑顺序上是通过指针来连接的线性表。任意位置插入或者删除元素 可能需要搬移元素,效率低O(N) 只需修改指针指向。

2024-05-19 22:51:54 473

原创 数据结构(顺序表)

静态顺序表只适合数据个数已经确定的场合,如果不是,则顺序表的N给大了会造成空间浪费,给小了也不够用的情况,所以我们使用更加灵活的动态顺序表。顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。线性表是n个相同特性的数据元素的有限序列,常见的线性表有:顺序表、链表、栈、队列...线性表在逻辑上是线性结构,也就是说是一条直线。理上存储时,通常以数组和链式结构的形式存储。2. 动态顺序表:使用动态开辟的数组存储。1. 静态顺序表:使用定长数组存储元素。上完成数据的增删查改。

2024-05-18 22:20:58 267 1

原创 时间复杂度和空间复杂度

数据结构是计算机存储,组织数据的方式,指相互之间存在一种或者多种特定关系的数据元素的集合。算法就是定义良好的计算过程,取一组或者多组数据输入,产生一组或者多组的输出。就是说算法就是一系列的计算步骤,将输入数据转化成输出结果。

2024-05-18 21:53:57 395

原创 环形链表题

创建两个指针,一个快指针一个慢指针,快指针一次走两步,慢指针一次走一步,如果是环形链表则两个指针会相遇,所以每走一次判断两个指针是否相等。此时让head遍历链表,node也开始往下走,当x取的值不是1时,node结点会一直在环里遍历,最终head和node一定会在入环结点相遇。当快慢指针相遇时,慢指针在环里面走的长度就是N,因为快指针的相对于慢指针的速度为1,所以每走一步快指针就与慢指针的距离-1,直到相遇。因为快指针的速度是慢指针的两倍,所以路程也是慢指针的两倍。快指针走的路程:L+N+x*C。

2024-04-30 21:54:27 329 2

原创 贪吃蛇小游戏(c语言)

的返回值是short类型,在上⼀次调用 GetAsyncKeyState 函数后,如果返回的16位的short数据中,最高位是1,说明按键的状态是按下,如果最高是0,说明按键的状是抬起;但地区的改变可能会影响库的许多部分,其中⼀部分可能是我们不希望修改的。setlocale 的第⼀个参数可以是前面说明的类项中的⼀个,那么每次只会影响⼀个类项,如果第⼀个参数是LC_ALL,就会影响所有的类项。COORD是windowsAPI中定义的一个结构体,它可以表示字符在屏幕上的坐标,最左上角的位置坐标是(0,0)。

2024-04-30 20:54:33 1850 8

原创 c语言内存函数

函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。其中ptr是要修改内容的首地址,value是要修改成的内容,num是要修改的字节数。ptr1和ptr2是两个要比较的内存块首地址,num是要比较的大小,单位是字节。如果source和destination有任何的重叠,复制的结果都是未定义的。memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。

2024-04-25 16:51:16 427 1

原创 联合体和枚举

原因:这是因为每个成员共同使用一块空间,当我们给整型赋值为了0x11223344时,char类型的c的值就是0x44,此时改变c为0x55,也就是改变了i的最后一个字节变成0x11223355。联合体的特点就是所有成员共用一块空间,也就是说给其中一个成员赋值,其他成员的值也随之改变,所以也叫:共用体。联合体和结构体一样也有自己的成员,成员可以是不同类型,但是编译器只为最大的成员分配空间。它们都是有值的,默认是从0开始,下面以此类推,1,2,3,4...联合体的大小最少是最大成员的大小;

2024-04-25 16:29:22 481 1

原创 预处理深入

c语言中有一些预定义符号,也是在预处理阶段处理的,可以直接使用:__FILE__//进行编译的源文件__LINE__//文件当前的行号__DATE__//文件被编译的⽇期__TIME__//文件被编译的时间__STDC__//如果编译器遵循ANSI C,其值为1,否则未定义2.2.#define 定义常量#define可以在mian函数外定义常量,用自定义的名字来表示基本形式:definename stuff。

2024-04-11 22:34:35 710 3

原创 编译和链接

程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程⼀直保留他们的值。处理#include 预编译指令,将包含的头文件的内容插入到该预编译指令的位置。将源代码程序被输入扫描器,扫描器的任务就是简单的进行词法分析,把代码中的字符分割成⼀系列的记号(关键字、标识符、字面量、特殊字符等)。编译过程就是将预处理后的文件进行一系列的:词法分析、语法分析、语义分析及优化,生成相应的汇编代码文件。链接是⼀个复杂的过程,链接的时候需要把⼀堆文件链接在⼀起才生成可执行程序。

2024-04-11 21:56:29 826 3

原创 文件操作(2)

函数名 功能 适用于fgetc字符输入函数 所有输入流fputc字符输出函数 所有输出流fgets文本行输入函数 所有输入流fputs。

2024-03-31 21:34:47 685 3

原创 文件操作(1)

每个被使用的文件都在内存中开辟了⼀个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。为了读和写,新建⼀个新的⼆进制文件 建立⼀个新的文件。在编写程序的时候,在打开文件的同时,都会返回⼀个FILE*的指针变量指向该文件,也相当于建⽴了指针和文件的关系。

2024-03-31 20:45:30 970 2

原创 自定义类型:结构体(2)

位段的几个成员共有同⼀个字节,这样有些成员的起始位置并不是某个字节的起始位置,那么这些位置处是没有地址的。所以不能对位段的成员使用&操作符,这样就不能使⽤scanf直接给位段的成员输⼊值,只能是先输入放在⼀个变量中,然后赋值给位段的成员。如果传递⼀个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最打对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。

2024-03-20 21:50:47 1020 2

原创 自定义类型:结构体(1)

这样其实也是不行的,因为c语言是一种编译型代码,是一行一行的往下面执行的,在对匿名结构体重命名为Stu之前就已经进行自引用了,所以是不可行的。我们学习了结构体的创建和初始化之后,那么如果想要做到结构体引用结构体,类似递归的操作,要怎么做呢?上面代码是不合法的,编译器会把上面两个结构体当成两种不同的类型,会出现警告。在结构中包含⼀个类型为该结构本身的成员,这样的话结构体的内存就会变的无穷大。匿名的结构体类型创建之后,如果不重新进行命名,基本上只能用一次。上面的结构体声明中没有结构体标签,是匿名结构体。

2024-03-20 17:25:54 258 2

原创 整形和浮点型数据的存储(2)

这意味着,如果E为8位,它的取值范围为0~255;但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存⼊内存时E的真实值必须再加上 ⼀个中间数,对于8位的E,这个中间数是127;比如:0.5 的二进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则为1.0*2^(-1),其阶码为-1+127(中间值)=126,表示为01111110,而尾数1.0去掉整数部分为0,补齐0到23位 00000000000000000000000,则其二进制表示形式为。

2024-03-19 22:38:37 815

原创 整型和浮点型数据的存储(1)

具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于⼀个字节,那么必然存在着⼀个如何将多个字节安排的问题。大端(存储)模式:是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容,保存 在内存的低地址处。小端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容,保存 在内存的高地址处。其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分。小端模式,刚好相反。正整数的原码,补码,反码都相同;

2024-03-19 11:50:49 417 1

原创 深入理解指针(2)

如果指针 a 指向数组的第一个元素,指针 b 指向数组的第三个元素,则表达式 b - a 的计算结果为 2,表示数组中 a 和 b 之间有两个元素,也就是 b 指向的元素从 a 指向的元素经过两个元素之后才能到达。在指针类型中有一种特殊指针可以存放任意类型的地址,可以理解为无类型指针,也叫做泛型指针,这种指针虽然可以存放任意类型地址,但是也有其局限性,这种指针不能够进行+-和解引用操作。const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。向的内容,可以通过指针改变。

2024-03-01 21:39:02 383 2

原创 深入理解指针(1)

我们知道整形指针在32位平台下占4个字节,那么如果我们用字符指针去存放一个整形数据,再去利用指针去修改这个数据的时候,只能够修改一个字节,而如果用整形指针去存放,利用指针去修改数据的时候就修改4个字节。我们可以看到,对不同类型的指针进行+-相同的整数,他们+-的大小不一样,对char*类型指针变量跳过了一个字节,对int*类型指针变量跳过了4个字节,其实就是上面说过的,指针类型决定了。在理解指针是什么之前,我们首先要知道在计算CPU处理数据的时候,需要从内存中读取数据的,处理后的数据也会放回到内存中,

2024-03-01 20:53:33 647 2

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

栈(stack)是现代计算机程序里最为重要的概念之一,几乎每一个程序都使用了栈,没有栈就没有函 数,没有局部变量,也就没有我们如今看到的所有的计算机语言。在经典的计算机科学中,栈被定义为一种特殊的容器,用户可以将数据压入栈中(入栈push),也可以将已经压入栈中的数据弹出(出栈,pop),但是栈这个容器必须遵守一条规则:先入栈的数据后出栈(First In Last Out, FIFO)。就像叠成一叠的术,先叠上去的书在最下面,因此要最后才能取出。

2024-02-13 17:39:24 721 2

原创 分支和循环(2)

while循环。

2024-01-16 20:03:18 401 1

原创 扫雷游戏讲解(第一版本)

1.扫雷游戏分析和设计1.扫雷游戏分析和设计1.1扫雷游戏的功能说明•使⽤控制台实现经典的扫雷游戏•游戏可以通过菜单实现继续玩或者退出游戏•扫雷的棋盘是9*9的格⼦•默认随机布置10个雷•可以排查雷◦如果位置不是雷,就显⽰周围有⼏个雷◦如果位置是雷,就炸死游戏结束◦把除10个雷之外的所有⾮雷都找出来,排雷成功,游戏结束游戏的界⾯:1.2。

2023-12-23 14:24:35 164

原创 分支和循环(1)

实际上输出结果什么也没有,这是因为else只能与它最近的if配对,也就是图中第二个if语句,如果第一个if语句条件不成立的话,那么第二个if语句就没有机会执行了,else语句自然而然也没有机会执行了,如果我们把代码写成这样可能会更加容易理解。图中我们看到,如果输入10,那么if语句的表达式(age>=18)为假,所以不执行if后面的语句,执行else后面的语句;如果输入20,则表达式(age>=10)为真,执行if后面的语句,不执行else后面的语句。表达式为真,则语句执行,表达式为假,则语句不执行。

2023-12-19 18:01:54 141 1

原创 c语言数组的概念与使用

要使用数组,就要先创建数组,那么数组应该如何创建呢?实际上数组的创建和我们之前学习过的变量的定义差不多,下面让我们用一张图来解释图中我们大概可以知道数组的创建格式:类型说明符 数组名[ 常量/常量表达式 ]类型说明符:char int float double等等。数组名:一般根据实际情况定义有意义的名字。[ ]:里面的常量值决定来数组的大小,这个值根据需求来指定就⾏。例如:我要定义一个数组来存储一个班50个人的成绩。

2023-12-09 15:39:09 193 1

原创 我的第一篇博客--起

我刚开始学习c不久,虽然我不敢说我能有多远大的目标,但是我会尽力学好C语言,掌握计算机编程的基础知识和技能,能够进行简单的算法设计和数据结构的应用,进而为将来的职业发展打下坚实的基础。我是一个一遇到困难就想要退缩的人,到现在我还是一无所成,所以我希望这一次我能够坚持下去,通过博客来记录我学习c语言的历程,同时也希望它能够督促我不断学习,虽然我不知道我能否坚持下去但是我一定会全力以赴一次。我知道我现在所做的一切都是为了毕业能够找到一份好工作,而现在能够支持我不断学习的就是目标,没有目标那么努力就将毫无意义。

2023-11-20 17:58:01 31 1

空空如也

空空如也

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

TA关注的人

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