- 博客(45)
- 收藏
- 关注
原创 Linux ——— 虚拟地址、页表、物理地址与 waitpid 和进程管理中的核心概念和技术
本文主要探讨了Linux进程管理中的几个核心概念和技术,包括: 进程创建与终止:通过fork()创建子进程,使用exit()或_exit()终止进程,并分析了两者在缓冲区处理上的差异。 进程等待与回收:详细介绍了wait()和waitpid()系统调用,包括阻塞/非阻塞模式、多子进程回收机制,以及如何避免僵尸进程。 程序替换:深入解析exec系列函数(execl/execv/execle等),包括参数传递方式、环境变量继承规则,以及如何执行二进制程序和脚本文件。 进程地址空间:分析了虚拟地址空间的布局,包括
2025-12-24 11:10:57
754
原创 C++ ——— 仿函数的使用、继承方式、赋值转换规则、菱形继承与虚继承
摘要:本文系统阐述了C++面向对象编程中的关键概念与技术。在继承方面,详细解析了public/protected/private三种继承方式对成员访问权限的影响,以及派生类与基类对象间的赋值转换规则(切片机制)。针对菱形继承问题,对比分析了普通继承导致的二义性和数据冗余问题,并深入讲解了虚继承(virtual)通过虚基类表实现共享基类成员的解决方案。在类模板方面,探讨了非类型模板参数的应用场景和特化机制(全特化与偏特化),展示了如何通过模板定制化处理特殊类型。此外,文章还剖析了基类与派生类六大成员函数(构造
2025-12-24 11:10:50
976
原创 oj题 ——— STL oj题
本文摘要总结了多个力扣和牛客网经典编程题的解题思路与代码实现,涵盖字符串处理、栈/队列应用、二叉树遍历等常见算法题型。主要内容包括: 字符串处理类题目 第一个唯一字符(哈希统计+两次遍历) 反转字母(双指针跳过非字母字符) 验证回文串(双指针+字符处理) 字符串相加(模拟手工加法过程) 栈/队列应用 最小栈设计(辅助栈维护最小值) 栈序列合法性验证(辅助栈模拟) 逆波兰表达式求值(栈计算后缀表达式) 二叉树算法 层序遍历(队列+BFS分层处理) 优先队列应用 第K大元素(大顶堆特性利用) 所有解法均注重时间
2025-12-18 19:31:48
894
原创 Linux ——— Git的核心操作流程、进程状态及环境变量相关知识
摘要:本文详细解析了Git的核心操作流程、Linux进程状态及环境变量相关知识。Git部分介绍了克隆仓库、提交代码和推送远程的核心三板斧操作;进程状态部分深入剖析了运行态(R)、睡眠态(S)、深度睡眠态(D)、停止态(T)和僵尸态(Z)的特征与处理方式;环境变量部分则讲解了PATH等变量的作用机制及不同用户执行时的差异。通过代码示例和命令输出分析,系统性地阐述了这些Linux核心概念的实际应用场景和底层原理,为开发者提供了全面的技术参考。
2025-12-18 19:31:41
817
原创 Linux ——— 常用的文件传输工具和编辑器配置方法
本文介绍了Linux系统中常用的文件传输工具和编辑器配置方法。主要内容包括:1. rz/sz命令的使用:通过lrzsz工具集实现本地与服务器间的文件传输,rz用于上传文件到服务器当前目录,sz用于下载服务器文件到本地。2. Vim编辑器的使用:详细说明了Vim的四种工作模式(命令模式、插入模式、底行模式和替换模式)及其常用操作指令,如移动光标、复制粘贴、保存退出等。3. Vim个性化配置:通过创建和编辑~/.vimrc文件实现永久性配置,如显示行号、设置缩进等。4. 其他实用工具:包括安装epel扩展源、s
2025-12-10 13:44:50
855
原创 Linux ——— sudo权限管理和GCC编译工具链的核心操作
本文介绍了Linux系统中sudo权限管理和GCC编译工具链的核心操作。在sudo权限部分,详细说明了如何通过修改/etc/sudoers文件为普通用户授权,使其能够执行特权命令。GCC编译部分涵盖了完整的编译流程:从预处理(gcc -E)、编译(gcc -S)、汇编(gcc -c)到链接(gcc),并解释了各阶段生成的文件特性。此外,还介绍了make工具的使用方法,包括如何编写makefile定义编译规则,以及.PHONY伪目标的作用。最后,通过touch命令演示了如何通过修改文件时间戳来触发make的重
2025-12-10 13:44:36
852
原创 C++ ——— 动态内存管理和泛型编程的核心机制
本文全面解析了C++中动态内存管理和泛型编程的核心机制。在动态内存管理方面,详细对比了new/delete与malloc/free的区别,重点阐述了new自动调用构造函数、delete自动调用析构函数的特性,以及严格匹配new[]/delete[]的重要性。同时深入剖析了operator new/delete的底层内存操作原理和定位new的显式构造函数调用机制。在泛型编程方面,系统讲解了函数模板和类模板的语法、实例化规则及应用场景,展示了模板如何实现代码复用和类型安全。通过大量代码示例,清晰呈现了这些核心概
2025-12-04 13:36:20
1003
原创 Linux ——— 系统中的用户身份切换、文件权限管理、特殊权限和粘滞位设置
摘要:本文详细介绍了Linux系统中的用户身份切换、文件权限管理和特殊权限设置。su命令用于切换用户身份,默认切换到root用户;su-命令会加载目标用户的完整环境。Linux用户分为root用户(UID=0)和普通用户(系统用户和登录用户)。文件权限通过chmod命令管理,权限分为读(r)、写(w)、执行(x),对目录而言x权限表示可进入目录。chown和chgrp分别用于修改文件所有者和所属组。umask控制新创建文件的默认权限,通过屏蔽位计算实际权限。粘滞位(t)是目录的特殊权限,用于共享目录防止用户
2025-12-04 13:36:10
821
原创 C++ ——— 初始化列表、友元机制和内部类等核心语法特性
本文详细讲解了C++中的初始化列表、友元机制和内部类等核心语法特性。 初始化列表部分重点介绍了: 初始化列表的核心作用是在成员变量定义时完成初始化 const成员变量和引用成员必须在初始化列表中初始化 初始化顺序遵循成员声明顺序而非列表顺序 友元机制部分包括: 友元函数可以访问类的私有成员,常用于运算符重载 友元类是类级别的访问授权,所有成员函数都能访问被友元类的私有成员 友元关系是单向的且不可传递 内部类部分阐述了: 内部类天生是外部类的友元,可直接访问外部类私有成员 内部类与外部类内存完全独立 内部类的
2025-12-03 15:42:58
721
原创 C++ ——— 构造函数、析构函数、拷贝构造函数等特殊成员函数的特性与应用
本文详细分析了C++中struct与class的区别,以及构造函数、析构函数、拷贝构造函数等特殊成员函数的特性与应用。主要内容包括: C++的struct支持成员函数、访问控制、继承等面向对象特性,而C语言的struct仅能包含成员变量; 构造函数在对象创建时自动调用,用于初始化成员变量,支持重载和初始化列表; 析构函数在对象生命周期结束时自动执行资源清理,编译器会为未显式定义的类生成合成析构函数; 拷贝构造函数实现对象深拷贝,避免浅拷贝导致的资源冲突问题; 运算符重载通过operator关键字扩展自定义类
2025-12-03 15:42:49
683
原创 Linux ——— 常用的命令操作
本文摘要: 本文详细介绍了Linux系统中常用的命令操作,从基础文件管理到高级文本处理工具。主要内容包括: 文件操作命令: 基础命令:ls查看文件、pwd显示路径、cd切换目录、mkdir创建目录、rm删除文件/目录 高级操作:find查找文件、grep文本搜索、zip/unzip压缩解压、tar归档压缩 用户管理: useradd创建用户、passwd设置密码、userdel删除用户 文本处理: echo输出文本、cat查看文件、head/tail查看文件首尾、less分页查看 grep文本搜索、管道符|
2025-11-23 23:26:06
1041
原创 C++ ——— 基本特性解析
本文详细介绍了C++中的命名空间、引用、内联函数、auto关键字和范围for循环等重要特性。命名空间用于解决标识符冲突问题,支持嵌套和部分展开;引用作为变量的别名,必须初始化且绑定后不可更改;内联函数通过减少调用开销提升效率;auto实现变量类型自动推导;范围for循环简化了数组/容器的遍历。这些特性共同提升了C++代码的组织性、安全性和执行效率,是C++编程中的核心知识点。
2025-11-23 23:25:39
1156
原创 数据结构 ——— 八大排序算法的思想及其实现
本文深入分析了多种经典排序算法,包括冒泡排序、直接插入排序、希尔排序、直接选择排序、堆排序、快速排序(Hoare、挖坑法、前后指针法、三路划分)、归并排序和计数排序。从算法原理、代码实现到时间/空间复杂度进行了详细对比,特别针对快速排序探讨了优化策略(三数取中、非递归实现),归并排序的小区间优化,以及计数排序的适用场景。结果显示,快速排序在平均情况下表现最优(O(nlogn)),归并排序稳定性最佳,而计数排序在小范围整数数据中效率最高(O(n+range))。不同算法根据数据特性和规模各具优势,为实际应用提
2025-11-15 00:03:53
1004
原创 oj题 ——— 链式二叉树oj题
本文介绍了5个二叉树OJ题的解法:1. 相同的树(LeetCode100):递归比较两棵树的结构和节点值是否完全相同,分4种情况处理;2. 单值二叉树(LeetCode965):检查所有节点值是否相等,递归验证当前节点与子节点的值是否一致;3. 对称二叉树(LeetCode101):主函数处理根节点,辅助函数递归判断左右子树是否镜像对称;4. 另一棵树的子树(LeetCode572):使用"相同的树"函数作为辅助,递归检查root的每个子树是否与subRoot匹配;5. 二叉树遍历(牛客
2025-11-12 23:04:09
1014
原创 oj题 ——— 单链表oj题
本文总结了单链表常见OJ题的解法,包括移除链表元素、合并有序链表、链表的中间结点、反转链表、删除重复节点等。通过双指针、快慢指针、哨兵节点等技巧,实现高效操作。重点分析了快慢指针找中间节点和环形链表入口的原理,以及深拷贝随机链表的"三步法"。所有解法都注重边界条件处理,时间复杂度O(n),空间复杂度O(1),适合面试和算法学习。
2025-10-30 22:16:07
1141
原创 oj题 ——— 栈和队列oj题
本文讲解了栈和队列的经典OJ题解法。主要内容包括:1. 有效的括号:利用栈结构匹配括号对,通过判断括号类型和顺序实现;2. 用队列实现栈:借助两个队列通过元素转移模拟栈的后进先出特性;3. 用栈实现队列:使用两个栈实现元素顺序反转,模拟队列的先进先出特性;4. 设计循环队列:采用环形数组结构实现空间复用,通过指针判断空满状态。每种解法都详细说明了数据结构设计思路、核心操作实现逻辑和特殊情况处理。
2025-10-30 22:15:49
989
1
原创 C语言 ——— 预处理指令
摘要:C语言预定义符号(如__FILE__、__LINE__等)由编译器提供,在预处理阶段被替换为文件路径、行号或编译时间等信息。宏定义通过#define实现文本替换,#和##操作符可转换参数为字符串或拼接标识符。#undef取消宏定义。条件编译(#if/#elif/#else/#endif)根据不同条件编译代码。头文件保护机制(#ifndef或#pragma once)防止重复包含。这些特性增强了代码的灵活性和可维护性。(148字)
2025-10-29 14:43:18
936
原创 oj题 ——— 顺序表oj题
本文总结了几道常见的数组操作OJ题目及其解法: 消失的数字:通过等差数列求和公式计算完整序列总和,减去现有元素总和得到缺失数字,时间复杂度O(n)。 撞色搭配:使用异或运算找出两个独特的颜色编号,利用异或性质分组处理,时空复杂度分别为O(n)和O(1)。 移除元素:双指针原地操作,一个标记替换位置,一个寻找非目标元素,时间复杂度O(n)。 删除有序数组重复项:双指针法比较元素,保留唯一项并保持顺序,时间复杂度O(n)。 合并有序数组:逆向双指针比较元素,从尾部填充结果数组,时间复杂度O(m+n)。 轮转数组
2025-10-29 14:42:33
564
原创 C语言 ——— 文件操作的核心概念与函数使用
摘要:本文详细介绍了C语言文件操作的核心概念与函数使用。重点内容包括:1. FILE结构体本质及其包含的文件描述符、缓冲区等关键信息;2. fopen函数的打开模式(r/w/a等)及使用注意事项;3. 相对路径和绝对路径的表示方法;4. 文件读写函数(fputc/fgetc/fputs/fgets等)的使用规范;5. 随机读写函数(fseek/ftell/rewind等)的定位操作;6. 文件结束判定feof的正确用法及常见误区。文中通过代码示例演示了各函数的实际应用,并强调了错误检查、及时关闭文件等重要编
2025-10-10 19:46:22
718
原创 C语言 ——— 动态内存管理
本文介绍了C语言中四种动态内存管理函数(malloc、free、calloc、realloc)和柔性数组的核心特性与使用方法。malloc用于申请连续内存,需检查返回值并手动释放;free用于释放动态内存,防止内存泄漏;calloc在分配内存同时初始化为0;realloc可调整已分配内存的大小。柔性数组是结构体中最后一个不指定大小的数组成员,需结合动态内存分配使用,具有内存连续、管理简单的优势。这些机制共同构成了C语言灵活高效的内存管理体系,适用于各种需要动态内存管理的场景。
2025-10-10 13:12:48
1092
原创 C语言 ——— 自定义类型
摘要:C语言结构体内存对齐通过offsetof宏计算成员偏移量,揭示成员间存在内存间隙。对齐规则包括首成员偏移为0,后续成员按对齐数存储,结构体总大小需满足最大对齐数倍数。嵌套结构体时,外层需考虑内层最大对齐数。使用#pragma pack(1)可强制1字节对齐,消除填充间隙。位段(bit-field)按位分配内存,仅限整型成员,节省空间。联合体(union)成员共用内存空间,大小由最大成员决定,修改任一成员会影响其他成员数据,适用于内存敏感场景和类型转换。
2025-10-06 18:22:34
996
原创 C语言 ——— 常用的字符串处理函数和内存操作函数的实现原理与使用规范
文章摘要: 本文详细解析了C语言中常用的字符串处理函数(strlen、strcpy、strcat、strcmp、strstr、strtok)和内存操作函数(memcpy)的实现原理与使用规范。重点包括:1)各函数的参数设计(如const修饰符的安全意义)和返回值语义;2)通过模拟实现代码(如my_strlen的遍历计数、my_memcpy的内存重叠处理)揭示核心逻辑;3)关键特性说明(如strtok的分割机制、strcmp的字典序比较)。全文强调指针操作、'\0'结束符的底层依赖,以及缓冲区溢出等安全隐患的
2025-10-05 16:27:02
695
原创 C语言 ——— 整型和浮点数在内存中的存储方式
文章摘要:本文详细解析了整型和浮点数在内存中的存储方式。整型存储涉及原码、反码、补码转换,正负数采用不同编码规则,并通过大小端模式决定字节序。浮点数遵循IEEE754标准,由符号位S、尾数M和阶码E组成:S决定正负,M(存储时省略固定整数1)决定精度,E(采用偏置码存储)决定范围。以5.5f为例,其单精度存储格式为0x40B00000(小端序显示为0000B040),通过S=0、E_store=129、M=011的二进制科学计数法实现精确表示。
2025-09-30 11:19:37
641
原创 C语言 ——— 指针的核心概念与高级应用
本文主要探讨C语言中指针的核心概念与高级应用。首先介绍了指针偏移的步长由指针类型决定,并通过代码演示说明int和char指针在加减操作时的不同偏移量。接着详细解析了指针解引用、指针数组、数组指针等重要概念,强调指针类型不仅决定步长,还决定内存操作范围。文章还深入讲解了函数指针及其数组的使用,包括如何通过函数指针实现回调函数机制,并以模拟qsort函数为例展示如何实现通用排序功能。最后通过实际代码演示了如何利用指针数组统一管理多个同类型函数,提升代码灵活性。全文通过大量代码示例,系统性地阐述了指针在C语言中的
2025-09-26 17:00:11
610
原创 C语言 ——— 移位操作符、按位操作符、结构成员访问操作符和表达式求值规则
本文详细介绍了C语言中的移位操作符、按位操作符、结构成员访问操作符和表达式求值规则。主要内容包括: 移位操作符(<<和>>)的操作原理,强调操作对象是整型数据的补码二进制位,并解释了原码、反码、补码的概念及转换规则。 按位操作符(&、|、^)的运算规则,通过具体示例演示了每种操作符的计算过程。 结构成员访问操作符(.和->)的使用方法,说明了如何通过结构体变量或指针访问成员。 表达式求值过程中的隐式类型转换和算术转换规则,包括整型提升和数据截断现象。 文章通过代码示例详
2025-09-24 13:28:44
709
原创 C语言 ——— 数组的基本概念和使用方法
本文介绍了C语言中数组的基本概念和使用方法,重点讲解了一维数组和二维数组的创建、初始化、访问方式以及在内存中的存储特点。数组通过下标引用操作符[]访问元素,且所有元素在内存中连续存储。文章还探讨了数组越界问题及其规避方法,以及数组名的特殊含义(通常为首元素地址,但在sizeof和&操作时例外)。最后通过冒泡排序案例演示了数组作为函数参数的使用技巧,强调数组传参本质是传递指针,函数内修改会影响原数组。这些知识为C语言数组编程提供了基础指导。
2025-09-19 21:33:40
1003
原创 C语言 ——— 汇编代码分析函数栈帧的创建与销毁过程
本文通过汇编代码分析函数栈帧的创建与销毁过程。重点介绍了局部变量的创建机制(在栈帧分配后初始化)、函数参数传递方式(从右至左压栈)、形参与实参的关系(值相同但空间独立),以及函数返回机制(通过寄存器传递返回值)。文章详细解析了ebp和esp寄存器在维护栈帧中的作用,并以Add函数为例,展示了从参数传递到结果返回的完整调用流程,揭示了函数调用背后的底层实现原理。
2025-05-13 22:32:14
960
原创 C语言 ——— 函数的核心知识
本文摘要: 本文系统介绍了C语言函数的核心知识,包括库函数(如strcpy)的使用方法、自定义函数的编写技巧(如交换变量、求最大值、素数判断等),以及二分查找等实用算法实现。重点讲解了函数的声明、定义、调用机制,并通过递归专题深入剖析了递归的原理与应用场景,包括数字逐位打印、字符串长度计算等典型案例。文中还涉及函数嵌套调用、链式访问等进阶用法,并通过"printf链式调用"等趣味代码演示了函数特性。最后,通过限制临时变量的字符串长度计算题,展示了递归解决问题的独特思维方式。全文以代码演示
2025-05-05 23:26:14
1004
原创 C语言 ——— 分支循环语句
本文主要介绍了C语言中的分支循环语句、getchar/putchar函数以及goto语句的使用方法。内容包括:1. 单分支、多分支和switch语句的结构与应用;2. 多个编程练习的实现(判断奇数、阶乘计算、二分查找、素数判断、最大公约数等);3. getchar和putchar函数的用法及输入缓冲区处理;4. 用户登录场景模拟和猜数字游戏的实现;5. goto语句的用途,包括跳出深度嵌套和编写关机程序。通过具体代码示例,展示了这些语法结构的实际应用场景和注意事项,帮助读者掌握C语言基础编程技巧。
2025-04-23 22:52:54
1168
原创 C语言 ——— 关键概念和语法结构
本文摘要主要介绍了C语言基础中的关键概念和语法结构,包括main函数、变量类型、常量、字符串处理、控制语句、循环结构、指针等核心内容。文章首先详细讲解了main函数作为程序入口的不同定义形式,以及sizeof操作符的用法。接着区分了全局变量和局部变量的作用域和生命周期,并介绍了extern关键字的外部声明功能。在常量部分,涵盖了字面常量、const修饰的常变量、#define定义的标识符常量和枚举常量四种形式。字符串处理方面重点说明了'\0'作为结束标志的重要性,以及%s和strlen函数的行为特点。控制结
2025-04-10 23:04:49
1163
原创 数据结构 ——— 堆的概念 及 C语言实现堆
本文摘要: 堆是一种完全二叉树数据结构,分为大堆(父节点≥子节点)和小堆(父节点≤子节点)。物理结构使用数组存储,逻辑结构为完全二叉树。实现了堆的初始化、释放、插入、删除等操作。插入时采用向上调整算法维持堆结构,删除堆顶元素时先交换首尾节点再向下调整。提供了判断堆空、获取元素个数、访问堆顶元素等功能。关键算法包括:向上调整(插入时从子节点到根节点比较交换)、向下调整(删除时从父节点到子节点比较交换)。代码包含完整的Heap.h头文件和Heap.c实现文件。
2024-10-31 10:36:10
902
原创 数据结构 ——— C语言实现链式队列
本文详细介绍了链式队列的实现方法。首先阐述了队列的基本概念(先进先出)和两种实现方式(数组队列效率低,链式队列更优)。重点讲解了链式队列的结构设计,包括节点结构(包含数据和指针)和队列整体结构(头尾指针和大小计数)。文章提供了完整的代码实现,涵盖了初始化、入队(尾插)、出队(头删)、访问队头队尾、获取队列大小、判空、销毁等核心操作,每个函数都配有详细的实现说明和测试方法。通过头文件Queue.h和源文件Queue.c的组织,给出了完整的链式队列解决方案。
2024-10-24 09:00:00
2537
原创 数据结构 ——— C语言实现数组栈
本文介绍了数组栈的实现方法。栈是一种遵循先进后出原则的线性表,只能在固定端(栈顶)进行插入和删除操作。文章比较了链式栈和数组栈的实现差异,重点讲解了数组栈的结构设计:使用动态数组存储数据,通过top指针标记栈顶位置(初始化为-1)。详细实现了数组栈的核心操作,包括初始化、入栈(尾插)、出栈(尾删)、访问栈顶、判断空栈、获取栈大小等函数。特别说明了扩容策略(初始4,2倍增长)和top指针的逻辑处理。最后提供了完整的头文件和实现文件代码,展示了如何通过数组高效实现栈数据结构。
2024-10-22 07:30:00
1318
原创 数据结构 ——— C语言实现带哨兵位双向循环链表
本文介绍了带哨兵位双向循环链表的概念与实现。相比无哨兵位单向不循环链表,该结构通过引入哨兵位节点、双向指针和循环链接,有效解决了尾插效率低(O(N))、查找前驱节点困难等问题。文章详细阐述了链表结构定义、初始化方法,并实现了包括头尾插入删除、查找节点等核心操作,所有操作时间复杂度均为O(1)。特别说明了哨兵位的自循环初始化对空链表处理的优势。最后提供了完整的.h和.c文件实现,展示了这种链表结构在简化边界条件处理、提高操作效率方面的优势。
2024-10-14 07:00:00
1987
原创 数据结构 ——— C语言实现无哨兵位单向不循环链表
本文详细介绍了单链表的数据结构实现与操作。首先分析了动态顺序表的缺陷(时间复杂度高、空间浪费等),进而引出单链表的优势。文章详细讲解了单链表节点的结构设计,包括数据域和指针域的组成。重点阐述了单链表各项操作的实现方法:创建节点、打印链表、头插尾插、头删尾删、查找节点、指定位置插入删除等。每个操作都配有详细的代码实现和逻辑分析,并针对不同情况(空链表、单节点、多节点)进行了分类处理。最后提供了完整的头文件和实现文件代码,展示了单链表在C语言中的具体实现方案。
2024-09-30 07:00:00
1933
原创 数据结构 ——— C语言实现动态顺序表
摘要:本文详细介绍了动态顺序表的实现方法。顺序表是用连续存储单元存储数据的线性结构,本质上是数组,分为静态和动态两种。静态顺序表使用固定长度数组,存在空间浪费或不足的问题;动态顺序表通过动态开辟数组空间,可按需扩容。文章重点讲解了动态顺序表的实现过程,包括初始化、扩容、增删查改等核心操作,提供了完整的代码实现(SeqList.h和SeqList.c)。关键操作包括:尾部插入/删除、头部插入/删除、中间位置插入/删除、查找和修改数据等,并给出了相应的测试示例。动态顺序表通过realloc实现扩容,比静态顺序表
2024-09-25 18:49:55
2068
原创 数据结构 ——— 算法的空间复杂度
摘要:本文通过三个例题讲解了空间复杂度的计算方法。空间复杂度衡量算法运行时临时占用的存储空间大小,使用大O渐进表示法。例题1展示常数空间O(1),例题2演示线性空间O(N),例题3说明递归调用产生的O(N)空间消耗。与时间复杂度不同,空间复杂度计算的是算法运行时的额外空间需求,且空间可重复利用。文中强调栈空间在编译时已确定,重点分析函数运行时申请的额外空间。
2024-09-23 15:41:50
1005
原创 数据结构 ——— 算法的时间复杂度以及常见的时间复杂度计算例题
本文介绍了算法时间复杂度的概念及大O渐进表示法。通过代码示例分析了三种常见时间复杂度:常数级O(1)、线性级O(N)和平方级O(N²)。重点阐述了递归算法的时间复杂度计算,包括斐波那契数列的指数级O(2^N)复杂度。文章还讨论了二分查找的对数级O(logN)复杂度,并强调实际分析时应关注最坏情况。大O表示法通过保留最高阶项来简化复杂度描述,忽略常数因子和低阶项,能更清晰地反映算法随输入规模增长时的效率变化趋势。
2024-09-23 06:00:00
1331
原创 C语言 ——— 模拟offsetof宏;写一个宏,将一个整数的二进制位的奇数位和偶数位交换
摘要:介绍两种实用宏的实现方法。1. 模拟offsetof宏:#define my_offsetof(type,member) (size_t)&(((type*)0)->member),通过将0强制转换为结构体指针,获取成员地址来计算偏移量。2. 交换整数二进制奇偶位宏:#define SWAP(n) (n=(((n&0xaaaaaaaa)>>1)+((n&0x55555555)<<1))),使用掩码分别提取奇数位和偶数位后进行位移交换。两种宏都通过位
2024-09-14 19:30:11
946
原创 C语言 ——— 在控制台实现通讯录(增删查改、动态开辟内存空间,文件存储联系人)
摘要:本文实现了一个基于结构体的动态通讯录系统,支持联系人信息的增删改查和展示功能。系统采用模块化设计,分为test.c、Contacts.h和Contacts.c三个文件。核心功能包括:1)使用动态内存管理实现通讯录容量自动扩展;2)通过文件操作实现联系人信息的持久化存储;3)提供直观的菜单界面和错误处理机制。该系统实现了联系人信息(姓名、年龄、性别、电话、住址)的结构化存储,并支持二进制格式的文件读写操作,确保数据在程序关闭后仍可保留。
2024-08-21 16:24:34
668
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅