- 博客(73)
- 收藏
- 关注
原创 leetcode-链表经典题
206. 反转链表这里我们使用创建一个变量cur来遍历原链表,再创建一个新节点newnode,首先使用一个循环来遍历原链表,cur为NULL是循环结束,每次进入循环将cur的下一个节点赋给tail,然后将cur取下来头插,第一次头插的节点的next置为NULL,也就是cur->next=newnode,然后将cur这个节点赋给newnode,在新链表上相当于往左走一步,newnode=cur,然后cur在旧链表上往右走,cur=tail。
2023-11-12 21:46:50
1875
79
原创 数据结构-单链表
概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。从以上图片可以看出:1.链式结构在逻辑上是连续的,但在物理上不一定是连续的。2.现实中的节点一般是在堆上申请出来的。3.从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,可能不连续。
2023-11-08 20:38:34
1707
85
原创 leetcode-经典面/笔试题目
还是0。除了消失的数字出现一次,其他的数字都是成对出现,所以tail结果两次遍历异或后就是消失的那个数字。
2023-11-05 17:55:52
1423
85
原创 数据结构-顺序表
线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
2023-11-04 13:53:30
1947
66
原创 动态内存管理(2)
请问运行Test 函数会有什么样的结果?:传参的是指针,然后GetMemory函数里面使用malloc开辟了100个字节的空间,并且将这块空间的起始地址赋给了p,p是一个临时变量,出了这个函数就不在了,找不到这块空间了,所以str还是NULL,所以对NULL进行解引用操作了。:这块空间在使用完之后没有进行free释放,就会出现内存泄漏的问题。:将str的地址作为参数,用二级指针接收,解引用找到str的地址,这样就能为str开辟空间。在使用完之后用free释放再置为空指针就行了。
2023-10-25 18:36:18
377
75
原创 动态内存管理(1)
这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。例子:申请一块空间,用来存放10个整型int main()return 0;
2023-10-22 23:17:31
406
64
原创 C语言实现通讯录(超详细)
如果没有满,则开始输入信息,先打印提醒信息,在输入,名字放在通讯录里面data数组的下标为pc->sz的位置上,所以是pc->data[pc->sz].name,name是数组名,数组名本身是地址,所以不需要使用&。找到了则将返回的下标作为for函数的i,将i+1这个结构体代替i这个结构体,然后不断的循环。写一个Findbyname的名字查找函数,参数分别是pc这个通讯录和name,在通讯录里面查找sz次,使用strcmp函数比较,如果等于0,就是找到了这个联系人,则返回下标,否则返回-1.
2023-10-18 21:07:58
9475
54
原创 自定义类型:结构体,枚举,联合 (2)
位段的声明和结构是类似的,有两个不同:1.位段的成员必须是 int、unsigned int 或signed int。2.位段的成员名后边有一个冒号和一个数字。int _b:5;int _c:10;int _d:30;A就是一个位段类型,位段的位指的是二进制位,成员名后的数字代表着占空间的多少个bit位,_a占2个bit位,_b占5个bit位。那位段A的大小是多少?如果这个A是结构体的话,那就至少占16个字节,而如果是位段则是8个字节这是为什么呢。
2023-10-14 20:55:46
405
46
原创 自定义类型:结构体,枚举,联合 (1)
有了结构体类型,那如何定义变量,其实很简单。下面这个代码就是在创建结构体变量的时候进行了初始化,p1,p2都是全局变量,p3是局部变量,p3这种初始化方式也是可以的。int x;int y;int b = 20;return 0;如果我们想不按顺序进行初始化也是可以的,需要使用结构体访问操作符。int x;int y;int data;
2023-10-12 22:39:20
333
36
原创 浅谈内存函数以及模拟实现
接下来我们使用一下这个函数: 经过调试之后可以发现arr1里面存放了1,2,3,4,5,这个就是memcpy的基本用法。当我们想把1,2,3,4,5放到3,4,5,6,7的位置上时就会出现问题,当空间不重叠内存的时候使用memcpy是可以的,像这种不重叠内存的拷贝需要使用memmove。 3.memmove 使用memmove的话就能很好的解决上面的问题。我们先来想一下,如果有一个数组:假如我们要把1,2,3,4,5拷贝到3,4,5,6,7这个位置上去,使得数组变
2023-10-09 00:14:32
239
51
原创 字符函数和字符串函数
拷贝num个字符从源字符串到目标空间。如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。strncpy和strcpy的前两个参数是一样的,只是返回值是char*的指针,返回的是目标字符串。并且strncpy还多了一个参数size_t num,下面这个代码的意思就是将源字符串的前三个字符拷贝到目标字符数组里面去。
2023-09-25 00:00:22
743
46
原创 指针进阶(3)
这里我们使用冒泡排序算法,模拟实现一个排序函数,可以排序任意类型的数据。这段代码可以排序整型数据,我们需要在这段代码的基础上进行改进,使得它可以排序任意类型的数据。
2023-09-20 22:13:40
983
36
原创 指针进阶(2)
数组是一个存放相同类型数据的存储空间,那我们已经学习了指针数组,那要把函数的地址存到一个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?答案是:parr1parr1 先和 [] 结合,说明 parr1是数组,数组的内容是什么呢?是 int (*)() 类型的函数指针。
2023-09-15 20:32:46
458
41
原创 指针进阶(1)
数组指针是指针?还是数组?答案是:指针。我们已经熟悉:整形指针: int * pint;能够指向整形数据的指针。浮点型指针: float * pf;能够指向浮点型数据的指针。那数组指针应该是:能够指向数组的指针。下面代码哪个是数组指针?第一个是指针数组,里面存放的是10个元素,每个元素的类型是int*。第二个是数组指针,p2指向的是数组,里面存放的是10个元素,每个元素的类型是int。解释:p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。
2023-09-10 23:21:01
566
47
原创 深度剖析数据在内存中的存储
什么大端小端:大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。如果a地地址是0x11223344,那么将11这个高位字节放在低地址处就是大端字节序存储,将44这个低位字节放在低地址处就是小端字节序存储。为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit。
2023-08-26 15:54:08
519
29
原创 操作符详解(2)
由问号和冒号组成,有三个表达式,有三个操作符,所以条件操作符是唯一的一个三目操作符,exp1为真,exp2则计算,exp3不算,整个表达式的结果就是exp2的结果。exp1为假,exp2则不计算,exp3计算,整个表达式的结果就是exp3的结果.这两个代码的效果是一样的,这就是条件操作符的用法。
2023-08-22 16:21:06
421
24
原创 操作符详解(1)
单目操作符就是只有一个操作数。!逻辑反操作- 负值+ 正值& 取地址sizeof 操作数的类型长度(以字节为单位)~ 对一个数的二进制按位取反-- 前置、后置--++ 前置、后置++* 间接访问操作符(解引用操作符)(类型) 强制类型转换!可以把假变成真,把真变成假。&是取地址操作符,用指针变量来存储。*是解引用操作符,*x是通过x中存放的地址,知道x指向的对象。sizeof其实我们之前已经见过了,可以求变量(类型)所占空间的大小。前置++:计算口诀:先+1,后使用。
2023-08-21 15:30:08
764
20
原创 函数(2)
函数的定义是指函数的具体实现,交待函数的功能实现。函数的定义本就是一种特殊的声明。//函数的定义int main()//计算//函数的调用(传值调用)//2return 0;以后我们可以把函数的声明放在同一头文件中,这样方便管理。程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接。
2023-08-15 17:11:26
957
32
原创 函数(1)
如果库函数能干所有的事情,那还要程序员干什么?所有更加重要的是自定义函数。自定义函数和库函数一样,有函数名,返回值类型和函数参数。但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间。函数的组成:我们举一个例子:写一个函数可以找出两个整数中的最大值。这个函数肯定要有一个返回值,并且是int类型,参数肯定是两个int类型的整形变量,函数名自己定义,那么函数体我们就能够轻易写出来了。//函数体if (x > y)return x;
2023-08-14 17:11:22
639
25
原创 分支语句与循环语句(2)
sizeof(arr)是数组的总大小,sizeof(arr[0])是每个元素的大小,相除得到的就是元素个数,left是下标为0的元素,right是最后的一个元素,mid是中间的元素,如果midk,那么我们要找的这个元素肯定在mid左边,这时我们将mid-1这个元素的下标赋给right。3、设计游戏具体思路,使系统生成一个随机数,让玩家输入一个数字,然后两个数字对比,根据系统反馈信息,逐渐锁定目标。
2023-08-13 15:52:10
495
24
原创 分支语句和循环语句(1)
C语句可分为以下五类:1. 表达式语句2. 函数调用语句3. 控制语句4. 复合语句5. 空语句大家可以看一下这三个语句。//表达式语句//函数调用语句;//空语句 - 有时候我们需要一条语句,但是这条语句什么都不需要做,就可以使用空语句return 0;我们详细的讲解控制语句,控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句。
2023-08-12 17:37:43
346
28
原创 初识C语言(3)
define定义常量可以给常量赋值,方式如下,定义完后MAX的值就是1000了。define定义宏,宏和常量的区别就是宏有参数,下面代码的x和y就是参数,参数后面是计算方式。如果我们在main函数里面调用ADD就能使用了。//define定义标识符常量//define定义宏int main()return 0;
2023-08-10 17:51:33
334
24
原创 初识C语言(2)
数组的作用就是存放一组相同类型的数,[]里面是数组的大小,10表示这个数组可以存放10个元素,arr是数组名,int是表示这个数组是整形数组。//定义一个整形数组,最多放10个元素。
2023-08-09 15:33:06
236
11
原创 初识C语言(1)
什么是C语言?C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制。
2023-08-07 17:22:50
261
7
原创 扫雷游戏的实现(详解)
还需要注意的是,我们创建游戏的过程中需要用到两个源文件(game.c test.c)和一个头文件(game.h),在头文件中包含了程序所需的各种头文件并且实现对各种函数的声明,而源文件test.c用于引用函数,game.c实现函数。接下来我们完成game()的内容,也就是扫雷游戏中最主要的内容,那么首先我们就将棋盘打印出来,假设我们打印出9*9的棋盘,我们在game.h里面声明棋盘的行和列,然后在test.c里面调用。既然我们初始化棋盘并且打印了,我们就开始在棋盘上布置雷,假设我们布置10个雷。
2023-07-29 21:56:02
361
8
原创 写题思路的分享
2.在每次进行区间拆半操作时,即对[left,right]进行拆半,中位元素arr[mid]已经搜索完毕,使得下次搜索区间仍然为左闭右闭区间,则左半区间为[left,mid-1],右半区间为[mid+1,right]。所以right=mid-1。1.right的初始化取值为序列的长度-1,则初始化判断区间为[0,len-1],左闭右闭区间,后续判断区间为[left,right]。5、循环结束后,输出最终的结果,也就是我们需要的10个数中的最大值。2、查找目标值的左边界,若序列所有元素大于目标值,返回-1。
2023-07-27 18:56:52
174
4
原创 C语言实现三子棋
判断结果,如果棋盘被占满则平局,创建IsFull函数判断棋盘是否被占满。电脑下棋并打印,通过rand()函数产生随机值,用%限制范围。创建一个名为board的二维数组并且初始化。首先打印菜单让玩家选择,1进入游戏,0退出游戏。进入游戏后我们将棋盘进行搭建并打印让玩家看到。将棋盘进行搭建并且打印出来。如果玩家进入游戏,则进入game()。创建游戏的初始化界面。玩家进行下棋并且打印。下面是整个函数的实现。
2023-07-26 16:52:38
262
7
原创 我的第一篇博客
各位读者老爷们,我叫周小峰,性别男,年龄18岁,来自一所双非本科院校,并且专业是机械设计制造及其自动化,平常爱打游戏和跑步,因为打游戏呢把大一的时间浪费掉了,所以我决定戒掉游戏好好利用时间去学习。在大一上课的时候觉得编程挺有意思的,所以我决定走编程这条路,我也慢慢的喜欢上了编程。我学编程的目的很明确,就是改变自己的懒惰,在大四拿到一个好offer,就算没有成功,至少我努力去争取了,问心无愧。不知道大家学编程的初衷是什么呢?
2023-07-09 16:30:00
244
5
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅