自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 通讯录(二)初始化与销毁

本文实现了一个基于顺序表的通讯录管理系统,主要包含以下模块:1)Contact.h定义联系人数据结构peoInfo,包含姓名、年龄、性别等字段;2)SeqList.h定义顺序表结构,将peoInfo作为数据类型;3)SeqList.c实现顺序表的核心操作(增删查改);4)3-23.c处理通讯录业务逻辑;5)test.c作为程序入口。系统采用模块化设计,通过顺序表存储联系人信息,支持初始化、销毁等基本功能,为后续功能扩展奠定了基础。

2026-03-24 17:49:38 440

原创 通讯录(一)

摘要:该代码实现了一个基于顺序表的通讯录管理系统。Contact.h定义了个人信息结构体peoInfo,包含姓名、年龄、性别、地址和电话等字段。SeqList.h定义了顺序表结构SL,将数据类型设为peoInfo并别名为Contact,提供了初始化、增删查改等基本操作接口。3-23.c实现了顺序表的底层逻辑,包括打印单条记录和全部记录的功能,其中打印功能采用格式化输出确保数据对齐。整个系统采用模块化设计,通过头文件包含和前置声明避免循环依赖问题。

2026-03-23 19:45:43 435

原创 动态顺序表的实现(修改)

本文介绍了顺序表(SeqList)的实现,分为头文件、实现文件和测试文件三部分。头文件SeqList.h定义了顺序表结构体(SL)和相关操作函数声明,包括初始化、插入、删除、查找和修改等功能。实现文件3-20.c包含了这些函数的具体实现。测试文件test.c通过SLTest01()函数演示了顺序表的各种操作:头插、尾插、任意位置插入、删除指定元素、头删、尾删、查找和修改等操作,并调用main()函数进行测试验证。整个程序展示了顺序表数据结构的完整实现和使用方法。

2026-03-21 09:00:00 355

原创 动态数据表的实现(查找)

本文实现了一个顺序表(SeqList)的数据结构,包含头文件(SeqList.h)、实现文件(3-20.c)和测试文件(test.c)。头文件定义了顺序表结构体(SL)和基本操作函数,包括初始化、插入(头插、尾插、任意位置)、删除(头删、尾删、指定位置、删除所有指定值)和查找等操作。实现文件完成了查找函数的具体实现。测试文件通过SLTest01()函数演示了各种操作的调用过程,包括插入多个元素、删除特定值、删除指定位置元素以及查找功能验证。整个程序展示了顺序表的基本操作和实际应用。

2026-03-21 08:00:00 448

原创 动态顺序表的实现(头删、尾删、任意位置删除)

本文介绍了顺序表(SL)的基本操作实现,主要包括四个功能模块:1)删除所有指定值X的元素(SLRemoveAll),通过循环查找并删除;2)头删(SLPopFront),将后续元素前移;3)尾删(SLPopBack),直接减小size;4)指定位置删除(SLErase)。每个功能都包含头文件定义、实现文件逻辑和测试文件演示,采用模块化编程思想。测试案例展示了从初始化、插入到各种删除操作的全流程,验证了顺序表操作的完整性和正确性。

2026-03-20 09:00:00 686

原创 动态顺序表实现(头插、尾插、任意位置插入)

本文介绍了顺序表(SeqList)的基本操作实现,主要包括头插、尾插和任意位置插入三种操作。通过头文件(SeqList.h)定义结构体和函数接口,实现文件(3-19.c)包含具体逻辑代码,测试文件(test.c)演示功能使用。头插操作(SLPushFront)将元素插入表头并移动后续元素;尾插操作(SLPushBack)在表尾添加元素;任意位置插入(SLInsert)可在指定位置插入元素并移动后续元素。测试程序通过初始化顺序表并依次调用三种插入操作,验证了功能的正确性。整个实现体现了模块化编程思想,为顺序表

2026-03-20 08:00:00 516

原创 动态顺序表(二)

本文介绍了顺序表的基本实现方法,主要包括容量检查和打印功能。在头文件SeqList.h中定义了顺序表结构体SL及相关函数接口。实现文件3-19.c包含具体逻辑代码:1)SLCheckCapacity函数用于检查并动态扩容,当容量不足时按2倍扩容;2)SLprint函数实现顺序表内容的格式化输出,显示当前大小和容量信息。代码通过断言确保指针有效性,并使用realloc进行动态内存调整,体现了顺序表的核心操作机制。

2026-03-19 15:41:48 168

原创 动态顺序表的实现

本文介绍了顺序表的初始化和销毁操作的实现方法。顺序表通过头文件(SeqList.h)定义数据结构(SL)和接口函数(SLInit、SLDestroy),实现文件(3-17-1.c)完成具体功能逻辑,测试文件(test.c)验证功能正确性。初始化操作将顺序表指针置空并清零size和capacity;销毁操作同样重置这些参数。整个实现采用模块化设计,通过头文件提供接口,隐藏内部实现细节。

2026-03-19 08:00:00 588

原创 顺序表专题(一)

本文介绍了数据结构的基础知识,重点讲解了顺序表的概念和特性。首先阐述了结构体、指针和动态内存管理等预备知识,然后定义数据结构是计算机存储组织数据的方式,能够反映数据内部构成及相互关系。接着详细说明顺序表作为线性表的一种,在数组基础上实现了增删改查操作,其物理结构连续但逻辑结构不一定连续。最后将顺序表分为静态和动态两种类型,指出动态顺序表通过动态内存管理实现容量调整。全文系统梳理了数据结构的基础概念和顺序表的核心特征。

2026-03-18 09:00:00 138

原创 预处理详解(三)

本文介绍了C语言预处理器的三个主要功能:1. 命令行定义允许在编译时通过命令行参数定义符号,实现同一源文件在不同环境下生成不同版本的程序;2. 条件编译通过#ifdef等指令选择性编译代码段,特别适用于调试代码管理;3. 头文件包含区分""和<>两种方式,前者先在本地目录查找,后者直接查找标准库路径。此外还简要提及了其他预处理指令如#error、#pragma等。这些预处理功能为C程序提供了灵活的编译控制和代码组织方式。

2026-03-18 08:00:00 390

原创 预处理详解(二)

本文介绍了宏替换的基本规则和注意事项。宏替换分为三个步骤:检查参数中的#define符号并进行替换、将宏参数替换为实际值、再次扫描结果文件。文章对比了宏与函数的优缺点:宏在速度和类型通用性上占优,但可能增加代码长度且难以调试。同时介绍了#运算符(字符串化)和##运算符(符号合并)的特殊用法。最后提出了宏命名的约定(全大写)以及#undef指令的使用场景。全文系统地阐述了宏的定义、使用技巧及其与函数的差异。

2026-03-17 11:40:07 207

原创 预处理详解(一)

摘要:本文介绍了C语言预处理器的相关概念,包括预定义符号、#define定义常量和宏的使用方法。预定义符号如__FILE__、__LINE__等可直接获取编译信息;#define可定义常量和带参数的宏,但需注意参数列表与名称紧邻,并使用括号避免运算优先级问题。特别强调宏参数不应带有副作用(如++、--等),因其会被多次求值,建议改用内联函数。文中提供了测试代码示例说明各概念的具体应用。

2026-03-17 09:00:00 337

原创 编译和链接(二)

文章摘要:本文详细介绍了C/C++程序从源代码到可执行文件的完整编译过程。首先通过预处理阶段处理宏定义、头文件包含和条件编译等指令;然后进行词法分析、语法分析和语义分析生成汇编代码;再通过汇编器转换为机器指令;最后通过链接器解决多文件间的调用问题。此外还说明了程序运行时的内存分配、函数调用栈机制以及程序终止方式。整个流程涵盖了预处理、编译、汇编、链接和运行五个关键阶段。

2026-03-16 11:15:38 302

原创 编译和链接(一)

摘要:C语言程序执行涉及翻译环境和运行环境。翻译环境通过编译(预处理、编译、汇编)和链接将源代码转换为可执行文件,其中多个.c文件先各自生成目标文件(.obj或.o),再与链接库一起链接成最终程序。运行环境则负责执行生成的机器指令。该过程实现了从源代码到可执行程序的完整转换。

2026-03-16 10:44:18 172

原创 文件操作(四)

本文介绍了C语言中四个常用的文件操作函数:fscanf、fprintf、fread和fwrite。fscanf用于格式化输入,从文件中读取数据并存储到指定变量;fprintf用于格式化输出,将数据写入文件。fread和fwrite则用于二进制文件的读写操作,分别实现从文件读取二进制数据和向文件写入二进制数据。每个函数都提供了原型说明、功能描述和示例代码,展示了如何使用这些函数进行文件操作。这些函数是C语言文件处理的基础工具,适用于文本和二进制文件的读写需求。

2026-03-13 12:02:37 752

原创 文件操作(三)

本文介绍了C语言中四个常用的文件操作函数:1. fgetc函数:从文件流中读取单个字符,返回读取的字符或EOF。2. fputc函数:向文件流写入单个字符,成功返回写入字符,失败返回EOF。3. fgets函数:从文件流读取字符串,最多读取num-1个字符或遇到换行符。4. fputs函数:将字符串写入文件流,不包含字符串结束符'\0'。每个函数都提供了原型说明、功能描述和示例代码,包括读写文件的操作演示。这些函数是C语言进行文件操作的基础工具。

2026-03-13 11:09:55 462

原创 文件操作(二)

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息,如文件的名字、文件状态及文件当前的位置等这些信息,这些信息保存在一个结构体变量中,该结构体类型是由系统声明的取名FILE。定义pf是一个指向FILE类型数据的指针变量,可以使pf指向某个文件的文件信息区(是一个结构体变量),通过该文件信息区中的信息就能够访问该文件,也就是说通过文件指针变量能够间接找到与它关联的文件。这三个流的类型:FILE*是通常称为文件指针,C语言中就是通过的文件指针来维护流的各种操作的。

2026-03-12 15:42:36 367

原创 文件操作(一)

本文介绍了文件的基本概念及其在程序设计中的重要性。文件分为程序文件(如.c、.obj、.exe)和数据文件,用于持久化存储程序运行时的数据。文件名包含路径、主干和后缀三部分。根据数据组织形式,文件可分为二进制文件(直接存储内存中的二进制数据)和文本文件(以ASCII码形式存储)。使用文件可以避免程序退出时数据丢失的问题。

2026-03-12 11:07:28 169

原创 C/C++中的内存区域划分

上栈下堆中间映,数据代码底下停。栈自管,堆手控,全局静态住数据,代码只读永不动。

2026-03-10 16:22:16 208

原创 C语言:柔性数组

柔性数组是C99标准中允许结构体最后一个成员为未知大小数组的特性。其特点包括:前面必须至少有一个成员,sizeof不计算其内存,需用malloc动态分配额外空间。使用时通过一次内存分配同时满足结构体和数组成员需求,具有内存连续(提升访问性能)、单次分配释放(简化管理)和节省空间等优势。示例代码展示了如何为包含柔性数组的结构体分配内存并进行操作。

2026-03-10 16:03:13 89

原创 动态内存管理(二)

摘要:本文介绍了C语言中动态内存管理的三个关键函数:calloc用于分配并清零初始化的数组内存;realloc用于灵活调整已分配内存块的大小;以及常见的动态内存错误类型,包括空指针解引用、越界访问、错误释放等。重点比较了calloc与malloc的区别,强调了realloc的内存保留特性,并列举了6种常见的内存管理错误操作,对正确使用动态内存具有指导意义。

2026-03-09 21:56:09 162

原创 动态内存管理(一)

本文介绍了C语言中动态内存管理的关键方法。传统数组内存分配存在固定大小的局限性,而动态内存分配则提供了灵活性。重点讲解了malloc函数的使用:它分配指定大小的未初始化内存块,返回void*指针,需进行空指针检查;以及free函数的正确用法:仅释放动态分配的内存,对NULL指针无操作。二者均需包含stdlib.h头文件。合理使用这些函数能有效管理内存资源,避免内存泄漏等问题。

2026-03-09 20:29:38 172

原创 自定义类型:联合与枚举(二)

本文介绍了C语言中联合体和枚举类型的特性与应用。联合体大小计算遵循两个规则:至少等于最大成员大小,且需对齐到最大对齐数的整数倍。通过联合体可判断机器字节序(示例代码展示了大端/小端检测方法)。枚举类型用于定义具名整型常量,默认从0开始递增,具有增强代码可读性、类型检查严格、调试方便等优势。枚举适用于状态、选项等离散值场景,比#define更安全且遵循作用域规则。

2026-02-15 12:13:42 334

原创 自定义类型:联合和枚举(一)

联合体(共用体)是一种特殊的数据类型,其成员共享同一块内存空间。与结构体不同,联合体的大小由最大成员决定,所有成员地址相同。测试代码显示,修改一个成员会影响其他成员的值。结构体成员独立存储("并排坐"),而联合体成员重叠存储("叠着住")。联合体适用于同一时间只需使用一个成员的场景,可节省内存空间。

2026-02-15 11:38:56 262

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

本文介绍了结构体的三个重要特性:内存对齐、传参方式和位段实现。内存对齐规则包括成员变量按对齐数整数倍排列,结构体总大小为最大对齐数的整数倍,目的是用空间换时间提升性能。结构体传参分为值传递和引用传递两种方式。位段通过冒号指定成员位数来节省空间,但存在跨平台兼容性问题。这些特性在实际编程中需要根据性能、空间和可移植性需求进行权衡选择。

2026-02-13 18:31:14 558

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

本文介绍了C语言中结构体的基本概念和使用方法。首先解释了结构体是由不同类型成员变量组成的集合,并展示了结构体的声明语法。然后通过学生结构体示例,详细说明了两种初始化方式:按成员顺序初始化和指定顺序初始化,并附有完整代码示例。最后简要提及结构体自引用的概念,即结构体包含指向同类型指针成员,这种特性常用于实现链表等动态数据结构。全文通过具体代码演示了结构体的声明、初始化和基本应用。

2026-02-13 17:44:25 447

原创 C语言内存函数(二)

摘要:本文介绍了C语言中两个重要的内存操作函数。memset函数用于将指定内存块的前n个字节设置为特定值,示例展示了如何将字符串前6个字符替换为'x'。memcmp函数则用于比较两个内存块的前n个字节,返回值为0表示匹配,非零值表示不匹配。这两个函数在内存操作和比较中具有重要作用,使用时需包含string.h头文件。

2026-02-07 14:04:30 307

原创 C语言内存函数(一)

本文介绍了memcpy和memmove两个内存操作函数的使用及模拟实现。memcpy用于从源内存复制指定字节到目标内存,不检查'\0'终止符,并给出了标准库函数使用示例和模拟实现代码。memmove功能类似但能处理内存重叠的情况,同样提供了使用示例。两者的模拟实现都通过指针操作逐字节复制数据,memcpy直接复制而memmove需要处理重叠内存的特殊情况。文中代码示例展示了如何在实际编程中应用这些函数进行内存操作。

2026-02-06 14:39:58 675

原创 整数在内存中的存储

摘要:本文介绍了整数在内存中的存储方式,包括原码、反码和补码三种二进制表示方法,其中补码是实际存储形式。同时阐述了大小端字节序的概念:大端模式将数据高位存于低地址,小端模式则相反。最后提供了一个C语言代码示例,通过检查内存中字节的存储顺序来判断当前系统的大小端模式。这些概念对理解计算机底层数据存储机制具有重要意义。

2026-02-06 13:43:07 382

原创 字符函数和字符串函数(四)

本文介绍了C语言中三个常用字符串处理函数。1.strstr用于定位子串,返回首次出现位置的指针;2.strtok通过分隔符拆分字符串为标记序列;3.strerror根据错误码返回对应的错误信息字符串指针。文中给出了strstr的示例代码,演示了如何查找并替换子串。这些函数都需要包含string.h头文件,在处理字符串操作时非常实用。

2026-02-05 08:47:01 375

原创 字符函数和字符串函数(三)

摘要:本文介绍了C语言中三个常用的字符串操作函数:strncpy、strncat和strncmp。strncpy用于复制指定长度的字符串,需注意目标字符串的终止符处理;strncat用于追加指定长度的字符串到目标字符串末尾;strncmp则比较两个字符串的前n个字符。每个函数都配有使用说明和示例代码,展示了它们的基本用法和注意事项。这些函数比对应的非长度限制版本更安全,能有效防止缓冲区溢出问题。

2026-02-04 10:41:24 482

原创 字符函数和字符串函数(二)

本文介绍了C语言中三个常用字符串处理函数:strcpy、strcat和strcmp的使用方法及模拟实现。strcpy用于字符串复制,strcat用于字符串连接,strcmp用于字符串比较。每个函数都提供了标准库用法示例和自定义实现代码,包括参数检查、指针操作和返回值处理。自定义实现通过assert宏确保参数有效性,并遵循与标准库相同的功能逻辑。这些函数是C语言字符串操作的基础,理解其原理有助于深入掌握字符串处理技术。

2026-02-01 14:50:50 871

原创 单身狗题解

摘要:本文介绍了两种在数组中查找唯一出现一次数字的方法。第一种采用双重循环暴力查找,时间复杂度O(n²);第二种利用异或运算特性实现高效查找,时间复杂度O(n)。重点解析了异或方法的实现原理(相同数异或为0,不同数异或保留原值),并提供了包含普通整数、零和负数在内的多场景测试案例,验证了算法的正确性和通用性。

2026-01-30 12:09:41 668

原创 字符函数和字符串函数(一)

本文介绍了C语言中常用的字符处理函数及其实现方法。第一部分讲解了字符分类函数(如islower)和转换函数(如tolower/toupper),并提供了字符串大小写转换的示例代码。第二部分详细介绍了strlen函数的用法和三种模拟实现方式:计数器法、递归法和指针差值法,每种方法都配有完整的测试代码。这些内容涵盖了C语言中基础的字符处理操作,包括类型判断、大小写转换以及字符串长度计算,为C语言编程提供了实用的参考范例。

2026-01-30 11:50:15 1072

原创 数组(三)

本文介绍了C语言中二维数组的内存存储方式和C99变长数组特性。二维数组元素在内存中是连续存储的,可通过打印地址验证。C99引入的变长数组(VLA)允许用变量定义数组大小,但不能初始化且VS2022不支持。文章还包含两个编程练习:1)字符从两端向中间汇聚的动画效果实现;2)二分查找算法实现,通过比较中间值不断缩小查找范围。最后预告了下一期关于《单身狗编程题》的内容。

2026-01-25 18:21:44 914

原创 数组(二)

本文介绍了C语言中二维数组的基本概念和使用方法。主要内容包括:1)二维数组的定义和创建语法;2)四种初始化方式(不完全、完全、按行初始化及省略行的特殊情况);3)二维数组的访问方式,通过行列下标定位元素;4)使用双重循环实现数组的输入输出操作。文章通过示例代码演示了二维数组的典型应用场景,为初学者提供了实用的编程参考。最后预告了后续关于数组的进阶内容。

2026-01-25 14:44:05 1150

原创 数组(一)

本文介绍了C语言中数组的基本概念和使用方法。数组是相同类型元素的集合,可分为一维和多维数组。一维数组创建时需要指定元素类型和大小,初始化可以是完全或不完全的。数组元素通过下标访问,下标从0开始。sizeof运算符可用于计算数组大小和元素个数。数组在内存中连续存储,通过地址可验证其存储方式。掌握这些基础知识对后续编程学习非常重要。

2026-01-22 11:26:33 898

原创 深入理解指针(二)

本文介绍了C语言指针的关键概念:1. const修饰指针的两种用法:修饰指针内容(*左边)或指针本身(*右边);2. 指针运算包括加减整数、指针相减和关系运算;3. 野指针的成因(未初始化、越界、空间释放)及规避方法(初始化、检查有效性);4. assert断言的作用和优缺点;5. 指针传址调用与传值调用的区别。文章通过生活化比喻帮助理解,并提供了实用口诀和注意事项。

2026-01-21 15:28:01 1407

原创 深入理解指针(一)

通过了解我们知道,32位机器,假设有32根地址总线,每根地址线出来的电信号转换为数字信号后是一或者零,那我们把32根地址线产生的二进制序列当做一个地址,那么一个地址就是32个比特位,需要四个字节才能存储,如果指针变量是用来存放地址的,那么指针变量的大小就得是四个字节的空间才可以;指针变量的大小是与类型无关的,只要是指针类型的变量,在相同的平台下,大小都是相同的。这里P左边写的是int*,*说明P是指针变量,而且前面的int是在说明P指向的是整型类型的对象。//取出a的地址并存放到指针变量p中。

2026-01-21 13:11:26 617

原创 分支与循环(二)

本文介绍了C语言中的循环结构及其控制语句。主要内容包括:1) for循环的语法结构和使用示例;2) while和for循环的区别,指出for循环结构更集中;3) do-while循环的特点,强调其先执行后判断的特性;4) break和continue语句的作用,分别用于终止循环和跳过当前循环;5) 循环嵌套的应用场景;6) goto语句的利弊分析。文章通过具体代码示例说明了各种循环结构的用法和适用场景,并比较了它们的优缺点。

2026-01-18 11:51:28 317

空空如也

空空如也

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

TA关注的人

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