自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 堆的实现(堆的插入、堆的删除等)超级全

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

2023-11-25 00:25:41 1176 6

原创 单链表的实现(Single Linked List)---直接拿下!

单链表在实现头插和头删真的很方便,但是大家相信大家也会发现,实现尾插和尾删,找尾的过程时间复杂度是O(n)。所以,这就引出我们的神中神链表,双向带头循环链表。l带头双向循环链表。

2023-11-20 21:09:16 289 7

原创 队列的实现---超详细

所以我们可以思考一下,这种结构如果用顺序表来实现一定是十分麻烦的,因为顺序表的头删的时间复杂度是O(N)。FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头。队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出。如果是计算队列长度时,这是一个不在连续空间存储的数据结构,我们如果简单的计算出长度呢?至于是单链表还是带头双向循环链表,其实都是无伤大雅的,在这里我们选择单链表。

2023-11-16 00:35:08 268 7

原创 栈的实现---超详细

入栈和出栈只能发生在栈顶,栈底不进行任何操作,且栈顶随着入栈和出栈变化。栈顶指向最后的数据。1.数据结构里的栈。2.语言/操作系统中的栈(内存空间),可能会在递归程序里发生栈溢出。

2023-11-14 21:51:54 96 7

原创 带头双向循环链表的实现

因为双向带头循环链表无论如何都是有一个哨兵位phead的结点,所以我们初始化的时候不能像创建顺序表和链表一样把指针设置为NULL之后就OK啦,需要用malloc函数去开辟一块空间。每一个结点都有一个前置指针,前置指针存上一个结点的地址,一个后置指针存下一个结点的地址,还有一个存储数据的变量。,所以这个时候其实实际的pos已经成为了一个野指针了,我们就需要在工程里使用他的地方后面自己设置成NULL。由此可见,如果要是pos = phead,那插入pos位之前就相当于是尾插,并且首尾相连还带有哨兵位头结点。

2023-11-14 10:17:44 81 8

原创 合并两个有序链表OJ

其次,题目里说了新链表是通过拼接原来的结点形成的,所以说我们不需要开辟新的空间。

2023-11-08 21:36:56 395 8

原创 反转链表OJ题

关键点在于如果想反转,把nk->nk+1反转,需要变成nk->next->next = nk。而且不要忘记把n1的next设置成NULL,否则可能会出现环形链表。本题如果使用递归的话,其实会比较复杂,并且反而会增加空间复杂度,使空间复杂度变成O(n)

2023-11-06 11:17:15 95 26

原创 环形链表和相交链表OJ题

这篇博客详细讲解了环形数组和相交数组的问题。

2023-11-05 22:33:42 150 11

原创 顺序表的实现

顺序表是线性表的一种是n个具有相同特性的数据元素的有限序列。常见的线性表:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。如果在数据的存储结构上也是线性的,那就是顺序表。如果在数据的存储结构上不是线性的,那就是链表。

2023-11-02 11:58:38 121 24

原创 浅析数据结构与算法

数据结构是用于组织和存储数据的一种方式。它定义了一种数据的组织方式,以及在该组织结构上进行的操作。数据结构可以看作是一种特定的数据类型,它不仅包含数据的存储方式,还包括对数据的访问、操作和组合的规则。数据结构提供了一种高效地组织和管理数据的方法,以便于对数据进行检索、插入、删除和修改等操作。举一个简单的例子:假设您有一本电话号码簿,里面记录了您的亲戚朋友的姓名和电话号码。为了方便查找,您可以按照姓名的首字母进行排序,然后将它们放入一个表格中。这个表格就是一个简单的数据结构,我们称之为“有序表”。

2023-10-31 18:45:58 76 1

原创 C语言文件操作(2)

判断文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者NULL ( fgets )这就是以二进制形式不加转换直接呈现的二进制文件,有点抽象吧,那我们用二进制编译器打开看一下。offset:表示要移动的字节数,可以是正数、负数或零。stream: 指向FILE对象的指针,表示要操作的文件流。fread判断返回值是否小于实际要读的个数。根据文件指针的位置和偏移量来定位文件指针。让文件指针的位置回到文件的起始位置。返回值就是成功读取的个数。

2023-10-24 11:22:58 100 16

原创 C语言文件操作(1)

首先,我们要知道文件都是存储在磁盘上的,而我们平时写在编译器上写的代码等在保存之前都是存储在内存中的,也即带电存储,计算机内存是一种临时存储器,它的内容在计算机关闭或重启时会被清除,或者程序退出,内存回收,数据就丢失了。如果想要永久化的保存数据,我们可以使用存储在磁盘上的文件。

2023-10-23 23:09:38 781 2

原创 经典题型---旋转数组

这是一个非常典型的返回栈空间(临时变量地址)的错误,在执行函数过程中,创建了一个临时数组,这个数组存储的就是满足输出形式的数组,但是当函数调用结束后,这块空间就被销毁了,nums反而成了野指针,所以这样的问题一定要避免。但是如果当k > numsSize的时候,那就需要使用到余数了,k % numsSize,直到k小于numsSize就可以进行程序操作了。这个方法在使用时,笔者掉入了一个很危险的错误,和大家分享出来,希望大家在以后的编程上避开这个坑。不难看出时间复杂度是O(2n),即O(n)

2023-10-21 22:28:23 510 9

原创 简单地用C语言实现一个文件复制的操作

更新预告:明天将会更新C语言文件操作的相关知识!

2023-10-20 22:47:39 502 3

原创 一篇文章带你弄懂编译和链接

程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程⼀直保留他们的值。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。编译过程就是将预处理后的文件进行⼀系列的:词法分析、语法分析、语义分析及优化,生成相应的汇编代码文件。处理#include 预编译指令,将包含的头文件的内容插入到该预编译指令的位置。在Windows环境下的目标文件的后缀是.obj,Linux环境下目标文件的后缀是.o。行的,也就是说被包含的头文件也可能包含其他文件。

2023-10-19 20:02:07 105 4

原创 C语言动态内存管理———超级全!快来看!

情况2:原有空间之后没有足够大的空间, 原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找⼀个合适大小的连续空间来使用。这样函数返回的是⼀个新的内存地址。上述两种向内存申请空间的方式有一个很大的弊端,就是不能灵活的调整申请的内存空间的大小。返回的地址和ptr是一样的。包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。ptr是需要调整的动态内存空间的地址,size是想要调整到的大小,返回值为调整后的内存空间的起始地址。

2023-10-19 11:14:44 87 11

原创 数据在内存中的存储---史上最全

0和-0,0的原码00000000,-0的原码1000000, 0的反码00000000, -0的反码11111111, 0的补码00000000, -0的补码00000000。在调试过程中,点击调试——窗口——内存,输入&i,就可以看到i在内存中的存储方式了,11是数据的高位字节内容,放在了最高的地址,所以是小端排序。比如保存1.01的时候,只保存01,等到读取的时候,再把第⼀位的1加上去。对于32位的浮点数,最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M。

2023-10-14 18:52:59 51 2

原创 C语言联合体和枚举

int i;像结构体一样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同⼀块内存空间。所以联合体也叫:共用体。给联合体一个成员赋值,其他成员的值也会因此改变。//代码1//联合类型的声明union Unchar c;int i;//代码2union Unchar c;int i;int main()

2023-10-14 12:26:54 62 3

原创 C语言结构体(2)位段

位段的几个成员共有同⼀个字节,这样有些成员的起始位置并不是某个字节的起始位置,那么这些位置处是没有地址的。内存中每个字节分配⼀个地址,⼀个字节内部的bit位是没有地址的。位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。2.放不下的部分怎么办,是另分配新的全部放里,还是一部分放在有限的空间里,放不下的部分再放到新的空间里。,这样就不能使⽤scanf直接给位段的成员输入值,只能是先输入放在⼀个变量中,然后赋值给位段的成员。而我们不禁会思考两个问题。

2023-10-13 12:29:16 49 8

原创 C语言结构体(1)

如果我们能保证将所有的double类型的数据的地址都对齐成8的倍数,那么就可以用⼀个内存操作来读或者写值了。如果传递⼀个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。c. 结构体总大小为最大对齐数(结构体中每个成员变量都有⼀个对齐数,所有对齐数中最大的)的。d. 如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构。体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。所以结构体传参的时候,要传结构体的地址。

2023-10-10 20:28:23 51 7

原创 字符指针变量的一种特殊用法

这是一个指针字符数组,每一个元素是字符指针,而元素的地址是这个指针的地址,所以需要解引用操作符或者下标引用操作符调用后才可以使用这个指针。这是利用一个字符指针存储字符串的用法,直接利用指针就可以打印出字符串,但是本质上存储的是字符串首字符的地址,解引用后是首字符。这是一道我之前总结过的题,解析在这篇博客里。答案是POINT, ER, ST, EW。让我们接下来深入一下。

2023-08-26 22:05:03 36 2

原创 C语言指针典型题(2)

2.cpp此时是(c + 2)的地址,再++后是(c + 1)的地址,解引用一次变成(c + 1),再–,也就变成了c,*c等于指向第一个字符串首字符的指针,所以加3变成ER。这是一个字符指针数组,数组的每个元素的是字符指针,所以a就是第一个字符指针的地址,想要存储指针的地址,就需要使用二级指针。1.cpp存储的是(c + 3)的地址,所以++后,是(c + 2)的地址,两次解引用,就是c[2],也就是point。4.cpp[-1][-1] + 1就是指向NEW字符串首字母的指针,最后是EW。

2023-08-25 23:48:56 40

原创 C语言指针典型题(1)

a是整个数组的地址,加1后就是跨过一个数组的长度,所以指向的就是元素5的地址的下一个内存单元,减1后就是5的地址,所以解引用后就是5。2.先看第二个%d形式的,指针相减就是元素个数,指向第23的减指向第19的,19,20,21,22,4个。数组名a代表的是首元素的地址,(a + 1)是数组第二个元素的地址,所以解引用后就是2。p存放的是a[0]数组的首元素地址,也就是a[0][0]的地址。3.而后面的加法考察的是指针类型的意义,也就是int。类型的指针+1,是加了4个字节,char。

2023-08-24 23:49:23 27

原创 递归经典问题———Tower of Hanoi汉诺塔

汉诺塔是一种源自古印度的益智游戏,又称河内塔 ,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。我们简化一下,就如下图所示也就是我们需要将这三块木块按照从下到上由小到大的顺序放在C柱子上,并且每次只能移动一块,而且必须保证不能出现大块放在小块上面的情况。

2023-08-24 21:09:38 59

原创 递归经典问题———青蛙跳台阶

假如第一步跳一阶,后续是跳两阶台阶的方法,有2种;第一步跳两阶,后续是跳一阶台阶的方法,有1种。我的主页还有很多C语言的内容呀,如果帮助到了大家,希望大家可以点点关注呀!每次可以跳一阶台阶或者两阶台阶,请问有任意层数的台阶,青蛙一共有多少种跳法?:三阶台阶时,青蛙在刚开始时,面临一个选择,第一步是跳一阶还是跳两阶。两阶台阶时,青蛙有2种跳法,一阶一阶跳和一次跳过两阶。当只有1阶台阶的时候,青蛙只有1种跳法。

2023-08-23 23:53:58 78 2

原创 辗转相除法——不一样的视角

辗转相除是一种求最大公约数的方式,这篇文章其实是想从一些大家平时容易忽略的点入手,深入理解一下辗转相除。

2023-08-22 16:47:38 41 4

原创 一篇文章彻底让你弄懂sizeof 和strlen,快来看!

1.后面的例题涉及到了一部分指针和数组名的使用,总之记住一句话,除了sizeof(arr)和&arr这两种一模一样的形式时,数组名代表的是整个数组的地址(包括sizeof(*arr)这样也不属于这两种特殊类型),其余数组名代表的都是首元素地址。2.其实sizeof和strlen本质上是完全不同的,只不过他们都与长度、数组和指针联系起来了。而我们需要掌握的就是他们在各种不同用法之间抓住区别。

2023-08-17 21:58:07 103 7

原创 C语言指针(3)

既然指针变量也是一个空间,那我们是不是也可以用指针变量来存储一些正常的值呢,答案当然是可以的,以X64平台为例,指针变量可以存放八个字节长度的变量,但是其实这样就会失去指针变量的意义。二维数组数组名就是数组首元素地址,而且二维数组本质上也是连续排列的,所以传过去的就是第一行一维数组的地址。2.常量字符串不可以通过指针来修改,就行3 = 5,一定是错误的,所以一定要加上const,可以报错提示。b.但是要限定这个数组里面的指针类型是特定函数类型的指针,所以外面加的就是函数类型。其中有两个较为特殊的类型。

2023-08-16 22:10:47 57

原创 简单的一道逻辑题(找出凶手)

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词:A说:不是我。B说:是C。C说:是D。D说:C在胡说已知3个人说了真话,1个人说的是假话。现在请根据这些信息,写一个程序来确定到底谁是凶手。分析:在此我就不和大家分析这道题的结果了,正常的分析我们大家都可以分析出来,重要的是如何将一个逻辑过程实现成一串代码。无论凶手是谁,一定会让这四个人里面的任意三句话为真,所以鉴于C语言关系判断式中的。

2023-08-15 22:46:07 128

原创 C语言找出数组里落单的数字

题目:给你一个非空数组,除了某个元素只出现一次外,其余每个元素均出现两次,请找到那个只出现一次的元素。分析:1.暴力求解,直接全部遍历一遍。2.按位异或的性质,相同的数取按位异或后变成0,0和其他的数再按位异或就等于这个数本身,并且按位异或符合交换律。

2023-08-15 13:34:06 413 2

原创 递归实现喝汽水问题(C语言)

一元钱可以买一瓶汽水,两个空瓶可以换一瓶汽水,给任意钱,可以和多少瓶汽水。

2023-08-13 23:37:32 174 1

原创 C语言指针(2)

3.如第三个结果所示,在函数里使用形参求数组长度是不可以的,对于整型数组而言,sizeof(arr) / sizeof(arr[0]), X64平台是2,X86平台是1。1.一维数组传参形参既可以使用数组形式,也可以使用指针,因为本质上是传递过去首元素的地址。arr + 1之后跨过一个元素的大小,&arr + 1跨过一整个数组的大小。我们有整型数组,字符数组,顾名思义,指针数组就是以指针为元素的数组。2.提高效率,假如提前顺序已经排好了,就不需要重复浏览了。1.如果n个元素,需要排序n - 1趟。

2023-08-13 22:03:29 22 1

原创 C语言指针(1)

指针就是地址,在大多数文章以及书本里,经常会把指针变量简称为指针,但是实际上指针变量不等于指针,本系列文章在后续过程中如果出现了将指针变量简称为指针的情况会标明。

2023-08-12 21:29:06 49 1

原创 筛选法求素数———C语言

筛选法是一种求出一定范围内素数的方法,顾名思义,人们在纸上写下一串自然数,通过筛选法的操作将不是素数的数从纸上撕下来,留下一个个小孔。最后,纸张像筛子一样,得名筛选法。

2023-08-10 23:41:20 3026 1

原创 C语言操作符

i的初始值为0,i–结果-1,i为整形,sizeof(i)求i类型大小是4,按照此分析来看,结果应该是C语言的整型算术运算总是至少以缺省整型类型(计算机整型默认的类型-int)的精度来进行的,为了获得这个精度,表达式中的字符和短整形操作数**在使用前(参与算术运算之前)**都会被转换为默认的普通整型,这种转换称为整型提升。

2023-08-09 17:35:40 28 1

原创 函数递归学习

可能大家大部分人在第一次学习函数递归的相关知识的时候,对于这种思维方式可能不太能接受,因为这种处理问题的方式和人类大脑思考问题的方式不太一样,

2023-08-04 22:03:40 23 1

原创 gets函数和puts函数

如果是scanf(“%s”, arr),%s在读取的过程中,如果遇到空白字符,空格,换行,制表符,直接停止读取。gets可以避免这个问题,但是注意不能读取转义字符,例如输入\n,puts会把这个转义字符认成字符\和字符n。2.puts只能放一个参数,这点和printf有很大区别。专门为输入读取字符串准备。1.puts可以自动换行。

2023-08-02 22:02:50 775

原创 有关图形图案输出的题目

4.只有特别有规律,特别方便找点的情况下,才使用二维数组(例4,5)大部分不太容易找到点的规律的时候,必须要用循环的嵌套才能进行下去(例题1,2,3)。需要注意换行\n的应用,需要注意每一个小字符之间有几个空格,有的题会有模板可以复制到页面上,来仔细观察一下空格。3.这种图形图案的输入大体只有两种做法,一是单纯的利用循环的嵌套,另外一种是利用二维数组,其实本质类似,每一次一横的循环后,都需要\n来换行。2.空格:把输出格式的模板复制粘贴到输入代码的区域,观察空格。

2023-08-02 16:10:01 20

原创 扫雷游戏的实现

前言:本文讲解的是如何实现最基本的9×9的控制台模式的扫雷游戏可以实现的功能有如下1.可以通过游戏菜单进入或退出游戏2.随机布置10个雷3.如果选择的位置是雷,游戏结束如果选择的位置不是雷,会显示周围雷的个数。

2023-07-31 19:03:58 37 1

原创 C语言函数

return z;return 0;} //形参和实参的空间是不同的,可以通过调试来观察,fn+f11是进入函数。形参和实参,a和b这类实际传过来的需要处理的数据就是实参,定义函数是的x和y就是形参,形参只有在调用函数时,才会向内存申请空间。而且形参和实参的地址不同,形参只是实参的一份临时拷贝。return 语句return后边可以是⼀个数值,也可以是⼀个表达式,如果是表达式则先执行表达式,再返回表达式。return语句执行后,就彻底返回,后面的代码就不再执行了。int i = 0;

2023-07-29 18:02:16 12

空空如也

空空如也

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

TA关注的人

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