自定义博客皮肤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)
  • 收藏
  • 关注

原创 排序(数据结构)

一. 排序概念及运用一. 排序概念及运用排序在数据结构中是非常重要的一部分,。在生活中也有很多的应用,比如当我们搜索一款产品时候,我们可以选择按销量多少的顺序来给我们推荐产品,也可以按照价格高低来给我们推荐产品,所以排序在生活中也是很常见的。1.1 直接插入排序常见的排序算法:上面就是一些常见的排序算法,首先我们来认识一下插入排序,插入排序又分为直接插入排序和希尔排序。

2025-02-25 16:46:02 1653 85

原创 实现二叉树_堆

上面就是对于堆这样一个数据结构中数据的插入、删除、以及如何完成我们想要的大堆还是小堆等,通过算法一一实现。

2025-01-20 21:30:34 2924 66

原创 二叉树_堆

上面通过图片的形式表示出来,大家可能会更清楚一点,首先树中的每一个结点都是一样的结构,有孩子和兄弟,就拿上图来说,首先A的孩子结点指向B,同时B的兄弟结点指向C,这样就可以满足B和C的父节点是A,与树的形状一致,同理B的孩子结点指向D,D的兄弟结点再指向E,E的兄弟结点再指向F,以此类推,我们就可以利用这个方法完成数的结构了。,树形结构中,子树之间不能有交集,否则就不是树形结构;数的结构是有些许复杂的,可能每一个结点可能会有不一样数量的孩子结点等,可能数量会非常多,所以我们来介绍一种比较常用的类型,叫做。

2024-12-18 18:39:19 1354 108

原创 栈和队列(数据结构)

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。

2024-11-25 20:29:15 1242 113

原创 单链表算法题(数据结构)

看到这个题目的时候我们怎么去想呢?如果我们反应快的话,应该可以想到我们可以从1遍历到5然后依次头插,但是其实我们还有更好的办法,就是利用三个指针,如何使用呢?

2024-11-11 22:50:06 3389 102

原创 单链表的实现(数据结构)

我们在上一篇中简单的认识了链表的组成和结构,并打印出链表,那么今天就来具体实现一下单链表对于数据增加、删减、插入等。在实现让任何代码之前,我们都因该将思路理清楚,尾插该注意什么,怎么去是实现?首先一定是要找到最后一个结点,pphead是我们的头结点,我们一贯会将pphead赋给一个新的指针pcur,使用while循环找到最后一个结点,但是如果while里面是pcur的那我们不就直接跳出循环,那我们还怎么找最后一个结点呢?

2024-11-05 23:10:42 5875 105

原创 链表(数据结构)

再上一篇中我们讲到顺序表,但是顺序表也是有很多的问题,像申请的空间过多过少或者增容该才能不浪费空间,今天我们就来认识一个新的知识,叫做链表,链表也是线性表的一种,物理存储结构上非连续、非顺序数据结构的逻辑顺序是通过链表中的指针链接次序实现的。

2024-10-30 22:38:34 2529 102

原创 顺序表(二)(数据结构)

我们看上面的图片,假如现在数组中是1 1 2,现在我们要删除重复项的元素,那么结果应该是1 2,我们可以先使用两个指针,str指向数组的第一个元素,dst指向数组的第二个元素,第一步先将它们两者比较,如果是相等的,仅仅让dst这个指针向后移动一位,再次进行比较,如果此时不相等的话,我们在写算法的时候最重要的是我们的思路,我们该怎么去想,不是为了去解出这个题,而是我们的思路,要扩大我们的思路,多思考,再借鉴别人代码的时候,注意关注的是别人的思路,多多积累一些算法的思路。,返回删除后数组的新长度。

2024-10-28 22:14:48 2101 79

原创 顺序表(一)(数据结构)

比如现在有一个数组包含数据1 2 3 4 ,那么现在我要删除4这个数据,我们知道size是指向有效数据的下一个位置,也就是4的后面一个位置,那么现在我让size--就会让size指向4的位置,当我们打印的时候这个位置的数据就不是有效的数据了,而且在尾部插入数据的时候在空间充足的时候我们是直接将新的数据元素之直接插在size的位置上,然后再让size++。但是在物理结构上并不一定是连续的,物理结构是数据在内存上的存储形式,线性表在物理结构上存储时,通常以数组和链式结构的形式存储。

2024-10-23 23:44:10 2044 88

原创 算法复杂度 (数据结构)

数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。没有一种单一的数据结构对所有用途都有用,所以我们要学各式各样的数据结构,如:线性表、树、图、哈希等。

2024-10-10 22:01:39 3233 125

原创 动态内存管理

对于上述的代码1来说,如果在情况良好时,realloc函数申请内存成功,ptr将会指向新的内存空间,但是如果申请失败的话,realloc返回空指针NULL,此时ptr原来指向的内存不会被释放,可能会导致内存泄露,并且ptr变为NULL,后续如果对ptr进行解引用的话也会导致程序崩溃。有时候我们需要的空间大小在程序运行的时候才能知道,那数组的编译时开辟空间的方式就不能满足了。有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的使用内存,我们⼀定会对内存的大小做灵活的调整。

2024-09-24 23:06:49 1266 107

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

像结构体一样,联合体也是有一个或者多个成员构成,这些成员可以是不同的类型但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体。给联合体其中一个成员赋值,其他成员的值也跟着变化。联合体的关键字是union,然后大家也可以看到其实联合体和结构体的形式是很相同的,但是内存处理方式却是不一样的,大家看一下我们的输出结果:根据上一节学的结构体知识,如果是结构体的话,我们输出的结果是8,那么为什么联合体是是4呢?

2024-09-17 20:18:00 1898 107

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

位段的用处还是有很多的:在网络协议中,IP数据报的格式,我们可以看到其中很多的属性只需要几个bit位就能描述,这里使用位段,能够实现想要的效果,也节省了空间,这样网络传输的数据报大小也会较小一些,对网络的畅通是有帮助的。3.4位段使用的注意事项位段的几个成员共有同一个字节,这样有些成员的起始位置并不是某个字节的起始位置,那么这些位 置处是没有地址的。内存中每个字节分配一个地址,一个字节内部的bit位是没有地址的。

2024-09-08 23:04:08 1347 117

原创 自定义类型:结构体 (C语言)

VS中的对齐数是8,而8和char类型的1比较,自然是1小,所以选择1,那么1的倍数可以是任何数,所以对应上面的图,也就是橙色的,我们的第二个变量c2可以直接在c1下面直接挨着,但是对于i来说,int类型的4也是较小值,但是必须对齐为4的倍数,所以要选择偏移量为4的倍数,所以橙色的整个占了8个字节,也就是我们得出的结果8,但是为什么红色的占了9个字节,但是结果确是12呢?答案是不行的,因为Node是对前面的匿名结构体类型的重命名产生的,但是在匿名结构体内部提前使用Node类型来创建成员变量,这是不行的。

2024-09-05 23:58:57 2019 105

原创 数据在内存中的存储

其实超过一个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储,下面是具体的概念:是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容,保存在内存的低地址处。是指数据的高位字节内容保存在内存的低地址处,而数据的低位字节内容,保存在内存的高地址处。上述概念需要记住,方便分辨大小端。

2024-08-26 23:38:04 2011 132

原创 C语言内存操作函数

比如对于内存的复制,内存的设置以及内存的比较,这些函数都是针对内存块来处理的,为程序员提供了更加安全,高效和灵活的方式,让程序员能够对内存进行各种常见的操作和处理,下面就让我们来详细了解一下吧。但是可能细心的同学会发现,我们就算使用memcpy函数也能够实现重叠部分的程序运算,但是我们在C语言中更推荐规范使用,如果有重叠部分的就使用memmove函数,虽然我们在VS的编译器上用memcpy来处理重叠部分可以成功,但是在其他编译器上却不一定,所以我们尽量的规范使用。memmove函数可以处理重叠部分。

2024-08-19 22:37:42 3330 122

原创 字符串函数!!!(续)(C语言)

继续上次的学习,今天我们来认识一个新的函数strtok,它的原型是,sep参数指向了一个字符串,定义了用作分隔符的字符合集,第一个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以被strtok函数切分的字符串⼀般都是临时拷贝的内容并且可修改。让我们来实践一下:下面展示一些内联代码片。

2024-08-13 22:03:51 1988 111

原创 字符函数和字符串函数(C语言)

🍟🧣结束了指针的学习,我们开始了字符串之旅,今天我们要学习的的是与字符相关的函数,在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语言标准库中提供了一系列库函数,接下来我们就学习一下这些函数。

2024-08-07 22:52:10 2143 118

原创 指针!!C语言 字符串篇(第四篇)

一. sizeof和strlen的对比在C语言中有两个比较相似的知识点,就是和,下面我们来讲一下它们两者之间有什么不同之处?:首先sizeof是操作符而不是函数,而且sizeof计算的是变量所占空间的大小,单位是字节,只关注占内存空间的大小,不在乎内存中放的是什么内存数据。strlen是一个函数,只针对字符串或字符数组,统计的是"\0"之前的元素个数。二. 数组和指针笔试题解析。

2024-07-30 21:19:17 2724 123

原创 指针!!C语言(第三篇)

我们可以看到在一般实现中我们分别要创建不同的函数然后再分别调用不同的函数来满足我们不同的计算需求,但是其实我们又会发现在我们的运算中,我们的程序看起来有点相似,但又不完全一样,看起来有些许繁琐,所以我们有没有什么办法让代码更加简单一点呢?从代码中我们可以看出来我们创建了一个calc函数里面放入了函数指针,在后面的使用中我们使用calc这个函数来调用我们要使用的函数,比如当我们输入1的时候,是calc(add),也就说现在指针pf指向的是add这个函数,就实现了加法。而且这也是函数指针数组的一个很好的例子。

2024-07-28 21:45:56 2197 88

原创 指针!!C语言(第二篇)

我们再试一下,如果我们再分析⼀下,&arr[0]是数组元素的地址,可以赋值 给p,其实&arr[0]和p在这里是等价的。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。,arr+1移动了4个字节,而&arr+1移动了20个字节,也就是移动了一整个数组,这就是arr和&arr最本质的区别。的地址,但是还是有两个例外的,比如说sizeof(arr),计算的并不是首元素的字节,而是整个数组的字节,再比如。那么在数组传参的时候,传递的是数组名,也就是说本质上数组传参传递的是数组首元素的地址。

2024-07-22 22:23:32 3964 103

原创 指针!!C语言(第一篇)

每个内存单元也都有一个编号(这个编号就相当于小区房间的门牌号),有了这个内存单元的编号,CPU就可以快速找到一个内存空间。生活中我们把门牌号也叫地址,在计算机中我们把内存单元的编号也称为地址。**C语言中给地址起了新的名字叫:指针**。**所以我们可以理解为:内存单元的编号 = 地址 = 指针。**

2024-07-15 16:48:58 3046 111

原创 操作符详解(下) (C语言)

所以即使有了操作符的优先级和结合性,我们写出的表达式依然有可能不能通过操作符的属性确定唯⼀的计算路径,那这个表达式就是存在潜在风险的,建议不要写出特别复杂的表达式。(表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。操作符的优先级只能决定减 – 的运算在 + 的运算的前面,但是我们并没有办法得知, + 操作符的左操作数的获取在右操作数之前还是之后求值,所以结果是不可预测的,是有歧义的。

2024-06-30 15:23:37 2132 108

原创 操作符详解(上) (C语言)

上述代码就是结构体的创建,首先我们就使用struct创建了一个结构体,包括字符型、整型等,然后这就相当于一个类型了,再看我们下面的代码,就像int a一样我们使用struct student也创建变量s1、s2等,当然像代码中的变量属于局部变量,如果需要全局变量我们可以定义在函数的外部。:比如15的二进制是1111,那么换成8进制就是利用15除以8看每次的余数和商,那么8进制就是17,其实8进制的每⼀位是有权重的,8进制的数字从右向左是个位、⼗位、百位…:结构体成员的直接访问是通过点操作符(.)访问的。

2024-06-26 23:04:12 2433 99

原创 函数(下) C语言

⼀般我们在使⽤函数的时候,直接将函数写出来就使用了。比如:我们要写⼀个函数判断⼀年是否是闰年。上面代码中橙⾊的部分是函数的定义,绿色的部分是函数的调用。这种场景下是函数的定义在函数调用之前,没啥问题。但是我们要注意的是如果一个函数体在我们要使用的部分后面,也就是说我们是先调用函数之后再写出函数的主体,如果这样的话编译器就会报错,所以我们在使用函数的时候最好要提前声明一下,比如像这样:函数的调用⼀定要满足,先声明后使用;函数的定义也是⼀种特殊的声明,所以如果函数定义放在调用之前也是可以的。

2024-06-18 23:45:33 2159 99

原创 函数(上)(C语言)

关于函数的初步讲解,函数的语法形式,以及函数的使用方法和注意事项等等

2024-06-16 17:48:39 2537 76

原创 数组(C语言)(详细过程!!!)

存放在数组的值被称为数组的元素,数组在创建的时候可以指定数组的大小和数组的元素类型。有 ⼀个⽐较迷惑的点,变⻓数组的意思是数组的⼤⼩是可以使⽤变量来指定的,在程序运⾏的时候,根 据变量的⼤⼩来指定数组的元素个数,⽽不是说数组的⼤⼩是可变的。这里输出的结果是40,计算的是数组所占内存空间的总大小,单位是字节。从输出的结果来看,每⼀⾏内部的每个元素都是相邻的,地址之间相差4个字节,跨⾏位置处的两个元 素(如:arr[0][4]和arr[1][0])之间也是差4个字节,所以⼆维数组中的每个元素都是连续存放的。

2024-06-13 19:19:21 2394 91

原创 函数递归(C语言)(详细过程!)

递归是⼀种很好的编程技巧,但是和很多技巧⼀样,也是可能被误⽤的,就像举例1⼀样,看到推导的公式,很容易就被写成递归的形式,为大家解释一下,我们的第一个例子求n的阶乘,我们用递归的方法很容易算出来,但是我们可以自己操作一下,如果数值小的话,计算结果是很快出来,但是如果我们的数值偏大,假如我们输入50,那么计算结果就会很慢,原因就是 Fact函数是可以产生正确的结果,但是在递归函数调用的过程中涉及⼀些运行时的开销。递归中的递就是递推的意思,归就是回归的意思,下面会有详细的解释。

2024-06-10 19:27:49 5038 79

原创 扫雷游戏(C语言)(超详细!新手小白入!)

游戏介绍这是一款经典的扫雷游戏,玩家可以任意点击一个小方框,若不是雷,则会显示周边有几个雷,并把雷的个数显示出来,若是雷,则被炸死,游戏结束。目前我们可以用已知的C语言知识来编写这样一个小游戏。

2024-06-04 20:57:03 1671 101

原创 我的编程之旅

为了学习编程,我打算通过阅读相关书籍和教程,参加线上线下的课程,积极参与实践项目,与其他编程爱好者交流分享经验。我编程的目标是能够熟练掌握多种编程语言,开发出实用且有创意的应用程序,为人们的生活带来便利和乐趣。大家好,我是kankan,一名对编程充满热情的初学者。

2024-04-27 16:26:13 424 30

空空如也

空空如也

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

TA关注的人

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