- 博客(37)
- 收藏
- 关注
原创 CentOS7 静态 IP 配置全攻略:解决 NetworkManager 冲突与 Vim .swp 隐患
CentOS7+静态IP配置常见问题与解决方案 在CentOS7+系统中配置静态IP时,常会遇到两个主要问题:NetworkManager与network服务冲突,以及Vim交换文件干扰。本文提供了一套完整的解决方案。 核心问题 服务冲突:NetworkManager与network服务会争夺网卡管理权 交换文件干扰:Vim异常退出产生的.swp文件会影响配置文件修改 解决方案 解决服务冲突: 停止并禁用NetworkManager 在ifcfg-ens33中添加NM_CONTROLLED=no 删除NM中
2025-11-26 23:36:31
769
6
原创 带哨兵位的双向循环链表详解(含 C 代码)+ LeetCode138 深度解析 + 顺序表 vs 链表缓存机制对比(图解 CPU 层级)
本文深入解析了带哨兵位的双向循环链表实现,结合LeetCode138题演示链表复制技巧,并对比顺序表与链表的性能差异。重点内容包括:1)哨兵节点的优势在于简化边界条件处理;2)链表深拷贝的三步法(插入、设置随机指针、拆分);3)通过CPU缓存机制分析,揭示链表性能瓶颈源于内存访问不连续导致的缓存命中率低下。文章从数据结构实现、算法技巧到系统级性能优化,全面剖析链表的核心知识点,适合希望深入理解链表底层原理的开发者。
2025-11-26 21:09:56
1274
9
原创 链表面试进阶:分割、回文、公共节点、环检测与环入口点(附C语言实现)
链表经典面试题解析 摘要:本文精选5道高频链表面试题,涵盖分割、回文判断、公共节点查找和环检测等核心考点。通过双指针、快慢指针等技巧,提供清晰的解题思路和C语言实现代码。每道题均分析时间复杂度与空间复杂度,并给出面试答题技巧,帮助开发者系统掌握链表操作的核心思维,轻松应对技术面试挑战。 关键点: 链表分割使用双链表法和哨兵节点 回文判断结合快慢指针和链表反转 公共节点查找采用长度差对齐法 环检测与入口点定位运用快慢指针数学推导 所有解法均优化至O(1)空间复杂度
2025-11-25 00:30:07
1016
10
原创 链表五大经典面试题详解:双指针与基础操作实战
本文详解了五道经典链表面试题的解法与技巧: 移除链表元素:采用尾插法构建新链表,正确处理节点删除与内存释放 反转链表:运用头插法或三指针法实现链表反转 链表中点查找:通过快慢指针(快2慢1)高效定位中间节点 倒数第k个节点:快指针先走k步,再与慢指针同步移动 合并有序链表:基于归并排序思想,使用尾插法合并 核心技巧包括双指针(快慢指针)、头插/尾插法等,这些方法时间复杂度均为O(n),空间复杂度O(1)。掌握这些基础操作和思维模式是解决复杂链表面试题的关键。
2025-11-23 23:32:06
1089
9
原创 双指针技巧实战
本文介绍了数组相关的三道经典面试题,重点讲解了双指针技巧的应用: 移除元素:使用快慢指针,快指针遍历原数组,慢指针构建新数组,时间复杂度O(N),空间O(1) 删除有序数组重复项:类似快慢指针法,比较当前与前一个元素,保留唯一值 合并两个有序数组:采用逆向双指针,从后往前合并避免覆盖,时间复杂度O(m+n) 这三道题展示了双指针在数组处理中的强大威力,通过指针分工和方向调整,可以高效解决各类数组操作问题。掌握这种核心技巧,能有效提升算法解题能力。
2025-11-22 23:51:45
1071
4
原创 数据结构实战:从顺序表到单链表,手把手实现C语言通讯录
本文通过C语言实现通讯录项目,对比顺序表和单链表两种数据结构的优缺点。顺序表采用动态扩容机制,支持随机访问但插入删除效率低;单链表通过节点指针连接,插入删除高效但需处理二级指针、边界条件等难点。文章详细解析了单链表的五大技术难点:二级指针的必要性、头指针与头节点区别、边界条件处理、内存管理规范以及遍历时安全修改链表的技巧。通过实际代码演示,帮助读者深入理解数据结构在实际项目中的应用,掌握链表操作的核心要领和常见陷阱。
2025-11-22 23:42:58
3240
9
原创 【牛客排序题详解】归并排序 & 快速排序深度解析(含 C 语言完整实现)
本文详细解析了归并排序和快速排序的核心差异与实现。两种算法都采用分治思想,但归并排序机械拆分后需合并(稳定但需额外空间),而快排智能分区(原地但不稳定)。归并适合大数据和稳定场景,快排适合内存紧张情况。文中提供了可直接使用的C语言实现代码,包括归并排序的稳定合并和快排的随机化pivot优化,并支持通过主函数自由切换算法。两种排序各有优势,应根据具体场景选择最优方案。
2025-11-20 23:34:23
1097
10
原创 数据结构与算法基础入门 —— 从概念到复杂度理解
本文系统介绍了数据结构与算法的核心概念和学习路径。数据结构是组织和存储数据的方式,算法是解决问题的步骤。文章强调其在面试和工作中的重要性,并详细讲解了时间复杂度与空间复杂度的分析方法,包括常见复杂度类型(O(1)、O(logN)、O(N)等)的计算示例。最后给出了实用学习建议:动手实践、画图辅助、循序渐进的刷题顺序(剑指Offer→牛客网→LeetCode)。掌握这些基础将有效提升编程思维和解决问题的能力。
2025-11-20 22:21:29
971
5
原创 Java 抽象类与多态实验
本文通过两个Java编程实验(人员管理系统和动物园管理系统)深入探讨了抽象类与多态的应用。在人员系统中,抽象类Person定义了共性属性,三个子类实现不同的薪资计算方式;动物园系统中抽象类Animal规范了动物的基本行为,子类实现具体功能。实验展示了父类引用指向子类对象的多态特性,以及instanceof在业务逻辑中的应用。作者体会到抽象类作为模板的价值,以及多态带来的代码灵活性和可扩展性,强调良好的抽象结构对系统设计的重要性。两个案例均提供了完整代码实现和运行结果演示。
2025-11-18 23:51:11
897
3
原创 【算法精讲】从「复制零」到「快速排序」:数组操作与分治算法的双重理解
本文解析了两类经典算法问题:数组操作与排序算法。首先以LeetCode 1089"复制零"为例,提出暴力后移法(O(n²))和双指针优化法(O(n))两种解法,重点讲解了通过"虚拟扩容"和反向填充实现高效原地修改的技巧。然后以牛客NC140"快速排序"为例,展示了分治算法的实现过程,包括分区、递归排序等关键步骤。最后总结了两类问题的思维联系:数组操作侧重指针技巧和空间优化,排序算法则体现分治思想。通过这两道典型题目,读者可以深入理解数组处理和排序策
2025-11-18 23:11:44
356
1
原创 顺序表的基础知识
本文系统介绍了顺序表的原理与实现方法。首先解释了数据结构的重要性,说明数组在处理动态数据时的局限性。然后详细讲解了顺序表的概念,包括其与数组的区别、静态与动态两种类型。重点阐述了动态顺序表的实现,通过结构体定义展示其核心元素(数据数组、当前大小、容量),并列举了初始化、扩容、插入删除等关键操作接口。文章强调顺序表作为基础数据结构的作用,为后续学习更复杂的数据结构打下基础,并预告顺序表在通讯录等实际项目中的应用。
2025-11-17 23:25:22
1136
10
原创 每日小练——宏的运用
本文分享了C语言宏的两个经典应用案例:奇偶位交换和结构体偏移量计算。 第一个案例展示了如何使用位运算宏SWAP(x)交换整数的二进制奇偶位,通过掩码和移位操作实现高效转换。 第二个案例解析了OFFSETOF宏的底层原理,通过(type*)0获取结构体成员的偏移量,这利用了指针运算的特性而不会引发段错误。 这两个例子分别体现了宏在底层位操作和编译时类型运算中的独特优势:既能完成函数无法实现的功能,又能在编译期完成计算提升效率。 文章强调宏虽然强大但需谨慎使用,要注意类型安全、副作用和适当括号等问题。掌握这些案
2025-11-17 22:41:35
1042
3
原创 【C语言预处理器全解析】宏、条件编译、字符串化、拼接
本文全面解析了C语言预处理器功能,涵盖宏定义、条件编译等核心知识点。主要内容包括: 预处理器基础:在编译前处理宏展开、注释删除、条件编译等任务 宏定义详解: #define常量和宏函数的正确写法 必须用括号包裹参数避免优先级问题 警惕宏参数副作用(如i++)导致的多次求值 高级特性: #运算符实现参数字符串化 ##运算符进行标识符拼接 宏与函数的适用场景对比 实用技巧: 预定义符号(__FILE__等)的调试应用 条件编译的多种形式(#if/#ifdef) 头文件重复包含的防护方案 文章通过大量代码示例和常
2025-11-16 21:25:31
1011
7
原创 从源代码到可执行文件:彻底理解 C 语言的编译与链接
本文系统讲解了C语言程序从源码到可执行文件的完整流程,包含翻译环境和运行环境两大阶段。翻译环境分为预处理、编译(词法/语法/语义分析)、汇编、链接四个核心步骤,重点是宏展开、头文件处理、符号决议和重定位。运行环境则涉及程序装载、内存分配和执行过程。通过图示和示例详细展示了每个环节的转换机制,帮助开发者深入理解底层构建原理,为多文件工程、库开发和错误排查提供理论基础。适合C语言学习者和需要了解编译原理的开发者阅读。
2025-11-16 20:12:52
758
3
原创 进程间通信 IPC 全面解析:不同通信方式有什么区别?该怎么选?
摘要: 本文全面解析进程间通信(IPC)机制,涵盖本地和网络通信方式。本地通信包括管道(父子进程字节流)、消息队列(有边界消息)、共享内存(最快大数据传输)、信号量(资源同步)和信号(异步通知);网络通信则依赖于Socket。文章通过对比表格清晰展示各方式特点,并给出选择建议:大数据用共享内存+信号量,中小消息用消息队列,简单父子通信用管道,事件通知用信号,跨主机必选Socket。核心原则是优先选择更高性能的本地通信方式。
2025-11-14 22:13:10
1262
8
原创 什么情况下会把 SYN 包丢弃?
本文详细解析服务器丢弃客户端SYN包的四种情况:1)NAT环境下开启tcp_tw_recycle+tcp_timestamps会导致时间戳冲突丢弃SYN包(Linux 4.12后已删除该参数);2)半连接队列满时新SYN包被丢弃;3)全连接队列满时影响新连接建立;4)未开启syn cookies时SYN Flood攻击会耗尽队列。文章推荐关闭tcp_tw_recycle、开启tcp_syncookies的生产环境配置,并总结了TCP握手机制与内核参数的关联性。
2025-11-14 21:22:41
787
3
原创 TCP连接还在吗?主机拔掉网线后再插上,连接会断开吗?
拔网线后TCP连接会断开吗? TCP连接本质是内核中的结构体,物理断网不会立即清除连接状态。关键影响因素: 有数据传输:服务端多次重传失败后会主动断开 无数据传输: 启用keepalive:超时探测后断开 未启用keepalive:连接保持"假死"状态 与kill进程的区别在于是否发送FIN报文 结论:拔网线≠立即断开,TCP连接会在数据交互失败或keepalive超时后最终断开,期间可能长时间保持"假活"状态。
2025-11-13 22:17:16
1089
7
原创 LeetCode 1658 | 将 x 减到 0 的最小操作数(C语言滑动窗口解法)
📝 LeetCode 1658 题解摘要(C语言滑动窗口) 核心思路:将"两端取数"问题转化为"求中间和为(sum-x)的最长子数组",用n-子数组长度计算最小操作数。 算法步骤: 计算总和sum 特判sum<x和sum==x情况 滑动窗口找target=sum-x的最长子数组 返回n-maxLen或-1 复杂度:O(n)时间,O(1)空间 关键技巧: ✔️ 问题转化思维 ✔️ 双指针维护滑动窗口 ✔️ 边界条件处理 适用场景:类似的双端操作问题可优先考虑滑动
2025-11-13 22:02:25
386
4
原创 C语言 | LeetCode 414. 第三大的数
本文介绍了使用快速排序解决LeetCode第414题「第三大的数」的方法。文章详细讲解了快速排序的实现原理,包括分区函数和递归排序过程,并提供了完整的C语言代码实现。通过手写快排将数组排序后,可以方便地找到第三大的数。虽然该方法时间复杂度为O(nlogn),但很好地复习了快排的核心逻辑。文章还提到更优的线性时间复杂度解法将在后续更新中介绍。
2025-11-12 23:55:11
542
4
原创 C语言 | 文件操作详解与实战示例
本文全面介绍C语言文件操作的核心知识,包含文件类型区分(文本/二进制)、文件打开模式、顺序/随机读写函数(fopen/fread/fwrite等)、缓冲区机制等内容。重点解析feof()与ferror()的区别:feof用于判断文件是否读取完毕,ferror用于检测I/O错误,二者不可混淆。文中提供大量代码示例,并建议通过"学生成绩系统"等实践巩固文件操作技能。掌握文件操作能实现数据持久化,是C语言编程的重要能力。
2025-11-12 17:41:33
9173
5
原创 Java 静态成员与继承封装实战:从报错到彻底吃透核心特性
《Java静态成员与继承封装实战》 本文通过实验案例详细解析了Java面向对象编程中的三个核心特性: 静态成员(static):演示了使用static变量统计Dog类实例数量,强调静态成员属于类而非对象。 封装(private):通过Person类展示private属性的封装特性,以及通过方法访问私有成员的正确方式。 继承(extends):包括同包继承和跨包继承的实现,特别是super关键字的使用和权限控制。 文章特别总结了5个常见错误及解决方案,如静态变量访问方式、跨包导入问题、super调用必要性等,
2025-11-11 18:39:51
494
3
原创 C语言动态内存管理:从基础到进阶的完整解析
本文系统讲解C语言动态内存管理,涵盖从基础到进阶的核心知识。主要内容包括:malloc/free、calloc/realloc的使用方法及注意事项,动态内存六大常见错误(NULL解引用、越界访问、错误释放等),四道经典笔试题解析,以及C99柔性数组的应用。文章还提供了清晰的内存结构示意图,帮助理解堆、栈、静态区的分布关系。通过结构化讲解和典型示例,帮助读者掌握动态内存的关键知识点,避免常见陷阱。
2025-11-11 17:26:18
934
1
原创 Java 面向对象|类的组合深度解析
本文通过两个完整案例深入解析Java中类的组合(HAS-A)关系。案例1展示点与圆的组合关系,实现几何计算;案例2演示课程→教材→出版社的多层组合模型,通过对象传递建立关联。文章对比了组合与继承的适用场景,强调组合能更自然地反映现实世界结构,并提供了UML图示和完整代码实现,适合Java初学者学习类关系建模。
2025-11-10 14:13:32
1067
8
原创 C语言自定义类型:联合体与枚举
本文系统讲解了C语言中联合体(union)和枚举(enum)两种自定义数据类型。联合体的核心特点是所有成员共享内存空间,只能保存其中一个成员的值,常用于节省内存空间和判断大小端。枚举则用于定义一组离散的常量,相比#define具有更好的可读性和类型安全性。文章通过图示详细对比了联合体和结构体的内存布局差异,解释了联合体的大小计算规则,并提供了多个实用示例(如礼品系统设计)。最后还介绍了联合体与枚举在工程中的组合使用模式,以及相关练习题和解答。这两种类型是C语言实现高效、可读性强的代码的重要工具。
2025-11-10 14:05:18
1265
6
原创 Java面向对象实验:类的设计、构造方法重载与图形面积计算
本文总结了Java面向对象编程实验,通过设计Student类和Area类实践了面向对象的核心概念。Student类实现了属性封装、构造方法重载、对象行为抽象和Java类库调用,展示了类的多方式初始化。Area类将数学公式封装为对象方法,实现了三角形和半圆面积计算。实验重点包括:1)通过private属性和set方法实现封装;2)多种构造方法重载提高灵活性;3)保持对象内部数据一致性;4)使用Calendar类获取系统时间。实验从基础语法延伸到面向对象设计思维,帮助学习者掌握从"写对代码"
2025-11-09 18:57:26
961
5
原创 C语言项目实战:从零构建“动态通讯录系统”——结构体·指针·动态内存·文件操作全掌握【超详细解析】
本文通过一个完整的C语言通讯录项目,系统讲解了结构体、指针、动态内存管理等核心知识点。项目采用多文件工程结构,实现动态扩容、文件持久化等实用功能。主要内容包括:1. 使用realloc实现动态数组扩容;2. 文件读写实现数据持久化;3. 多模块程序设计方法;4. 菜单驱动的程序架构。项目重点解决了初学者常见的动态内存管理、文件操作等难点,展示了C语言从语法到工程化开发的完整流程,是提升C语言实践能力的关键案例。通过本案例,学习者能够掌握数据结构设计、内存管理、文件操作等核心编程技能。
2025-11-09 18:20:51
878
2
原创 vs2022下位段的存储逻辑
C语言结构体位段(Bit Field)详解 本文介绍了C语言中结构体位段的概念、使用方法及应用场景。位段允许精确控制变量所占的二进制位数,适用于底层开发如操作系统内核、网络协议解析等。文章详细讲解了位段的内存分配机制、跨平台问题及使用注意事项,并以IP数据报头定义为例展示其实际应用。虽然位段能节省内存空间,但由于其实现依赖编译器和平台,不建议在可移植性要求高的项目中使用。最后强调应根据实际需求权衡使用位段或位运算替代方案。
2025-10-23 00:44:53
864
3
原创 从 C 到 Java:用“抽奖程序”理解 Java 的程序结构与面向对象思想
本文通过一个随机抽奖程序示例,帮助C语言学习者理解Java的面向对象特性。文章对比了C与Java在程序结构、函数封装、随机数生成等方面的差异: Java必须将代码封装在类中,而C语言直接使用函数 展示了工具类MyTools的封装方法,体现面向对象思想 解释了Java使用Random和Scanner类替代C的rand()和scanf() 分析了循环逻辑和变量作用域在Java中的实现方式 强调Java通过"类+对象"组织代码,而非C的过程式编程 该示例完整呈现了从C过渡到Java时需要掌握的
2025-10-22 19:36:56
691
1
原创 深入理解内存操作函数:memcpy、memmove、memset 与 memcmp
C语言内存操作函数详解,包括memcpy、memmove、memset和memcmp。文章通过函数原型、功能说明和示例代码,深入解析了这些底层内存操作工具的使用场景和实现原理。特别对比了memcpy和memmove在处理内存重叠时的差异,并提供了模拟实现代码。最后总结了四类函数的特性对比表,帮助开发者理解从"会用C"到"懂C"的关键内存操作机制。这些函数是系统级编程和算法优化的基础工具。
2025-10-22 00:19:12
346
1
原创 C语言中数据在内存中的存储原理详解
本文详细解析了C语言中数据在内存中的存储原理。主要内容包括:数据类型与内存分配的关系;整型采用补码存储的原因及实现;大小端模式对多字节数据存储顺序的影响;浮点数遵循的IEEE 754标准及其存储结构。文章通过代码示例验证了这些概念,并指出了常见陷阱,如无符号数溢出、有符号无符号混用等。掌握这些底层原理有助于更好地理解内存管理、调试代码和优化程序性能。
2025-10-21 23:54:50
737
3
原创 C语言结构体在内存中的存储与对齐规则详解
C语言结构体内存对齐规则详解:结构体大小不等于成员大小之和,而是遵循三大对齐规则:(1)成员按声明顺序存放;(2)起始地址必须是类型大小的整数倍;(3)总大小是最大对齐值的倍数。通过调整成员顺序可优化内存占用,如示例中结构体从12字节缩减到8字节。文章还介绍了嵌套结构体、数组存储、平台差异等要点,并建议使用offsetof()验证内存布局。掌握这些规则有助于编写高效、可移植的底层代码。
2025-10-18 22:28:05
786
5
原创 基于qsort模拟实现冒泡排序
本文通过冒泡排序模拟实现C语言中的qsort通用排序函数,展示了如何利用char*指针和函数指针实现类型无关的排序操作。核心思路包括:1) 将数据转换为字节指针实现内存操作;2) 通过自定义比较函数支持不同数据类型。作者提供了完整代码实现,包括整型和结构体排序示例,并分析了算法复杂度(O(n²)时间复杂度,O(1)空间复杂度)。虽然性能不如标准库的快速排序,但这种方法有助于深入理解指针、内存操作和通用函数设计原理。文章还提出了使用memcpy优化交换效率和改用快排算法的改进建议。
2025-10-16 22:38:20
656
5
原创 扫雷基础版的实现
二维数组的使用和遍历;随机数函数 rand()的应用;函数分解和模块化编程;边界条件的处理,比如输入非法坐标、重复输入等。实现递归展开功能(当周围没有雷时自动展开区域);增加难度选择和计时功能;使用图形界面(如 Windows API、SDL 或 Qt)让游戏更直观。扫雷游戏虽然简单,但逻辑完整,非常适合作为练手项目。希望这篇文章能给正在学习 C 语言的你一些启发。如果你对完整源码感兴趣,可以点击下面的链接,我已整理分享。扫雷基础版。
2025-09-17 14:47:00
1039
1
原创 Process_4 C语言程序的复习回顾
主要讲解一下,C语言学习的初级阶段所遇到数组的常见的,细小的知识点的错误,在就是关于函数栈帧的基本原理的分析和一些知识点。
2024-07-29 22:33:42
1098
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅