自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 问答 (1)
  • 收藏
  • 关注

原创 【数据结构_C语言】归并排序—文件类型

内排序:数据量相对少一些,可以放到内存中排序。外排序:数据量较大,内存中放不下,数据放到磁盘文件中,需要排序。

2024-07-22 22:19:51 151

原创 【数据结构】二叉树-2

设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头再来研究二叉树真正的创建方式。学习二叉树结构,最简单的方式就是遍历。2.非空:根节点,根节点的左子树、根节点的右子树组成的。

2024-07-16 11:19:41 1232

原创 【数据结构】二叉树-1

现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是 ,则它就是满二叉树。双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;

2024-07-15 11:45:36 1005

原创 【数据结构】栈的实现(含详细代码)

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守先进后出LIFO(Last In First Out)的原则。代码共含三个文件,分别为Stack.h(头文件和函数声明), Stack.c(函数实现) Test.c(main函数和执行测试)栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。压栈:栈的插入操作叫做进栈/压栈/入栈/,入数据在栈顶。出栈:栈的删除操作叫做出栈,出数据也在栈顶。

2024-07-08 11:21:46 1011

原创 【数据结构】栈和队列

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。压栈:栈的插入操作叫做进栈/压栈/入栈/,入数据在栈顶。出栈:栈的删除操作叫做出栈,出数据也在栈顶。

2024-07-01 14:32:34 1134

原创 【数据结构】算法的时间复杂度和空间复杂度

斐波那契数列的递归实现方式非常简洁,但简洁一定好吗?那该如何衡量其好与坏呢?

2024-06-30 20:28:54 881

原创 【数据结构】前言

数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值作为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。

2024-06-30 19:38:34 730

原创 【数据结构】链表

概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。3.从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续。1.从上图可看出,链式结构在逻辑上是连续的,但是在物理上不一定连续。备注:缓存利用率参考存储体系结构以及局部性原理。2.现实中的结点一般都是从堆上申请出来的。

2024-06-29 15:54:50 361

原创 【leetcode】138.随机链表的复制

深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点。给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。用一个由 n 个节点组成的链表来表示输入/输出中的链表。建立拷贝节点,拷贝节点接在原节点后面。返回复制链表的头节点。

2024-06-25 00:01:48 1398 1

原创 【数据结构】线性表:顺序表

所以现实中都是使用动态顺序表,根据需要动态分配的空间大小,所以下面我们实现动态顺序表。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删查改。

2024-06-24 11:32:27 782

原创 中断的输入和悬起行为

当中断输入脚(通常是低电平有效或高电平有效)被assert(即变为有效电平)时,如果中断使能位是设置的,中断控制器会将该中断请求标记为悬起状态。如果中断的悬起状态在中断服务例程开始执行之前被清除,那么中断请求将不再被处理,相当于中断被取消。中断服务例程在执行过程中,可以通过软件操作来重新设置中断的悬起位,从而实现中断的重新悬起。解析:中断的输入和悬起行为是中断处理中重要的概念。B. 如果在某个中断得到响应之前,其悬起状态被清除了,则中断取消。B、如果在某个中断得到响应之前,其悬起状态被清除了,则中断取消。

2024-06-22 21:24:18 1254 1

原创 力扣 面试题17.04.消失的数字

数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?输入:[9,6,4,2,3,5,7,0,1]解答思路:使用异或思想解题。输入:[3,0,1]

2024-06-15 10:04:09 2423

原创 【C语言】字符串左旋:实现一个函数,可以左旋字符串中的k个字符

先将要左旋的前三个家伙逆序(CBADEFG),然后将后半段也逆序(CBAGFED),最后整体逆序(DEFGABC)即可。这个思路当然可以,但是一次一次转毕竟太麻烦,就不能一次到位么?实现一个函数,可以左旋字符串中的k个字符。ABCD左旋一个字符得到BCDA。ABCD左旋两个字符得到CDAB。

2024-06-11 14:37:32 199

原创 【C语言】字符串逆序:写一个函数,可以逆序一个字符串的内容

【代码】【C语言】字符串逆序:写一个函数,可以逆序一个字符串的内容。

2024-06-11 13:34:43 324

原创 【C语言】写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换

(3)则将(1)步骤得到的00000000000000000000000000000000左移一位,此时因为奇数被保留,所以我们左移一位那么奇数位就变成偶数位,得到00000000000000000000000000000000。步骤(2)的偶数位保留,奇数位变为0只需要按位与(&)上10101010101010101010101010101010转成16进制就是:0xaaaaaaaa。(2)将00000000000000000000000000001010的偶数位保留,奇数位变为0。

2024-06-10 16:14:56 605

原创 【C语言】宏offsetof的模拟实现(计算结构体中某变量相对于首地址的偏移)

我们假设结构体起始地址就是0,这样其成员的地址取出来再强制类型转换为int便可以表示结构体中某个成员相对于起始位置的偏移量,这是一种很巧妙的思考方式,即可实现宏 offsetof 的模拟实现。首先我们应该特别留意 : offsetof 是一个宏,并非是一个函数!参数:第一个是结构体类型名称,第二个是结构体成员名。引用的头文件:<stddef.h>返回类型:size_t无符号整形。

2024-06-10 14:59:14 1380

原创 2024-06-04_翻译环境等_作业

需要注意的是,链接阶段只会链接调用了的函数/全局变量,如果存在一个不存在实体的声明(函数声明、全局变量的外部声明),但没有被调用,依然是可以正常编译执行的。经过预处理,会产生一个没有头文件(都已经被展开了)、宏定义(都已经替换了),没有条件编译指令(该屏蔽的都屏蔽掉了),没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。#define执行查找替换,#if可以区分是否编译,#undef可以反定义,也就是取消#define宏定义的东西,#end并没有这玩意,只有#endif,故选D。

2024-06-05 14:46:17 382

原创 2024-06-02_scanf/printf、fscanf/fprintf、sscanf/spintf对比等_作业

使用所学文件操作,在当前目录下放一个文件data.txt,写一个程序,将data.txt文件拷贝一份,生成data_copy.txt文件。说明:feof函数是在文件读取结束后,判断文件读取结束的原因的,是读取失败结束,还是遇到文件尾结束。D选项中,sprintf是把格式化的数据写到字符串中,与输出流无关。B.feof函数是在文件读取结束的时候,检测是否是因为遇到了文件结束标志EOF,而读取结束。从data.txt中读取数据存放到data_copy.txt文件中,直到文件结束。3.作业标题(2809)

2024-06-04 21:19:38 214 1

原创 第24讲:预处理详解

C语言设置了一些预定义符号,可以直接使用,预定义符号也是在预处理期间处理的。__FILE__ //进⾏编译的源⽂件__LINE__ //⽂件当前的⾏号__DATE__ //⽂件被编译的⽇期__TIME__ //⽂件被编译的时间__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义1000register//为 register这个关键字,创建⼀个简短的名字for;;//⽤更形象的符号来替换⼀种实现break;case。

2024-06-03 18:39:45 756 1

原创 第23讲:编译和链接

我们在 test.c ⽂件中每⼀次使⽤ Add 函数和 g_val 的时候必须确切的知道 Add 和 g_val 的地址,但是由于每个⽂件是单独编译的,在编译器编译 test.c 的时候并不知道 Add 函数和 g_val变量的地址,所以暂时把调⽤ Add 的指令的⽬标地址和 g_val 的地址搁置。Add 的指令重新修正,让他们的⽬标地址为真正的 Add 函数的地址,对于全局变量 g_val 也是类似的⽅法来修正地址。• 处理#include 预编译指令,将包含的头⽂件的内容插⼊到该预编译指令的位置。

2024-06-02 18:06:29 1179 1

原创 2024-05-27_枚举作业

AB是函数的基本功能,C选项比较特殊,malloc(0)是允许的,也会返回一个指针,只是没有空间所以不可使用而已。而位顺序类似小端,低地址在低处,所以39是低地址,在低位,38在高位,所以是3839,故选A。D:枚举是一种类型,有类型检查,但是#define定义的符号没有类型检查,就是简单的替换,使用虽然方便,但是也很容易导致问题,所以更加推荐使用枚举常量。解析:选择B项,枚举默认从0开始,所以X1是0,故Y1是1,给了数字后会根据数字向后推,那么Z1是255,A1是256,所以B1是257,故选B。

2024-06-02 16:50:24 1150

原创 2024-05-29_二进制文件和文本文件作业

f系列的输入输出函数都是作用于所有流的的,所以AC没问题,D的表述也没问题,fread做的就是二进制的活。B选项中,文件名可以不包含后缀名。程序只通过只读方式打开了一个文件,所以A排除,文中使用的fgetc,且没有’ ‘和’\n’相关的统计,所以排除CD,直接选B。C.将内存中的数据转化成ASCII码值的形式,并以ASCII码值的形式存储的文件就是文本文件。B.fopen打开文件的方式是"w",如果文件不存在,则创建该文件,打开成功。A.fopen打开文件的方式是"r",如果文件不存在,则打开文件失败。

2024-06-01 10:04:22 1841

原创 第22讲:文件操作

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

2024-05-30 14:58:51 827

原创 第21讲:动态内存管理

2.有时我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的得到相应的内存空间,我们一定会对内存的大小做灵活的的调整。当是情况2时,原有空间之后没有足够的空间,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使用。有时候我们需要的空间大小在程序运行的时候才能知道,那数组编译时开辟空间的方式就不能满足了。1.函数的功能是为num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为0.1.如果参数ptr指向的空间不是动态开辟的,那free函数的行为是未定义的。

2024-05-28 23:23:13 102

原创 2024-05-23_结构体概念等作业

解析:stutype是类型为stuct stu的结构体变量,不是结构体类型名。B.struct student 是用户定义的结构体类型。C.num, score 都是结构体成员名。A.struct 是结构体类型的关键字。D.stu 是用户定义的结构体类型名。

2024-05-26 01:15:51 873

原创 第20讲:自定义类型:联合和枚举

上述的结构其实设计的很简单,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。所以我们就可以把公共属性单独写出来,剩余属于各种商品本⾝的属性使⽤联合体起来,这样就可以介绍所需的内存空间,⼀定程度上节省了内存。性别有:男、⼥、保密,也可以⼀⼀列举。代码1输出的三个地址⼀模⼀样,代码2的输出,我们发现将i的第4个字节的内容修改为55了。联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,⾄少是最⼤成员的⼤⼩(因为联合⾄少得有能⼒保存最⼤的那个成员)。

2024-05-25 15:13:46 1976

原创 第19讲:自定义类型:结构体

位段的成员必须是 int、unsigned int 或signed int ,在C99中位段成员的类型也可以选择其他类型。位段的成员名后边有⼀个冒号和⼀个数字。⽐如:struct Aint _a:2;int _b:5;int _c:10;int _d:30;A就是⼀个位段类型。那位段A所占内存的⼤⼩是多少?

2024-05-24 10:27:42 180

原创 第18讲:数据在内存中的存储

两部分,符号位都是⽤0表⽰“正”,⽤1表⽰“负”,⽽数值位最⾼位的⼀位是被当做符号位,剩余的都是数值位。同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是。:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。:将原码的符号位不变,其他位依次按位取反就可以得到反码。原因在于,使⽤补码,可以将符号位和数值域统⼀处理;对于整形来说:数据存放内存中其实存放的是补码。在计算机系统中,数值⼀律⽤补码来表⽰和存储。整数的2进制表⽰⽅法有三种,即。相同的,不需要额外的硬件电路。

2024-05-20 23:05:45 845 1

原创 C语言 - strstr函数的模拟实现

【代码】C语言 - strstr函数的模拟实现。

2024-05-19 23:32:29 279 1

原创 第17讲:C语言内存函数

• 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。• 和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。• 如果source和destination有任何的重叠,复制的结果都是未定义的。memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。• ⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节。• 这个函数在遇到 ‘\0’ 的时候并不会停下来。对于重叠的内存,交给memmove来处理。

2024-05-18 16:19:14 887

原创 第16讲:字符函数和字符串函数

在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语言标准库中提供了一系列函数,接下来我们就学习一下这些函数。C语言中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。• strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标。上面的代码,我们将小写转大写,是-32完成的效果,有了转换函数,就可以直接使用toupper函数。的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是。

2024-05-17 13:30:08 956

原创 CSDN所给的MarkDown编辑模板

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:撤销:Ctrl/Command + Z重做:Ctrl/Command + Y加粗:Ctrl/Command + B斜体:Ctrl/Command + I标题:Ctrl/Command + S

2024-05-17 09:22:04 547

原创 第15讲:深⼊理解指针(5_1)

在学习操作符的时候,我们学习了 sizeof , sizeof 计算变量所占内存空间的⼤⼩,单位是字节,如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的⼤⼩。sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据。

2024-05-13 23:03:34 598

原创 C语言-使⽤qsort排序结构数据

使⽤qsort排序结构数据。

2024-05-12 12:44:35 375

原创 C语言-使⽤qsort函数排序整型数据

C语言-使⽤qsort函数排序整型数据。

2024-05-11 22:56:48 523 1

原创 C语言选择题-指针-数组指针选择题

A是二级指针数组,B是指针数组,D是数组指针。下面哪个是数组指针( )

2024-05-10 11:02:48 99

原创 数组指针选择题

关于数组指针的描述正确的是:( )B.数组指针是一种存放数组的指针。D.指针数组是一种指向数组的指针。A.数组指针是一种数组。C.数组指针是一种指针。

2024-05-09 16:41:26 308

原创 第13讲:深⼊理解指针(3_1)

⽬录。

2024-05-08 19:44:16 174 1

原创 第12讲:深入理解指针(2_2)

parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型⼀维数组,parr[i][j]就是整型⼀维数。数组我们学过了,之前也讲了,数组是可以传递给函数的,这个⼩节我们讨论⼀下数组传参的本质。上述的代码模拟出⼆维数组的效果,实际上并⾮完全是⼆维数组,因为每⼀⾏并⾮是连续的。的时候,传递的是数组名,也就是说本质上数组传参本质上传递的是数组⾸元素的地址。数的参数部分是本质是指针,所以在函数内部是没办法求的数组元素个数的。我们类⽐⼀下,整型数组,是存放整型的数组,字符数组是存放字符的数组。

2024-05-07 14:42:25 674 1

原创 第12讲:深入理解指针(2)

• sizeof(数组名),sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩,同理arr[i]应该等价于*(arr+i),数组元素的访问在编译器处理的时候,也是转换成⾸元素的地址+偏移。但是&arr和&arr+1相差40个字节,这就是因为&arr是数组的地址,+1操作是跳过整个数组的。我们发现数组名和数组⾸元素的地址打印出的结果⼀模⼀样,数组名就是数组⾸元素(第⼀个元素)的地。• &数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素。

2024-05-06 23:24:43 739

空空如也

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

TA关注的人

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