自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 树和二叉树

在前面,我们学习了顺序表,链表,栈和队列,这些其实都是线性结构的,线性结构指的是数据元素之间存在着一对一的线性关系的数据结构。我们今天学的树和二叉树则是一种新的结构,树形结构,树形结构指的是数据元素之前存在着一对多的树形关系的数据结构。

2024-07-11 19:29:11 624

原创 栈和队列题目详解

在前面我们学习了栈和队列,,当我们了解了这些之后,我们就可以用到栈和队列的特性来简单的做一些题目了。

2024-07-11 00:14:56 348

原创 队列与循环队列

在之前我们学习了栈,我们知道栈的特点是后进先出,我们今天学习的队列,它是先进先出的。

2024-06-26 18:05:39 907

原创 顺序栈与链式栈

我们在声明链式栈的时候,我们这里使用了两个结构体,其中一个结构体声明链式栈里的数据节点,另一个结构体声明栈的结构,其中里面有个指向栈顶指针,还有一个记录栈内有效数据个数的size,这样我们在获取栈内有效数据个数的时候不需要遍历链表,时间复杂度从O(N)变成O(1)这里我们在声明顺序栈的结构的时候,这个top可以是指向栈顶元素的,那我们在进行栈的初始化就需要将他初始化为-1,如果top是指向栈顶元素的下一个,那我们就需要将他的初始化设置为0。这里如果我们用单链表的形式实现栈的话,出栈:栈的删除操作叫做出栈。

2024-06-26 00:05:50 735

原创 时间复杂度与空间复杂度题目讲解

在前面我们了解到了时间复杂度与空间复杂度,这里我们就可以尝试一下做一些关于时间复杂度与空间复杂度的题目。

2024-06-15 00:41:09 795

原创 时间复杂度与空间复杂度

在我们之前有时候会提到O(N)这样的概念,那么这个O(N)到底是什么呢?我们今天就来学习了解一下。

2024-06-15 00:04:16 617

原创 数据结构双向链表

这里我们知道了双向链表的结构,那我们就可以定义节点//数据//指向下一个节点的指针//指向前一个节点的指针}ln;

2024-05-31 21:25:38 666 1

原创 单链表经典算法题理解

当我们学习了单链表之后,我能可以尝试的刷一下题了,以下分享一下几道题的解法。

2024-05-29 22:22:02 1353

原创 数据结构单链表

我们知道节点是由数据和指向下一个节点的指针组成int data;//数据//指向下一个节点的指针。

2024-05-29 20:03:31 1090

原创 数据结构顺序表实现通讯录

想必大家也都用过手机上面的通讯录吧,手机上面的通讯录有着许多的功能,可以新建联系人,删除联系人,查找联系人,修改联系人等等一系列的功能,我们其实也可以使用数据结构中的顺序表来模拟实现一下这样功能。本章主要讲述利用顺序表来实现一个简单的通讯录项目。

2024-05-24 17:26:53 1076

原创 数据结构顺序表

/类型重命名,为了方便后续替换类型//定长数组int size;//顺序表当前有效的数据个数}sl;这里,我们使用了定长数组,那么它就存在一个缺陷,就是这个数组给大了,浪费空间,给小了,空间不够。//类型重命名,为了方便后续替换类型//指向动态开辟的数组int size;//顺序表当前有效的数据个数//顺序表空间可存储数据个数}sl;这里,我们使用指针类型,方便我们后续使用动态内存开辟函数来调整空间的大小。size:表示了顺序表里面存储了多少个有效数据。

2024-05-24 08:45:00 983

原创 C语言文件操作

文件是指,这些数据可以是文本,图片,程序,音频,视频等多种形式。在我们磁盘(硬盘,比如我们计算机里面的c盘,d盘)上面的文件就是文件。在程序设计中,我们一般谈的文件从文件功能的角度来分,一般有两种,程序文件和数据文件。

2024-05-15 23:35:16 648

原创 c语言柔性数组

在c99中,结构体的最后一个元素允许是未知大小的数组,这个就是柔性数组。

2024-05-12 22:46:05 532

原创 c语言动态内存管理

在c和c++中都会大量使用动态内存管理,使用c和c++实现数据结构的时候,也会使用动态内存管理我们在写代码的时候,一般会这样向内存申请空间但是我们发现,上面的这种写法有两个特点:1. 空间开辟的大小是固定的2. 数组在申明的时候,必须指定数组的长度,数组空间一旦确定了大小就不能调整但是对于空间的需求,不仅仅是上述的情况,有时候我们需要的空间大小在程序运行的时候才能知道,那数组在编译时开辟空间的方式就不能满足了。

2024-05-10 22:44:34 778 1

原创 c语言自定义类型(二)

在前面,我们提到了c语言中可以有自定义类型,我们学习了结构体struct,还有两个自定义类型enum枚举和union联合体没有了解,接下来我们对这两个自定义类型进行学习。

2024-05-10 09:45:00 1020 1

原创 c语言中自定义类型

我们知道,传值调用,形参是实参的一份临时拷贝,那我们还需要再内存中开辟一块空间,如果这个结构体够大呢,那么就会开辟更大的空间,反之,传址调用,我们传一个地址过去,是地址大小不是4个字节(x86)就是8个字节(x64)。在c语言中,有内置类型,比如int,char,short,float,double...等等,这些都是c语言本身支持的现成的类型。4.如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有对齐数(含嵌套结构体中成员的对齐数)的整数倍。

2024-05-08 08:15:00 531 1

原创 c语言数据在内存中的存储

思路:我们知道大端字节序是把大的字节内容保存在前面,小端字节序是把小的字节内容保存在前面,那我们只需要取出它的第一个字节,我们拿1来做例子,如果拿出来的是01,那么它就是大端字节序,如果拿出来的是00。那么它就是小端字节序。浮点数的指数E等于 1 - 127(或者1 - 1023),即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数,这样做是为了表示±0,以及接近于0的很小的数字。对于32位的浮点数,最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M。

2024-05-04 21:33:57 665 1

原创 c语言内存操作函数

思路:我们知道它有一个参数num单位是字节,那我们就可以一个字符一个字节进行赋值,那我们就需要用到char*类型的指针,char*类型的指针+1跳过一个字符,利用循环,遍历完num个字节。虽然对于有重叠部分的memcpy()也能完成拷贝工作,但是memcpy()只是针对于没有重叠的完成拷贝工作就行了,对于重叠的部分,我们可以用memmove()函数来完成。在c语言中,有着各式各样的函数,今天我们来学习一下c语言中的内存操作函数。思路:这个函数和strncmp()函数一样,我们还是一个字节一个字节的比。

2024-05-02 13:55:43 648 1

原创 c语言字符函数与字符串函数

这里我们要知道strlen()函数返回的值是size_t,是无符号整数,那么两个无符号整数相减得到的也会是一个无符号的整数,虽然它是-3,但是它是无符号整数,肯定是会比0大的,所以结果是

2024-04-30 21:01:17 738 2

原创 c语言数组与指针题目理解

2.*--*++cpp+3,这么多运算符,怎么算的呢,首先肯定是先算++cpp,cpp在前面已经++了指向的是cp数组的第二个元素的地址,cpp再次++,指向的是cp数组第三个元素的地址,解引用得到(c+1),然后 --(c+1)得到的是cp的第四个元素的地址,解引用得到第四个元素,指向的是c数组的第一个元素的地址,地址+3,跳过三个字节,地址就从E跳到了E,所以后面的打印结果为ER。这里p指向的是a[0],带入表示之后相当于打印了a[0][0],就是整个二维数组,第一行第一个元素,就是1。

2024-04-28 18:17:08 598

原创 冒泡排序与qsort函数

我们知道,qsort能接收任意类型的数据,是因为它的有几个参数是void*的,void*可以接收任意类型的指针,所以我们在冒泡排序中也可以改成用void*来接收。如果想要实现逆序,我们只需要把比较条件里面的p1和p2交换一下位置就可以了,这里就不演示了,感兴趣的可以自己下去试试。我们之前提到过,冒泡排序只能用来排序一种类型的数据,那我们能不能模仿qsort来实现一个冒泡排序的函数呢?根据这样,我们就完成了第一步,在然后,我们用冒泡排序的思想,两两相邻元素进行比较。看完了画图分析,我们就可以写代码了。

2024-04-25 23:39:58 124 1

原创 c语言函数指针数组

但是呢,我们发现这个代码会有一些问题,比如说,我们想要给这样的代码增加一些新的功能,那么这个case语句会越来越长,而且,还有一个问题是,这个case语句里面有好多重复的代码。当然,其实我们除了使用函数指针数组的方式来修改最先开始的代码,其实我们还有一种办法在创建一个calc函数,把case里面的计算逻辑封装在calc函数里面,但是又有问题了。我们知道,函数我们只需要知道地址就可以进行调用了,那我们就可以把进行函数的地址以参数的形式传递给calc函数就可以了。回调函数就是一个通过函数指针调用的函数。

2024-04-24 20:32:12 272 1

原创 c语言指针(三)

根据数组名是首元素地址的规则,二维数组的数组名表示的就是第一行的地址,那么第一行的一维数组的类型就是int[5];在之前我们的学习过程中,我们提到过怎么理解指针变量,举了一个int类型指针的例子,那我们可以通过这样的一个例子来写出字符指针。这里加上了一个p2在括号里面,先和*结合,说明p2是指针变量,指向的是整型数组,数组的每个元素都是整型。,所以p1先和[]结合,p1就是一个数组名,数组中的每个元素都是int*,所以p1是指针数组。数组指针变量:存放的应该是数组的地址,能够指向数组的指针变量。

2024-04-23 21:55:55 433 1

原创 c语言指针(二)

但是,当我们学习了指针之后,知道了可以通过地址来间接访问到该变量的值,那我们就可以通过传递地址的方式,在函数中通过地址来访问到实参,并进行交换。我们也说过,数组名就是首元素的地址。sizeof(数组名),sizeof中单独放数组名的话,,这里的数组名指的是整个数组,计算的是整个数组的大小。&数组名,这里的数组名表示的是整个数组,取出的是整个数组的地址(整个数组的地址与数组首元素的地址是由区别的)我们可以这样理解,整型数组是存放整型的数组,字符数组是存放字符的数组,那么指针数组就是存放指针的数组了。

2024-04-22 22:45:18 693

原创 c语言指针(一)

我们举一个关于生活中的例子,来让我们更好的理解内存和地址,假设你在学校的一间宿舍里,你的朋友想要来找你玩,这时你的朋友就需要到一间一间的宿舍里面去找你,这样效率就会比较慢,但是你的朋友知道了你的寝室号,这样你的朋友就能够很快的找到你。我们加上了const就是为了防止a被修改的,如果p拿到了a的地址就能修改a了,这样就打破了const的限制,这样是不合理的,那怎么样才能防止p拿到了a的地址也不能修改了呢?在计算机中也是这样的,计算机中的数据都是存储在内存里面的,计算机需要读取数据也是从内存中读取的。

2024-04-21 22:26:35 784 1

原创 c语言操作符

算数操作符+,-是用来完成加法的,*是用来完成乘法,/是用来完成除法的,除号的两端如果是整数,执行的是整数除法,得到的结果也是整数,如果希望得到浮点数的结果,两个运算数必须至少有一个是浮点数。条件操作符的计算逻辑是,如果操作数1为真,则计算操作数2,计算的结果是整个表达式的结果,如果操作数1为假,则计算操作数3,计算的结果是整个表达式的结果。后面的就都是复合赋值操作符 +=, -=, *=, \=, %=, <<=, >>=, &=, |=, ^=,--是一种自减的操作符,也分为前置--和后置-

2024-04-12 22:34:10 691

原创 c语言函数递归与迭代

递归就是把一个大的问题层层转换为一个与原问题相识,但是规模较小的问题来求解,直到这个小问题不能再拆分,递归就结束了,所以递归的思考方式是把大事化小的过程;但是如果我们要求第50个的话,我们需要很长时间才能得到结果,为什么呢,因为在递归的过程中很多数字都是重复计算了的,递归层次越深,重复计算越多。这样我们就可以写出函数Fact来求n的阶乘,假设Fact(n)就是求n的阶乘,那么Fact(n-1)就是求n-1的阶乘;函数不返回,函数对应的栈帧空间就⼀直占⽤,所以如果函数调⽤中存在递归调⽤的话,每⼀次递归。

2024-04-01 10:06:24 368

原创 c语言中函数

c语言标准中规定了c语言的各种语法准则,c语言并不提供库函数,c语言的国际标准ANSIC规定了一些函数的标准,被称为标准库,那不同的编译器厂商根据ANSIC提供的语言标准给出了一系列函数的实现,这些函数就是库函数,比如scanf和printf等等,这些函数包含头文件都是可以直接使用的。在上面这个代码中,我们在Tmp这个自定义函数中,把x和y的值交换了,但是我们打印出来的a和b的值还是我们输入的3和5,所以我们得出,修改形式参数并不会影响实际参数。在上面的代码中,a和b都是实际参数,x和y则是形式参数;

2024-03-26 12:00:11 172

原创 C语言实现简易扫雷游戏

首先,游戏开始前,我们要先打印一个游戏选单,来确定玩游戏,或者退出游戏,这时我们就需要自定义一个函数来完成,用menu()来完成,我们通过选择1 或者 0,来确认,当然如果我们选择了别的数,就需要提醒他,选择错误,让他重新输入,这时就需要用到swtich语句了。我们想要同时初始化两个数组的时候,我们在传参的过程中,把想要初始化的值给写上,就可以完成两个数组的初始化,当然,我们也可以打印一下棋盘来看看是否初始化成功,这里就会用Dispaly()这个自定义函数来实现打印看看。我们用FindBoard来实现。

2024-03-18 20:58:27 275 1

原创 c语言数组

从输出的结果我们可以看到,随着数组下标的增长,地址是由小到大变化的,而且每个相邻元素的大小都相差4(因为一个int是四个字节),所以得出,数组在内存中是连续存放的。arr_name指的是数组的名字,这个名字可以根据实际情况,起的有意义就行;这里就有一个下标引用操作符[],这个操作符是用来找到存在数组中的元素的;type是数组中存放数据的类型,可以是int,char,float等;【】中的常量值,是决定数组大小的,这个可以根据需求制定大小。数组在内存中是连续存放的。数组的下标是从0开始的。

2024-03-17 18:52:23 327

原创 c语言简单实现猜数字游戏

rand函数的功能是生成一个伪随机数,这个函数的生成范围是0--RAND-MAX之间的,这RAND_MAX是依靠编译器实现的,大概是0-32767之间。这个rand函数是通过一个“ 种子 “的值来进行生成随机数的,一般默认这个种子为1,所以想要生成不同的随机数,就需要让这个种子随时发生变化。要完成这个游戏我们需要用到三个函数,一个是rand函数,一个是srand,还有一个是time函数。如果time函数的参数timer是NULL(空),就只返回这个时间的差值。这个函数就是用来初始化rand函数的种子的。

2024-03-14 23:23:23 225

原创 【c语言中的循环结构】

因为continue只跳过了后面的printf,但是我们从for语句的执行流程得知,for是先执行表达式1,在执行表达式2,在执行语句,在执行表达式3的,所以,continue只跳过了printf但i++没跳过。为什么会出现这样的情况呢,因为continue会跳过本次循环后面的代码,所以i++这个就不会被执行,所以 i 的值就会一直是5,但是 i如果等于5了,就会执行continue,所以就会进入死循环。for循环的执行流程是, 先执行表达式1,在执行表达式2,在执行语句,在执行表达式3,这样重复循环。

2024-03-01 15:04:15 407 2

原创 学习c语言记录

首先,我先自我介绍一下,我是一名民办专科的学生,当初因为服从调剂,去了电子商务这个专业,但是学习了一年后感觉不太适合我,就又转专业来到了计算机这个专业。当然,有目标就会有前进的动力,对于学习这个c语言,我会在b站观看教学视频然后结合自身购买的一些关于c语言的书籍进行学习,遇到一些不懂不会的地方 也会向别人进行请教。我会在自身学校安排的课后进行学习,每天也应该保持一个2到3小时的学习时间,当然 ,周六日可能会学习的时间也会多点。对于自己今后想进入那个公司进行工作,这些都是后面的事情了,暂时可能没有考虑这些。

2023-11-28 23:31:00 358

空空如也

空空如也

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

TA关注的人

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