自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据结构 04(线性:双向链表)

本文介绍了双向链表的数据结构及其实现方法。主要内容包括:1.链表分类:重点分析了单链表和双向带头循环链表两种常用结构;2.双向链表实现细节:包括创建头文件、哨兵位初始化、空间申请、销毁、打印等基础操作;3.核心操作实现:详细说明了尾插/头插、尾删/头删、查找、任意位置插入删除等操作的代码实现;4.完整代码展示:提供了.h和.c文件的完整实现代码。文章特别强调了带头双向循环链表的优势,指出虽然结构复杂但实现简单,是实际应用中最常用的链表结构。

2025-08-31 20:04:15 373

原创 数据结构 03(线性:单链表)

本文介绍了单链表的基本概念、实现原理和操作函数。单链表是一种非连续存储结构,由包含数据和指针的节点组成。文章详细讲解了链表节点的创建、打印、插入(头插、尾插、任意位置插)、删除(头删、尾删、指定位置删)以及链表的销毁等核心操作。通过C语言代码示例展示了链表的实现过程,包括头文件定义、内存申请、各种操作函数的编写。最后提供了完整的单链表实现代码,涵盖了链表的基本功能和操作接口。

2025-08-30 23:07:14 340

原创 数据结构 02(线性:顺序表)

本文介绍了动态顺序表的实现方法。顺序表是一种线性数据结构,采用连续存储空间实现。文章详细讲解了顺序表的结构定义、初始化、扩容机制,以及各种基本操作的实现,包括尾插、头插、尾删、头删、查找、任意位置插入/删除等。通过typedef定义数据类型和结构体,实现了顺序表的动态管理,包括使用realloc进行动态扩容,并提供了完整的头文件和源文件代码示例。文章强调了内存管理的重要性,特别指出在扩容时需要使用临时变量防止错误,以及操作完成后必须进行销毁释放内存。

2025-08-29 23:40:04 1016

原创 数据结构 01(数据结构相关与复杂度)

数据结构与算法是计算机科学的核心内容。数据结构研究数据组织方式(如线性表、树、图等),算法则是解决问题的计算步骤。评价算法优劣主要看时间复杂度和空间复杂度,通常用大O表示法来衡量。时间复杂度反映执行次数随数据规模的增长趋势,空间复杂度衡量额外内存需求。随着硬件发展,如今更关注时间复杂度。常见复杂度等级包括O(1)、O(logn)、O(n)、O(n²)等。递归算法的复杂度需考虑递归深度。理解这些概念对编写高效程序至关重要。

2025-08-26 21:44:20 753

原创 零基础C语言学习日志26(预处理详解)

C语言设置了一些预定义符号,可以直接使用,预定义符号也是在预处理期间处理的。for(初始化;判断;调整)//这三个部分都有可以省略,但是判断部分一旦被省略,就意味着恒成立。有一些计算机语言中虽然支持switch语句但是case后面是不需要加break。在 define 定义标识符的时候,要不要在最后加上;?建议不要加上;,这样容易导致问题。

2025-03-07 16:48:17 648

原创 零基础C语言学习日志25(编译和链接)

目录翻译环境和运行环境翻译环境 预处理(预编译) 编译词法分析语法分析语义分析汇编链接运行环境在 ANSIC的任何一种实现中,存在两个不同的环境。第1种是翻译环境,计算机只能执行二进制指令,在这个环境中源代码被转换为可执行的机器指令(二进制指令)。第2种是执行环境,它用于实际执行代码。那翻译环境是怎么将源代码转换为可执行的机器指令的呢?这里我们就得展开开讲解一下翻译环境所做的事情。其实翻译环境是由编译和链接两个大的过程组成的,而编译又可以分解成: 预处理(有些书也叫预编译)、编译、汇编三个过程。一个C

2025-03-07 11:08:59 673

原创 零基础C语言学习日志24(文件操作)

磁盘(硬盘)上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。fputcfgetc。

2025-03-07 10:25:37 582

原创 零基础C语言学习日志23(动态内存管理)

目录为什么要有动态内存分配malloc和free函数calloc和realloc函数常见的动态内存错误经典笔试题分析练习1练习2练习3练习4柔性数组柔性数组的特点柔性数组的使用柔性数组的优势总结C/C++中程序内存区域划分创建变量的本质是向内存申请空间为什么存在动态内存分配:1. 变量和数组的方式不够灵活2. 使用动态内存分配可以自己来维护内存的使用生命周期这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。1. 如果开辟成功,则返回一个指向开辟好空间的指针。2. 如果开辟失败,则返回一

2025-03-06 21:36:13 507

原创 零基础C语言学习日志22(自定义类型:联合和枚举)

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。在C语言中是可以的,但是在C++是不行的,C++的类型检查比较严格。像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型。5. 枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用。给联合体其中一个成员赋值,其他成员的值也跟着变化。2. 当最大成员大小不是最大对齐数的整数倍的时候,1. 联合的大小至少是最大成员的大小。1. 增加代码的可读性和可维护性。

2025-03-06 20:01:24 359

原创 零基础C语言学习日志21(自定义类型:结构体)

位段的声明和结构是类似的,有两个不同!1. 位段的成员必须是int、unsigned int 或signed int ,在C99中位段成员的类型也可以选择其他类型。2. 位段的成员名后边有一个冒号和一个数字。3. 位段节省空间。

2025-03-05 21:01:29 674

原创 零基础C语言学习日志20(数据在内存中的存储)

是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容,保存在内存的低地址处。是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容,保存在内存的高地址处。

2025-03-05 16:59:16 959

原创 零基础C语言学习日志19(C语言内存函数)

函数 memcpy 从 source 的位置开始向后复制 num 个字节的数据到 destination 指向的内存位置这个函数在遇到 '\0’ 的时候并不会停下来。如果 source 和 destination 有任何的重叠,复制的结果都是未定义的。只关注要拷贝的数据在哪里,要存放到哪里,拷贝几个字节。至于内存中存放什么数据,什么类型的数据,都不重要!!!

2025-03-03 23:02:18 187

原创 零基础C语言学习日志18(字符函数和字符串函数)

(注:strtok函数会改变被操作的字符串,所以被strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。字符串以 '\0’ 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。4. strtok函数的第一个参数为 NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。在str1指向的字符串中找出str2指向的字符串第一次出现的位置。

2025-03-02 22:09:36 503

原创 零基础C语言学习日志17(深入理解指针(6))

strlen一定要找到0。

2025-03-01 22:49:16 155

原创 零基础C语言学习日志16(深入理解指针(5)(qsort函数)

回调函数就是通过函数指针调用的函数如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

2025-02-28 21:32:03 293

原创 零基础C语言学习日志15(深入理解指针(4))

字符数组中可以存放字符串,字符数组的内容可以修改。常量字符串:和数组是非常相似的,也是在一个连续空间中存放了多个字符,但是常量字符串的内容不能修改。《剑指offer》中收录了一道和字符串相关的笔试题,我们一起来学习一下!str1 == str2 比较的是数组首元素的地址。str3 == str4 比较的是两个指针变量中存放的地址。为什么str3和str4相等呢?这里str3和str4指向的是一个同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域,

2025-02-28 20:08:43 541

原创 零基础C语言学习日志14(深入理解指针(3))

那么在函数内部写sizeof(arr) 计算的是一个地址的大小(单位字节)而不是数组的大小(单位字节)。sizeof(数组名) :sizeof的括号中单独放一个数组名的时候,数组名表示整个数组,计算出的是整个数组的大小,单位是字节。这就要学习数组传参的本质了,上个小节我们学习了:数组名是数组首元素的地址;那么在数组传参的时候,传递的是数组名,也就是说。从上面的例子中可以看到:arr 和 p 是等价的,都表示数组第一个元素的地址,类型也相同。&数组名 :这里的数组名也表示整个数组,取出的是这个数组的地址。

2025-02-27 22:03:31 272

原创 零基础C语言学习日志13(深入理解指针(2))

assert()的缺点是,因为引入了额外的检查,增加了程序的运行时间。一般我们可以在 Debug 中使用,在 Release 版本中选择禁用 assert 就行,在 VS 这样的集成开发环境中,在 Release 版本中,直接就是优化掉了。assert() 的使用对程序员是非常友好的,使用 assert()有几个好处:它不仅能自动标识文件和出问题的行号,还有一种无需更改代码就能开启或关闭 assert()的机制。变量是可以被修改的,如果把变量的地址给一个指针变量,通过指针变量也可以修改这个变量。

2025-02-25 20:04:22 446 1

原创 零基础C语言学习日志12(深入理解指针(1))

内存与地址的关系就与酒店与房间号的关系差不多,我们知道计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,我们买电脑的时候,电脑上内存是8GB/16GB/32GB等,那这些内存空间如何高效的管理呢?其实也是把内存划分为一个个的内存单元,每个内存单元的大小取1个字节(byte)。补充:一个比特位可以存储一个2进制的位1或者0首先,必须理解,计算机内是有很多的硬件单元,而硬件单元是要互相协同工作的。所谓的协同,至少相互之间要能够进行数据传递。

2025-02-24 21:15:10 812

原创 零基础C语言学习日志11(操作符详解)

整数的2进制表示方法有三种,即原码、反码和补码。有符号整数的三种表示方法均有符号位和数值位两部分,2进制序列中,最高位的1位是被当做符号位,剩余的都是数值位。符号位都是用0表示“正”,用1表示“负”。正整数的原、反、补码都相同。负整数的三种表示方法各不相同。原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。补码:反码+1就得到补码。对于整形来说:数据存放内存中其实存放的是补码。为什么呢?

2024-11-28 16:45:39 720

原创 零基础C语言学习日志10(函数递归)

所以斐波那契数的计算,使用递归是非常不好的,我们就得想迭代的方式解决。函数不返回,函数对应的栈帧空间就一直占用,所以如果函数调用中存在递归调用的话,每一次递归函数调用都会开辟属于自己的栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。上述就是一个简单的递归程序,只不过上面的递归只是为了演示递归的基本形式,不是为了解决问题,代码最终也会陷入死递归,导致栈溢出。任何一次函数调用,都会申请资源,申请的是内存中栈区的资源,函数是可以实现递归的,但是不能无限制的递归。),比如举例一可以用迭代的方式解决。

2024-11-25 23:01:13 381 1

原创 零基础C语言学习日志9(VS实用调试技巧)

bug本意是 “昆虫” 或 “虫子” ,现在一般是指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题,简称程序漏洞。当我们发现程序中存在的问题的时候,那下一步就是找到问题,并修复问题。这个找问题的过程叫称为调试,英文叫debug(消灭bug) 的意思。调试一个程序,首先是承认出现了问题,然后通过各种手段去定位问题的位置,可能是逐过程的调试,也可能是隔离和屏蔽代码的方式,找到问题所的位置,然后确定错误产生的原因,再修复代码,重新测试。

2024-10-30 11:57:17 344

原创 零基础C语言学习日志8(函数)

1.ret_type fun_name(形式参数)2.{3.4.}1 .ret_type是用来表示函数计算结果的类型,有时候返回类型可以是void,表示什么都不返回。2.fun_name取名字方便使用函数。3.形式参数就相当于工厂中送进去的原材料,函数的参数也可以是void,明确表示函数没有参数。如果有参数,要交代清楚参数的类型和名字,以及参数个数。函数的调用一定要先声明,函数声明中参数只保留类型,省略掉名字也是可以的。函数的定义是总特殊的声明。

2024-10-27 17:56:39 1043

原创 零基础C语言学习日志7(数组)

前面学习的数组被称为维数组,数组的元素都是内置类型的,如果我们把一维数组做为数组的元素,这时候就是二维数组,二维数组作为数组元素的数组被称为三维数组,二维数组以上的数组统称为多维数组。我们可以用sizeof函数计算数组中到底有几个元素,因为sizeof可以计算出数组的大小,也可以计算出单个元素的大小,两者相除即可计算出数组中的元素个数。像一维数组一样,我们如果想研究二维数组在内存中的存储方式,我们也是可以打印出数组所有元素的地址的。中的常量值是用来指定数组的大小的,这个数组的大小是根据实际的需求指定就行。

2024-10-27 16:53:25 842

原创 零基础C语言学习日志6(猜数字游戏)

C语⾔提供了⼀个函数叫 rand,这函数是可以⽣成随机数的。rand函数会返回⼀个伪随机数。如下生成5个随机数:虽然一次运行中产生的5个数字是相对随机的,但是下一次运行程序生成的结果和上一次一模一样rand函数生成的随机数是伪随机的,伪随机数不是真正的随机数,是通过某种算法生成的随机数。真正的随机数的是无法预测下一个值是多少的。而 rand 函数是对一个叫“种子"的基准值进行运算生成的随机数。如果要生成不同的随机数,就要让种子是变化的。

2024-10-26 19:01:10 379

原创 零基础C语言学习日志5(分支和循环语句2)

C语⾔提供了3种循环语句,while就是其中⼀种,接下来就介绍⼀下while语句。while语句的语法结构和if语句非常相似,只不过while语句会循环。如下图,用while循环打印出数字一到十。

2024-10-26 17:33:40 276

原创 零基础C语言学习日志4(分支和循环语句1)

在使用switch语句的时候,我们经常可能遇到一种情况,比如switch后的表达式中的值无法匹配代码中的case语句的时候,这时候要不就不做处理,要不就得在switch语句中加入default语句。有时候,它可以运行,但很容易出现意料之外的结果。|| :逻辑或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)。&& : 逻辑与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。,那么第二个条件不会被评估,因为无论第一个条件如何,整个表达式的结果都会是真。

2024-10-14 21:52:54 289

原创 零基础C语言学习日志3(数据类型和变量2)

printf()的作用是将参数文本输出到屏幕。它名字里面的f代表format(格式化),表示可以定制输出文本的格式。printf()不会在行尾自动添加换行符,运行结束后,光标就停留在输出结束的地方,不会自动换行。为了让光标移到下一行的开头,可以在输出文本的结尾,添加一个换行符\nprintf()是在标准库的头文件(standard input output 标准输入输出操作)定义的。使用这个函数之前,必须在源码文件头部引入这个头文件。

2024-10-14 19:43:19 760

原创 零基础C语言学习日志2(C语言常见概念(2)+数据类型和变量1)

C语言提供了丰富的数据类型来描述生活中的各种数据。使用整型类型来描述整数,使用字符类型来描述字符,使用浮点型类型来描述小数。所谓“类型”,就是相似的数据所拥有的共同特征,编译器只有知道了数据的类型,才知道怎么操作数据。

2024-10-14 18:27:51 640 1

原创 零基础C语言学习日志1(C语言常见概念)

C语言学习

2024-09-28 19:43:21 278

空空如也

空空如也

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

TA关注的人

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