- 博客(24)
- 收藏
- 关注
原创 图算法:Dijkstra、Floyd与AOV/AOE网的深度解析
本文系统介绍了四种经典图算法:Dijkstra算法用于单源最短路径,通过贪心策略逐步扩展最短路径;Floyd算法解决多源最短路径问题,采用动态规划思想;拓扑排序针对有向无环图,给出满足依赖关系的线性序列;关键路径算法分析AOE网,确定工程关键活动和最短工期。这些算法在路径规划、任务调度等领域有广泛应用,是计算机考研和算法设计的核心内容。
2025-12-27 15:31:26
819
原创 《Prim vs Kruskal:一文搞懂最小生成树 》
最小生成树(MST)是图论中的重要概念,指在带权连通无向图中包含所有顶点且总边权最小的生成树。MST具有n-1条边且无环路,应用广泛于网络设计等领域。求解MST的经典算法包括Prim算法(顶点扩展策略,适合稠密图)和Kruskal算法(边排序策略,适合稀疏图)。MST的关键性质包括割性质(最小割边必选)和环性质(最大环边必弃)。408考试重点考查算法步骤模拟、概念辨析(如与最短路径树的区别)以及MST唯一性判断(边权互异时唯一)。复习时应注重算法手算练习和性质理解。
2025-12-24 23:13:59
768
原创 数据结构——第五章-->树与二叉树
本文系统介绍了树结构的基本概念和核心算法。主要内容包括:1. 树的基本概念与术语:定义了树的组成(根节点、分支节点、叶子节点)和基本性质(结点数与度数关系、层结点数上限);2. 二叉树:详细解析了二叉树的定义、特性、五种性质及四种特殊二叉树(满二叉树、完全二叉树等);3. 存储结构:对比了顺序存储和链式存储(二叉链表、三叉链表)的实现方式;4. 遍历算法:阐述了先序、中序、后序三种递归遍历及层次遍历的队列实现;5. 线索二叉树:说明了利用空指针存储遍历顺序关系的优化方法;6. 应用实例:介绍了二叉排序树、平
2025-10-30 22:16:03
686
原创 数据结构——第四章-->串
串:把字符像串珠子一样连起来,形成的有限序列。比如 “咖啡不加糖”“12345” 都是串,甚至空着(没字符)也叫串。串名:给这个 “字符串” 起个代号,比如给 “今天天气好” 起名叫str1,方便后续指代它。串的长度:数一下这串里有多少个字符,比如 “Hello” 长度是 5,空串长度是 0。空串:一个字符都没有的串,就像空口袋,比如""。子串 & 主串子串:从主串里抠一段连续的字符出来,比如主串是 “王者荣耀真好玩”,“荣耀真” 就是它的子串。主串:包含子串的那个 “大串”。字符的位置。
2025-10-26 16:27:26
655
原创 数据结构——第三章-->栈、队列和数组
本文系统介绍了线性结构中的栈、队列、数组和矩阵的存储方式。主要内容包括:1)栈的顺序存储(数组实现)和链式存储(链表实现)及其基本操作;2)循环队列的三种判空/满方案;3)特殊矩阵的压缩存储方法(对称矩阵、稀疏矩阵等)。重点讲解了栈在括号匹配、表达式求值和递归中的应用,以及队列的链式和顺序实现方式。最后介绍了数组的存储结构和特殊矩阵的压缩存储技术,包括对称矩阵、三角矩阵和稀疏矩阵的高效存储方案。
2025-10-21 23:45:34
860
原创 数据结构——第一章/第二章-->绪论/线性表
本文系统介绍了数据结构中线性表的核心概念与实现方式。主要内容包括:1)数据结构基本概念(数据、数据元素、数据项、逻辑结构);2)线性表的顺序存储(静态/动态分配的顺序表实现)及其基本操作(插入、删除、查找);3)线性表的链式存储(单链表、双链表)的实现细节,包括带头结点与不带头结点的区别、插入删除操作的时间复杂度分析;4)单链表的创建方法(头插法、尾插法)及链表逆置算法;5)双链表的特性与前驱/后继指针操作。文章通过代码示例详细解析了各类数据结构的实现逻辑,对比了不同存储方式的优缺点,为学习数据结构提供了全
2025-09-23 21:31:49
726
原创 预处理详解
本文系统介绍了C语言预处理指令的用法与注意事项。主要内容包括:1. 预定义符号(FILE、__LINE__等)的使用场景;2. #define定义常量与带参宏的技巧,重点讲解了宏替换的副作用问题及解决方案;3. 条件编译指令(#ifdef/#ifndef等)的用法及实际应用场景;4. 头文件包含的两种方式及防止重复包含的方法;5. 其他预处理指令如#error、#pragma等。文章通过大量实例详细说明了宏定义中的常见错误(如运算符优先级、分号问题等),并对比了宏与函数的优缺点,最后介绍了#和##运算符的高
2025-07-31 16:26:03
864
原创 编译和链接
C语言程序从源代码到执行分为翻译环境和运行环境。翻译环境包含预处理(展开宏、处理头文件)、编译(词法/语法/语义分析生成汇编)、汇编(转为机器码)、链接(合并目标文件与库文件)四个阶段,最终生成可执行程序。运行环境则负责程序加载、执行main函数并管理内存(堆栈处理局部变量,静态区存储全局变量),直至程序终止。多文件项目通过链接器解决跨文件函数调用和变量引用问题,体现了C语言编译型特性。整个过程实现了从高级代码到机器指令的完整转换与执行。
2025-07-28 10:07:25
988
原创 c语言--文件操作
本文系统介绍了C语言文件操作的核心概念。主要内容包括:1) 文件的作用和分类,区分程序文件和数据文件;2) 文件名的组成和常见文件后缀;3) 文本文件与二进制文件的存储差异;4) 文件指针和标准流的概念;5) 文件的打开、关闭及读写操作函数;6) 随机读写的实现方法;7) 文件结束的正确判定;8) 文件缓冲区的原理及其重要性。文章通过具体代码示例详细说明了文件操作的各个环节,帮助读者掌握C语言中文件处理的关键技术要点。
2025-07-26 17:43:58
1070
2
原创 动态内存管理
【摘要】本文系统介绍了C语言动态内存管理的关键技术。主要内容包括:1.动态内存分配的必要性,通过malloc、calloc和realloc实现运行时灵活申请内存空间;2.内存释放机制,强调free函数的重要性及使用规范;3.常见动态内存错误,如空指针解引用、越界访问、重复释放等;4.柔性数组特性及其在内存管理中的优势。文章通过代码示例详细演示了动态内存的申请、使用和释放全流程,并分析了各种内存操作函数的区别与适用场景,为C语言开发者提供了全面的动态内存管理指导。特别强调了内存泄漏防范和野指针处理等关键问题。
2025-07-24 15:06:13
792
原创 自定义类型:结构体,联合和枚举
本文摘要:文章系统讲解了C语言中结构体、联合体和枚举的核心概念与应用。结构体部分详细解析了类型声明、内存对齐规则(含嵌套结构体)、传参优化(推荐传址)及位段实现;联合体重点说明了共享内存特性与大小计算;枚举则强调其增强代码可读性的优势。三者对比:结构体适合组合异构数据,联合体用于内存共享场景,枚举则提升常量可维护性。内存对齐和位段设计体现了空间与时间的权衡技巧,而传址调用优化了大型结构体的性能开销。全文通过丰富代码示例阐释了这些复合类型在实践中的正确用法与注意事项。
2025-07-23 21:10:47
854
原创 数据在内存中的存储
本文摘要: 文章主要介绍了计算机中数据的存储方式。首先详细讲解了整数的三种二进制表示方法(原码、反码、补码)及其转换规则,指出计算机实际存储的是补码形式。其次阐述了C/C++中的整型提升机制,说明小整数类型在运算时会自动转换为int类型以提高效率。接着解释了大小端字节序的概念及区别,分析了不同处理器的字节序选择。最后详细描述了浮点数的IEEE 754存储标准,包括符号位、指数位和尾数位的分配规则,以及特殊值的处理方式。全文系统地介绍了计算机底层数据存储的关键技术原理。
2025-07-18 14:36:03
654
原创 C语言内存函数
本文系统介绍了C语言内存操作函数memcpy、memmove、memset和memcmp的使用与实现原理。memcpy用于内存复制但不处理重叠区域,其模拟实现需进行指针类型转换;memmove是memcpy的安全升级版,通过判断内存重叠情况选择正向或反向复制来保证正确性。memset按字节设置内存值,其效果随数据类型变化。memcmp则通过逐字节比较返回内存块的差异结果。文章通过代码示例详细演示了各函数的应用场景,并分析了内部实现机制,特别强调了memcpy和memmove在处理内存重叠时的关键区别。
2025-07-17 21:13:06
2009
原创 字符函数和字符串函数
本文摘要:C语言标准库提供了丰富的字符串处理函数,主要包含字符分类、转换和字符串操作三类。字符分类函数(如islower)用于判断字符类型,字符转换函数(如toupper)实现大小写转换。字符串操作函数包括:strlen(获取长度)、strcpy(字符串复制)、strcat(字符串连接)、strcmp(字符串比较)及其变体strncpy、strncat、strncmp(带长度限制版本)。文章详细介绍了这些函数的用法,并提供了模拟实现的代码示例,如通过计数器方式实现strlen、使用指针操作实现strcpy等
2025-07-16 15:00:26
1016
原创 深入理解指针(part5)
在 sizeof(arr + 0) 中,arr 因为加法运算退化为指针,sizeof 计算的是指针的大小;而 sizeof(&arr) 计算的是指向整个数组的指针的大小,虽然含义不同,但在 64 位系统中大小也为 8 字节。在 printArray 函数中,arr 本质上是 int* 类型,所以 sizeof(arr) 得到的是指针的大小(在 64 位系统上通常是 8 字节 ),而不是数组的总大小。解引用指针:*arr 等价于 *(char*)arr,得到首元素的值(即 'a',类型为 char)。
2025-07-10 17:45:49
760
原创 深入理解指针(part2)
摘要:本文详细解析了C语言中数组名的本质及其应用。数组名通常代表首元素地址,但在sizeof和&操作时例外。通过代码示例展示了数组名与指针的关系、一维数组传参的指针退化特性,以及冒泡排序的实现。文章还介绍了二级指针的概念和指针数组的用法,包括用指针数组模拟二维数组的方法。这些内容揭示了C语言中数组与指针的内在联系,为理解数组操作和指针应用提供了实用指导。
2025-07-09 19:10:28
831
原创 操作符的了解
本文摘要:C语言操作符系统详解,涵盖算术、位运算等12类操作符的分类与用法;原码/反码/补码的二进制表示原理及内存存储方式;移位操作符的运算规则与示例;单目操作符的特性演示;结构体定义、初始化及成员访问方法(.和->操作符);表达式求值中的优先级、结合性规则及类型转换机制(整数提升和算术转换)。通过代码实例详细解析了各类操作符的实际应用,为理解C语言底层运算机制提供了系统指导。(148字)
2025-07-08 18:37:10
914
原创 深入了解--函数递归
递归是一种函数自身调用的编程方法,其核心思想是将复杂问题分解为相似但更小的子问题,直到问题简单到可以直接解决(终止条件)。递归与嵌套调用的区别在于:递归是函数直接或间接调用自身,而嵌套调用是函数间相互调用。递归必须包含终止条件,且每次递归调用都应更接近该条件。递归的典型应用包括阶乘计算、斐波那契数列和青蛙跳台阶问题(解法类似斐波那契数列)。递归的替代方法是迭代(如循环结构),两者各有优劣。递归代码通常更简洁但效率较低,需注意栈溢出风险;迭代效率更高但逻辑可能更复杂。
2025-07-07 23:45:32
753
原创 c语言——函数
本文系统介绍了C语言中函数的概念与使用方法。第一部分阐述了函数的本质,比较了数学函数与C语言函数的异同,并分类说明库函数(如stdio.h、math.h等标准库函数)和自定义函数的特点。第二部分详细讲解了函数定义与调用的语法,包括形参实参关系、返回值处理、数组参数传递等关键点。第三部分探讨了函数的高级应用,如嵌套调用和链式访问的实现方式。最后介绍了多文件编程中的函数声明与定义规范,以及static和extern关键字对函数和变量作用域的影响。全文通过丰富示例代码,完整呈现了C语言函数的核心知识体系
2025-07-06 18:23:40
998
原创 数组的深入了解
有 ⼀个比较较迷惑的点,变长数组的意思是数组的大小是可以使⽤变量来指定的,在程序运行的时候,根据变量的⼤小来指定数组的元素个数,⽽不是说数组的⼤小是可变的。得出结论:数组在内存中是连续存放的。从输出的结果来看,每⼀⾏内部的每个元素都是相邻的,地址之间相差4个字节,跨⾏位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是差4个字节,所以⼆维数组中的每个元素都是连续存放的。前⾯学习的数组被称为⼀维数组,数组的元素都是内置类型的,如果我们把⼀维数组做为数组的元素,这时候就是。
2025-07-05 17:52:06
2522
原创 深入理解指针(part1)
assert.h 头⽂件定义了宏assert(),⽤于在运⾏时确保程序符合指定条件,如果不符合,就报错终⽌运⾏。这个宏常常被称为“断⾔”。它用于检查那些理论上绝不应该发生的情况,一旦条件不满足就终止程序并给出错误信息,方便定位代码中的 bug。而if语句无论在调试还是正式版本中都会执行,用于处理程序中可能正常出现的不同情况,让程序根据条件走不同的逻辑分支,保证程序的稳健运行。ps:assert() 的缺点是,因为引入了额外的检查,增加了程序的运行时间。而if。
2025-07-04 16:48:44
852
原创 分支和循环(下)
在 C 语言的世界里,经常要用到随机数。rand 函数能给出随机数,但要是不做特别设置,每次结果都差不多。srand 函数就像给它配了把独特钥匙,能改变随机数的 “套路”。而 time 函数呢,就像一个源源不断提供新原料的工厂,给 srand 供应不断变化的时间值做种子,让 rand 产生的随机数更随机。这三个函数相互协作,在游戏开发、数据模拟等众多场景 C 语言学习者必须掌握的关键知识。
2025-07-03 10:27:57
534
原创 分支和循环(上)
C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实现这三种结构的,其实我们如果仔细分析,我们⽇常所⻅的事情都可以拆分为这三种结构或者这三种结构的组合。我们可以使⽤ if 、 switch 实现分⽀结构,使⽤ for 、 while 、 do while 实现循环结构。ps:如果把程序比作一幅画,这三种结构就是画笔。顺序结构是 “直线笔”,选择结构是 “分叉笔”,循环结构是 “重复画笔”,用它们就能画出任何复杂的图案~1.if语句。
2025-07-02 17:09:44
2105
原创 C语言数据类型和变量
计算机存储数据时,每个数据类型占用的内存空间是有限的,因此,每种类型能表示的数值范围也是有限的。有了丰富的类型,我们就可以在适当的场景下去选择适合的类型。所谓“类型”,就是相似的数据所拥有的共同特征,编译器只有知道了数据的类型,才知道怎么操作数据。是⼀个关键字,也是操作符,专⻔是⽤来计算sizeof的操作符数的类型⻓度的,单位是字。如果不满5位,对应的值的前⾯会添加空格。类型是⽤来创建变量的,C语⾔中把经常变化的值称为变量,不变的值称为常量。的操作数如果不是类型,是表达式的时候,可以省略掉后边的括号的。
2025-07-01 16:50:34
774
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅