自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 二叉树深度解析:从基础概念到算法实现与应用

二叉树是一种严格有序的树结构空树:不含任何结点的集合,是二叉树的特殊形态。非空二叉树:由以下三部分组成:根结点(Root):唯一的顶层结点,没有父结点。左子树(Left Subtree):以根结点左子结点为根的二叉树。右子树(Right Subtree):以根结点右子结点为根的二叉树。关键特性度的限制:每个结点最多有2 个子结点(度为 0、1 或 2),不存在度大于 2 的结点。有序性:左右子树顺序严格区分,例如仅有左子结点的树与仅有右子结点的树视为不同结构。五种基本形态定义。

2025-04-12 18:01:37 689

原创 栈与队列:两种经典线性数据结构的深度解析

/ 动态数组存储数据int top;// 栈顶下标// 当前最大容量} Stack;return;// 内存分配失败处理// 队列节点// 队列整体结构// 队头指针(指向第一个节点)// 队尾指针(指向最后一个节点)int size;// 元素个数(优化:避免遍历计算长度)} Queue;栈和队列的核心价值在于通过限制操作接口,实现特定的访问顺序。栈的 LIFO 特性适合处理 “嵌套”“回溯” 场景(如函数调用、语法分析)

2025-04-12 16:49:30 875

原创 深入解析链表:结构、实现与应用全指南

/ 单链表结点int data;// 数据域,存储具体数据// 指针域,指向下一个结点(NULL表示链尾)// 双向链表结点(增加前驱指针)int data;// 指向前驱结点// 指向后继结点链表的本质是通过指针实现动态逻辑结构,其设计体现了计算机科学中 “间接层” 的智慧 —— 用额外的指针域换取操作的灵活性。指针操作的精准控制:理解指针传递、解引用的底层机制边界条件的全面处理:空链表、头结点、尾结点的特殊情况数学建模能力:如环形链表的快慢指针证明、时间复杂度分析。

2025-04-12 11:42:06 648

原创 顺序表:从数组到高效数据管理的进化之路

定义顺序表是一种线性数据结构,其核心特点是物理存储连续。它通过一段地址连续的存储单元(通常为数组)依次存储数据元素,支持高效的随机访问和顺序操作。顺序表是线性表的一种实现方式,与链表不同,它在内存中以连续的块存储数据,类似于“紧密排列的火车车厢”类比理解数组是 “毛坯房”,仅提供原始存储功能(固定大小,操作需手动管理);顺序表是 “精装房”,在数组基础上增加了 “家具”(操作接口),让数据管理更便捷(提供自动化接口(如动态扩容),更适合实际应用场景)。// 数组 vs 顺序表。

2025-04-08 22:07:32 947

原创 算法复杂度:从理论到实战的全面解析

实际中我们计算时间复杂度时,计算的也不是程序的精确的执行次数,精确执⾏次数计算起来还是很麻烦的(不同的⼀句程序代码,编译出的指令条数都是不⼀样的),计算出精确的执⾏次数意义也不⼤,因为我们计算时间复杂度只是想比较算法程序的增长量级,也就是当N不断变大时T(N)的差别,上面我们已经看到了当N不断变⼤时常数和低阶项对结果的影响很小,所以我们只需要计算程序能代表增长量级的大概执⾏次数,复杂度的表⽰通常使用大O的渐进表示法。在计算机科学中,算法的时间复杂度是⼀个函数式T(N),它定量描述了该算法的运⾏时间。

2025-04-03 22:58:17 780

原创 C 语言实现贪吃蛇小游戏:从设计到代码全解析

基础功能地图绘制:游戏界面包含墙体、蛇身和食物。墙体构成游戏的边界,蛇身由一系列节点组成,食物则随机出现在地图的空白位置。方向控制:玩家可以使用上下左右键来控制蛇的移动方向,改变蛇的前进路径。碰撞检测:当蛇撞到墙体或自身时,游戏结束。这需要我们在代码中实现相应的碰撞检测逻辑,确保游戏的合理性。得分系统:每当蛇吃到食物时,得分增加,同时蛇身增长一节,激励玩家不断挑战更高的分数。进阶功能加速 / 减速:玩家可以通过按下 F3 和 F4 键来调整蛇的移动速度,增加游戏的趣味性和挑战性。暂停功能。

2025-04-02 16:30:18 866

原创 深度揭秘 C 语言编译链接:从代码到可执行程序的全旅程

C 语言的编译链接过程是一个复杂而有序的系统工程,从源代码到可执行程序的每一步都蕴含着丰富的技术细节和原理。理解这个过程,不仅能够帮助我们更好地编写高质量的代码,还能在遇到问题时,快速准确地进行排查和调试。希望通过本文的介绍,能让大家对 C 语言编译链接有更深入的理解,在编程的道路上迈出更加坚实的步伐。

2025-02-17 19:05:41 643

原创 深入探索 C 语言文件操作:从基础到实践

当一个文件被使用时,系统会在内存中为其开辟一个相应的文件信息区,这个区域用于存放与该文件相关的各种信息,比如文件的名字、当前的文件状态(是打开状态还是关闭状态,是否处于读写操作中等等)以及文件当前的读写位置等。想象一下,我们编写了一个记录用户操作历史的程序,如果没有文件来保存这些数据,每次程序关闭后,用户的操作记录都将消失得无影无踪,下次启动程序时无法获取之前的信息,这显然无法满足实际需求。例如,一个图像文件如果以二进制形式存储,可以直接存储图像的像素信息,减少数据转换带来的开销,提高存储和读取的效率。

2025-02-16 22:31:37 605

原创 深入探索 C 语言中的自定义类型:结构体、联合体与枚举

结构体、联合体和枚举在 C 语言中各自扮演着重要角色。结构体擅长整合不同类型的数据,联合体能够有效节省内存,枚举则可以清晰地列举取值。而结构体实现的位段在特定场景下发挥着独特作用,尽管存在跨平台等问题,但合理使用能带来显著的性能提升。熟练掌握这些自定义类型及其特性,将使开发者在 C 语言编程的道路上如虎添翼,编写出更高效、更优质的代码。希望通过本文的介绍,大家能对它们有更深入的理解,并在实际编程中灵活运用。

2025-02-13 11:49:28 764

原创 深入解析:C语言中的整数与浮点数内存存储之谜

我们可以通过以下代码观察,数据在内存中的存储形式整数和浮点数在内存中的存储方式有着各自独特的规则和特点。整数采用补码形式存储,通过大小端字节序来安排多字节数据的存储顺序;而浮点数则遵循 IEEE 754 标准,通过符号位、有效数字和指数位来表示。理解这些存储机制对于我们深入掌握计算机原理、优化程序性能以及排查程序中的数据问题都有着重要的意义。希望通过这篇博客,能帮助大家更清晰地认识数据在内存中的存储方式。

2025-02-11 12:53:25 969

原创 深入理解C语言核心函数:字符、字符串与内存函数全解析

C 语言的字符函数、字符串函数和内存函数为开发者提供了强大的工具集,在字符串处理、内存管理等方面发挥着重要作用。深入理解并熟练运用这些函数,能显著提升代码的质量与开发效率。希望通过本文的介绍,读者能对这些函数有更深入的认识,在 C 语言编程中更加得心应手。

2025-02-10 12:35:09 872

原创 深入理解C语言指针:从入门到实践

指针是存储内存地址的特殊变量,其核心价值在于:通过地址直接访问数据实现高效的内存管理构建复杂数据结构的基础。

2025-02-07 12:59:20 476

原创 C语言操作符详解:从入门到避坑指南

整型提升的意义: 表达式的整型运算要在CPU的相应运算器件内执⾏,CPU内整型运算器(ALU)的操作数的字节长度⼀ 般就是int的字节⻓度,同时也是CPU的通⽤寄存器的⻓度。即使有了操作符的优先级和结合性,我们写出的表达式依然有可能不能通过操作符的属性确定唯⼀的 计算路径,那这个表达式就是存在潜在⻛险的,建议不要写出特别复杂的表达式。位操作符用于对数据的位进行操作,包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)和右移(>>)。包括逻辑与(&&)、逻辑或(||)和逻辑非(!

2025-02-06 12:55:26 439

原创 当函数学会“自我复制“:深入理解C语言递归的魔力

从这个公式不难看出:如何把⼀个较⼤的问题,转换为⼀个与原问题相似,但规模较小的问题来求解的。n的阶乘和n-1的阶乘是相似的问题,但是规模要少了n。有⼀种有特殊情况是:当 n==0 的时候,n的 阶乘是1,⽽其余n的阶乘都是可以通过上⾯的公式计算。如果有多个圆盘,函数就递归地移动上面的n-1个圆盘到辅助柱子,然后移动最大的圆盘到目标柱子,最后再递归地移动那n-1个圆盘到目标柱子。那我们就可以写出函数Fact求n的阶乘,假设Fact(n)就是求n的阶乘,那么Fact(n-1)就是求n-1的阶。

2025-02-05 11:10:21 446

原创 C语言数组的概念

我们称上图的初始化为不完全初始化,其中大括号中的数值代表数组中的元素,若大括号中的元素个数与方括号中的数字相等,则称为完全初始化。C语言规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后⼀个元素的下标是n-1,下 标就相当于数组元素的编号。素,这时候就是⼆维数组,⼆维数组作为数组元素的数组被称为三维数组,⼆维数组以上的数组统称 为多维数组。前⾯学习的数组被称为⼀维数组,数组的元素都是内置类型的,如果我们把⼀维数组做为数组的元。3.数组分为⼀维数组和多维数组,多维数组⼀般⽐较多⻅的是⼆维数组。

2025-02-04 11:18:57 412

原创 第一个小游戏————扫雷

因为,我们没有雷的地方设置的是0,有雷的地方设置的是1,因此我们判断雷的时候,可以将周围的八个坐标的数据相加,得出来的数据,就是雷的个数,因为最边缘的坐标,周围没有八个数据,因此我们可以将判断棋盘扩大,将其数据设置为0,就可以了,这样还与玩家输入的坐标相符合。对于判断的棋盘,我们可以将其设置为0和1,其中1代表是雷,如此我们在开始是可以将棋盘初始化为0,对于这个棋盘的大小,我们应设置为ROWS和COLS,至于为什么,请往下看。对于展示给玩家看的棋盘,我们可以设置横竖的坐标轴,剩余用*号来替代,代码如下。

2025-01-14 12:00:39 774

原创 C语言的分支与循环(二)

表达式 2 的结果如果等于0,则循环结束,表达式 2 的结果如果不等于0,则执⾏循环语句,循环语句执⾏完后,再去执行表达式3 ,调整循环变量,然后再去表达式 2的地⽅执⾏判断, 表达式 2 的结果,决定循环是否继 续。在 do while 循环中先执行语句,执⾏完语句,在去执⾏“判断表达式”,判断表达式的结果是不等于0,则继续循环,执⾏循环语句;在while循环中,要先判断表达式的真假,如果为真就执行循环体,每执行一次循环体,就判断一次表达式,看其是否为真,为真继续,为假结束循环,以此类推。

2024-10-25 23:37:06 503

原创 C语言分支和循环(一)

逻辑运算符有&&(且)和||(或),其中&&的语法形式为:exp1&&exp2,它的意思是如果exp1和exp2都正确,则表达式为真,如果有一个不正确,则表达式为假。||的语法形式为exp1||exp2,意思是两个表达式其中一个正确,表达式的值就为真。它也是按从左到右计算的,如果exp1为真就不计算第二个,如果为假,则计算第二个。它表示的意思是,如果表达式为真,则执行语句1,如果表达式的内容为假,则执行语句2。在C语言中0表示假,非0表示真,表达式的结果为非0,则语句执行,表达式的结果为0,则语句不执行。

2024-10-25 13:33:54 421

原创 C语言操作符与输入输出

它的第⼀个参数是⼀个格式字符串,⾥⾯会放置占位符(与 printf() 的占位符基本⼀致),告诉编译器如何解读⽤⼾的输⼊,需要提取的数据是什么类型。%d 表⽰⽤⼾输⼊的应该是⼀个整数。单目操作符有++,--,+(正),-(负)其中++,--有两种形式,例如++有前自增和后自增,其适用形式不同。占位符有很多,常用的有%c,%d,%s,%f,%p,%zd等。赋值操作符有=,+=,-=,*=等,其中“=”是将右侧的值赋给左侧,而+=,-=等的运算形式相同,例如:+=---->a+=3----->a=a+3。

2024-10-24 22:46:33 482

原创 C语言数据类型和变量

每⼀种数据类型有⾃⼰的取值范围,也就是存储的数值的最⼤值和最⼩值的区间,有了丰富的类 型,我们就可以在适当的场景下去选择适合的类型。如果要查看当前系统上不同数据类型的极限值: limits.h ⽂件中说明了整型类型的取值范围。对于数据长度,一般用sizeof(数据类型)来求其长度,其计算结果为size_t,其返回值的具体形式由系统去决定,通常的使用“printf(“%zd(zu)”,sizeof(数据类型))”去输出。内置数据类型大概分为四类,分别为:字符型,整型,浮点型和布尔型。

2024-10-24 22:05:57 304

空空如也

空空如也

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

TA关注的人

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