自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 堆的概念及结构

如果有一个关键码的集合K = { , , ,…, },把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中,并满足: 且 = 且 >= ) i = 0,1, 2…,则称为小堆(或大堆)。将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆。

2024-05-16 13:04:40 248

原创 二叉树入门

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。有一个特殊的结点,称为根结点,根结点没有前驱结点 除根结点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继 因此,树是递归定义的。注意:树形结构中,子树之间不能有交集,否则就不是树形结构。

2024-05-16 12:52:10 503

原创 力扣例题(两个栈实现队列优化)

上次我们的想法是创建两个普通的栈,在完成出栈与入栈后,为了保持顺序不变,我们采用的方法将元素从另一个栈中重新打回去,但是这样会导致时间大大加长,我们这次换一个思路。我们再pop八次,先将pop栈中剩下的三个元素弹出,之后pop栈为空,又将push栈中全部元素打入pop栈,继续pop即可实现队列的操作。我们再打入5个元素,push栈中存放6,7,8,9,10。打入5个元素,push栈中存放1,2,3,4,5。此时pop栈为5,4,3,2,1,push栈为空。pop两次后,pop栈中剩下5,4,3。

2024-05-12 14:21:28 267

原创 力扣例题(循环队列)

数组为满,我们拿size=5为例子,由于多开辟了一块空间,数组满时,head=0,tail为最后一个元素的下一个位置,最后一个元素下标为4,tail=5,那么满的情况即为(tail+1)%(size+1)==head。开始时head与tail都指向0(head为开始位置,tail为结束位置的下一个位置)不为空,我们给tail往前移即可,不需要对值进行更改,因为插入操作会将值给覆盖掉。这样的话,数组为空即为tail==head。如果数组不为空,那么返回起始位置的元素。tail==0,尾节点为size。

2024-05-11 16:33:02 389

原创 力扣例题(用栈实现队列)

返回队列开头元素与pop思路基本一致,唯一的不同点为原栈中不需要再将元素1删去,拷贝后直接将元素全部取回来即可。此时原栈成为空栈,我们将元素全部放回去即可,原栈顺序改为10,9,8,7,6,5,4,3,2。例如我们将10个元素放入栈中,假设最左边为栈顶,最右侧为栈底。此时原栈中只剩最后一个元素1,我们将1拷贝下来并踢出去即可。空栈中元素顺序为2,3,4,5,6,7,8,9,10。从队列的开头移除并返回元素,队列的开头为最右侧的1。则为10,9,8,7,6,5,4,3,2,1。我们先将前面的元素放入空栈中。

2024-05-11 15:50:18 478

原创 力扣例题(两个队列实现栈)

返回栈顶元素,和pop同样的思路,将前面的元素先全部打入空队列中,取出最后一个元素,先将他的值复制下来,之后再将该元素打入空队列即可。移除栈顶元素,也就是移除10,我们只需要将存有元素的队列中前面的全部元素均push到另一个空的队列中即可,在另一个队列中顺序不变。假设我们在队列中放入10个数据,分别为1,2,3,4,5,6,7,8,9,10。push 10,得到1,2,3,4,5,6,7,8,9,10。保持1,2,3,4,5,6,7,8,9。取出1,2,3,4,5,6,7,8,9。

2024-05-11 15:37:11 262

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

算法在编写成可执行程序后,运行时需要耗费时间资源和空间内存资源。因此,即时间复杂度和空间复杂度。。在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计 算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。

2024-05-11 15:24:14 994

原创 栈与队列(包括例题一道)

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。栈中的数据元素遵守后进先出LIFO)的原则。压栈:栈的插入操作叫做进栈压栈入栈,。出栈:栈的删除操作叫做出栈。。可以想象为羽毛球桶只可从上方放入,同时只能从上方先取但是并不代表插入顺序为1234的栈输出就一定为4321例如:插入12,取出21,插入34,取出43,顺序即为2143。

2024-05-07 21:01:15 1102 1

原创 力扣例题(接雨水)

然后进入循环,如果左右边界的最小值大于自身的高度,那么可接雨水为min(左边界,右边界)-自身。判断一块地方是否可以接到雨水,只需要判断他是否有左右边界使他可以接到水。如果一个点左边点的的边界高于左边的点自身,那么该处边界则与左边的点相同。同时此处可接雨水的高度为左右两处边界的最小值-自身的高度。左边界的第一个值与右边界的最后一个值均可修改为0。左右边界分别为此处左侧的最高点和右侧的最高点。我们可以创建两个数组代表某处左右边界的高度。否则该处边界即为左边的点。

2024-05-03 15:19:40 516 2

原创 链表例题(分割链表)

我们可以创建两个链表分别存放大于的值和小于的值。5个变量(记录链表当前位置的指针start,记录存放的链表当前位置的指针less与more,以及记录两个链表起始位置的指针start1与start2)1.如果链表为NULL,则将当前值位置传递给链表同时修改记录起始位置的指针。2.如果链表不为NULL,则将当前位置修改为链表的下一位置同时链表后移。即将小于特定值的节点放在前面,大于特定值的节点接在后面。需要先将大于特定值的链表尾节点指向NULL。为空,则返回大于的特定值的链表。不为空,则将两个链表接起来即可。

2024-05-01 17:58:07 2

原创 带环链表及例题

环形链表,链表中的尾节点指向链表中的某个节点导致形成循环的链表。通过图可以这样表示。我们一般采用快慢指针的方式解决带环链表的题目,下面直接上例题。

2024-04-30 22:39:48 622

原创 二分查找详解

二分查找是一种查找方式,用于在已经排好序的数组中寻找某个特定的数我们直接来介绍二分查找的查找方法。

2024-04-21 20:05:16 334

原创 贪吃蛇设计详解

在去年12月中,初次接触c语言,我靠着为数不多的知识,使用数组仿照写了一份贪吃蛇,现在时隔5个月,我已经有能力独立写出真正的贪吃蛇而不是简单的仿照(虽然写的是挺简单的)。

2024-04-20 21:45:36 1031 1

原创 双向链表的创建与修改

指向:单链表只能指向下一个节点。而双向链表既指向下一个,又指向前一个节点。循环:单链表的最后一个节点指向NULL。而双向链表最后又指向了头节点。带头:之前我们说的不太严谨,头节点和带头结点是两种东西,可以将带头结点head理解为“哨兵位”,即只负责监督,不参与链表修改。单链表的头节点指的是第一个有效节点,而双向链表的带头结点则是单独一块参与进去的节点,他的下一个节点为第一个有效节点。链表和数组最大的区别在于:数组可以很方便的找到某一位上的值,但是链表只能不停往后找。

2024-04-13 21:22:49 772

原创 单链表的创建与修改

链表可按照:1.双向,单向。2.循环,不循环。3.带头,不带头。根据不同组合可分为8类。其中不带头单项不循环链表为单链表。

2024-04-13 20:34:11 919

原创 通讯录(顺序表)保存数据

在通讯录的基础上加上三个函数实现数据的保存。分别为录入数据,加入数据与保存数据。

2024-04-04 18:05:09 216

原创 通讯录的实现(顺序表应用)

上一篇文章我们讲过顺序表的实现,通讯录与顺序表唯一的区别就是修改了变量,将原来的int类型数组修改为结构体数组,再加写扫雷时用到的方法,我们就可以创建这样一个通讯录。我们还是按照函数声明,函数实现与编写本体的顺序来介绍。

2024-04-04 16:21:26 310

原创 顺序表的创建

函数定义的源文件中我们要包含声明的头文件,之后在开始对函数进行定义。

2024-04-02 22:20:39 672

原创 宏定义详解

预定义符号也是在预处理期间处理的。写法为:printf2.#define 定义常量例子:#define定义为整个替换,如:加与不加';'要看具体场景类似这种则无需加上';3.#define定义宏:与上面相同,由于define为整个替换,所以下面:就会变成只要在宏上加上()即可解决这种问题但是又有可能有下面这种问题即处理方法为在两边加上括号4.带有副作用的宏参数例子:输出结果为原因在于,经过宏替换后,原来的z变成了。

2024-03-31 14:58:23 802

原创 编译与链接

在ASCI C的任何一种实现中,存在两种不同的环境:1.翻译环境,在这个环境中,源代码被转换为可执行的机器指令(二进制指令)2.运行环境,用于实际执行代码。流程:c文件->翻译环境->运行环境。

2024-03-27 18:34:26 839

原创 文件的读取与操作

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出 操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流 想象成流淌着字符的河。在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了 指针和⽂件的关系。⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或 者输出内容的⽂件。数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件。

2024-03-27 17:55:44 717

原创 文件读取与操作

因此例如num为10,则从文件中取出9个字符然后再str末尾加上\0)。若一行长度包括\n小于num,则将一行包括\n全部放入str中,末尾加上\0。mode为操作类型,有三种,分别为"r","w","a",意为以文本文件的形式:阅读,写,添加内容。"w"操作在打开时如果存在该文件,则会清空文件中的所有内容。如果不存在该文件,则会创建这一文件。成功读取到则返回对应字符的ascii码值,否则返回EOF(-1)。"rb","wb","wa",则为以二进制的形式进行上面的操作。在文件中加入字符串。

2024-03-23 16:28:34 140

原创 动态内存管理

注:以下函数均储存在<stdlib.h>头文件中。

2024-03-22 21:00:42 310

原创 结构体与联合体

特点:匿名结构体只能使用一次。

2024-03-20 20:46:29 843

原创 整数与浮点数内存存储方式

整数存储为int类型,4个字节存储,先按照首位符号位,其余均为二进制表示。若为非负数,原反补码相同。若为负数,符号位不动,将其余位置全部取反得到反码,再+1得到补码。存储时存的是补码然后再按照机器的大小端类型进行存储。大小端只会在存储地址上有所区别,不对存储地址进行修改基本没有影响。

2024-03-16 18:53:25 133

原创 拷贝函数与大小端字节序存储

用于将内存不重叠的两个数组进行拷贝。(以字节为单位)

2024-03-14 21:26:41 278

原创 字符串相关函数(更新)

首先是字符串的比较:字符串进行比较时无论是常量字符串还是字符串数组,比较的都是字符串的地址。通过strcmp进行比较才比较的是字符串的大小。

2024-03-12 18:38:55 316 1

原创 论如何查找重复出现固定次数的数字中唯一的只出现一次的那个数

以出现3次为例,我们有两种做法,一种是遍历,一种是按二进制方式存储。遍历会快一些但是很占空间,按二进制方式存储思路比较奇特,占用空间少但是慢。

2024-03-11 18:56:32 184 1

原创 string库函数实现与指针例题

string实现的函数先来实现三个,分别为strlen,strcpy与strcat。:[ ]为下标引用操作符,如arr[i],最后会转换成*(arr+i)。注:以下所有字符函数实现均需要满足长度不能越界,否则会警告。

2024-03-10 09:50:32 222 1

原创 指针详解(2)与结构体数据(部分)

例如数组arr[]arr为数组名,代表数组首元素的地址。&arr[0]同样代表数组首元素地址。&arr代表数组的地址。数组的地址等于数组首元素地址,但是+1时看指针类型决定跳过几个字节。前两个都是首元素地址,因此加1只会跳过1个元素的字节。而&arr是数组的地址,加1会跳过一整个数组的字节。除了sizeof(arr)与&arr中arr表示整个数组,其他时候arr都代表数组的首地址。数组传参的本质是传递数组首元素的地址,所以形参访问的数组和实参是同一个数组。

2024-03-08 20:09:20 295 1

原创 指针详解(1)

指针全称叫做指针变量,指针也是一种变量类型。指针变量存储的是地址。指针类型决定了指针加1,减1的时候一次走多远的距离,例如:char*+1走1字节,int*+1走4字节。注:指针-指针计算前提为两块指针指向同一块空间。sizeof()的返回值类型为unsigned int。

2024-03-07 16:57:32 372 1

原创 计算机计算原理(非专业)与相关操作符

计算机内部存储有这样几个概念:原码,补码,反码。存储的变量在计算机中最大能显示的数字与其存储所占位数相关。举例:一个整型变量有4个字节,一个字节占了8bit,因而一个整型变量在计算机中最大可由32位二进制表示。同时注意,存储时的第一位(从左到右的第一位,即最高位),为符号位,用于表示数字的正负。0为正,1为负。

2024-03-06 20:55:37 367 1

原创 递归经典问题(乌龟跳台阶)

递归是将大事化小,并且逐渐趋向退出条件的函数。我们使用递归往往可以很轻松的解决一个麻烦的问题。但同时也要注意递归使用时可能造成的浪费现象,多使用尾递归代替递归,这也相当于一种优化。

2024-01-26 14:21:31 281 1

原创 调试,栈区存储及错误类型笔记

C语言栈区默认内存使用习惯先使用高地址再使用低地址(具体要看编译器。x64版本或者release模式使用习惯是相反的),数组在内存中存储时随下标的增长,数组的地址由低到高变化。看案例,vs的x86版本debug模式改程序会陷入死循环,理由如下:不同环境不同编辑器情况下两种变量之间空出的空间大小不同。例如x86的debug模式空2位整型空间,vc6.0中间连续,gcc中间空一位。

2024-01-25 20:51:40 146

原创 指针初识(第一节课内容概括)

指针的主要用处就是直接对地址的值进行修改,就如之前我写过的贪吃蛇游戏,当时没有指针,我是依靠数组来对变量进行修改的。定义指针很简单,确定指针的类型然后在指针名字前加上'*'即可。一种类型的指针只能代表该类型的地址,就像上图int类型的指针只能用来记录int类型变量的地址。使用时'*'+'指针名字'代表指针记录的地址的值。当我们需要使用指针记录的地址上的值时,只需要在输出的时候在指针名字前加上'*'即可。OK,今天的指针初识结束,如果有不懂的可以研究一下上面的那段代码和输出程序,下次见,拜拜。

2024-01-05 16:06:55 377 1

原创 约瑟夫环问题

然后%sum,那么报数的人就一直在第一个人的位置0到最后一个人的位置sum之间循环,从第一个人报到最后一个人之后,下一个报数的人又回到了第一个人。然后我们进入循坏,判断从1开始(其实应该是从2开始,因为1肯定不成立,第一个报数的人是好人),哪个m满足条件那么就退出循坏,否则初始化数组,循环继续直到找到成立的m,第一个找到的即为最小的。由于原题k最大为13,因此我设置数组有26个位置,二维数组(一维也是一样的,因为只放了一个数),内部放上好坏类型,好人为1,坏人为0.然后输入k。

2023-12-27 15:37:56 356 1

原创 n位固定顺序栈的输出可能性数量(便于理解)

1.当输入数据不等于总数并且栈中剩余数据不为0时,调用自身,两种可能性,下一步操作是输入或者输出。以上是我的个人理解,这种方法计算栈的输出可能性虽然简单,但是缺点也很明显,递归非常的浪费时间。当然计算栈的顺序也是有专门的公式的,但是由于我目前不太清楚公式是怎么得出的没所以这里就不展开讲了,以后有机会会补上这份空白。a,b,c,d分别代表总共有多少数据要入栈,当前入了几个数据了,栈里面还剩下几个数据,以及计算可能性的种数。进行一次操作有两种可能,输入,或者输出,一旦全部输入,那么栈的输出顺序就固定下来了。

2023-12-21 20:19:53 344 1

原创 C 语言学习记录第八天(例题:字符串插入与判断回文)

之后先初始化总数sum为0,之后输入两个数组,a,b,分别代表两个数组长度,再来一个for循环,i代表插入的位置,从第一个数组的前面一直到最后,插入字符串然后判断是否为回文字符串,是的话总数加1。3个for循环,第一个是将第一个数组一个一个字符放入合并数组中,直到达到要插入的位置,第二个循环将第二个数组所有的字符放进去,第三个循环则是将第一个数组剩下的字符放进去。然后是插入函数,我定义了3个数组与3个变量,3个数组中前两个存放输入,最后一个存放合并后的。

2023-12-19 14:25:36 372

原创 C语言学习记录第7天

这里需要注意一点,字符串的最后一位必须是'\0',否则会产生神奇的反应,'\0'是终止符,如果没有'\0'那么字符串将会一直输出直到某个地方碰到'\0'为止。众所周知,strlen统计的是输入字符的个数,但同时由于第一个数下标为0,所以strlen除了代表输入字符的个数,也代表'\0'的位置。我的一点点修改是针对前两种方案,同样是对判断语句进行修改,但与三不同的是还是要有循环体,只是不需要在循环结束后另外将字符串的最后一位改为'\0'。只需要将判断语句改为第二个字符串当前位置的前一位是否为'\0'即可。

2023-12-18 16:20:37 322 1

原创 C语言学习记录第六天(字符的部分函数)

puts是输出字符串,getchar是输入单个字符,可以是数字,字母,也可以是空格,回车(但是scanf与getchar都有个小问题,都会把输入一个字符后的回车键也给放在缓冲区录进去,这一点只需要在scanf或getchar后再加上一个getchar吸收掉那个回车即可)。字符串比较是从左到右进行,两个字符串从左到右比,当前位置ASCII码值相同则进行后一位比较,如果不同,当前位置哪个ASCII码值大就是哪个字符串大,然后strcmp函数是左边和右边比,左大于右则为1,小于则为-1,相等为0。

2023-12-14 21:10:15 327 1

空空如也

空空如也

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

TA关注的人

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