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

原创 排序算法集合

其排序的过程极其复杂,具有许多不可控因素,不能简单地通过循环的层数来计算时间复杂度。希尔排序的代码很难理解,但是其解决问题的思想却很值得我们学习借鉴。

2024-06-02 19:48:58 1436 41

原创 用C语言把一棵普通二叉树安排得明明白白

一个结点含有的子树的个数称为该结点的度;如上图:A的为6:度为0的结点称为叶结点;如上图:B、C、H、I...等结点为叶结点:度不为0的结点;如上图:D、E、F、G...等结点为分支结点:若一个结点含有子结点,则这个结点称为其子结点的父结点;如上图:A是B的父结点:一个结点含有的子树的根结点称为该结点的子结点;如上图:B是A的孩子结点:具有相同父结点的结点互称为兄弟结点;如上图:B、C是兄弟结点:一棵树中,最大的结点的度称为树的度;如上图:树的度为6。

2024-05-23 19:52:19 740 46

原创 全面详解堆

/堆int size;}Heap;//初始化//销毁//插入//删除//返回堆顶元素//判空//向上调整//向下调整。

2024-05-17 15:56:46 883 45

原创 栈和队列的相互实现

队列的特点是先进先出,而栈的特点是后进先出(先进后出),也就是说重点在于利用两个队列来改变“出”的顺序。于是,我们就可以利用起另一个队列,将队尾元素之前的元素全部出队并入队到另一个队列。但是在出栈时,被删除的栈顶元素为队尾元素,而队列没有相应的删除队尾元素的接口。这时,我们就可以对队尾元素进行出队操作了,但是不将其入队到另一个队列中。注意到,将一个栈的数据依次转移到另一个队列时,栈的顶为发生了颠倒。于是,我们用一个栈来对队头进行操作,另一个栈来对队尾进行操作。这样我们就实现了出栈的操作。

2024-05-12 15:07:45 489 29

原创 链队列和循环队列

/ 链式结构:表示队列}QNode;// 队列的结构int size;}Queue;// 初始化队列// 队尾入队列// 队头出队列// 获取队列头部元素// 获取队列队尾元素// 获取队列中有效元素个数// 检测队列是否为空,如果为空返回非零结果,如果非空返回0// 销毁队列。

2024-05-11 20:55:04 930 28

原创 栈与递归的实现

int top;}Stack;//初始化//销毁//插入//删除//获取栈顶数据//判断是否为空//剩余数据个数递归的思路十分地巧妙,有利于我们分析与解决十分困难的问题,但其算法本身存在效率低下的问题,所以我们希望通过非递归的方式来实现递归解决问题的思路。当递归函数调用时,应按照“后调用先返回”的原则处理调用过程,因此栈成为了解决的一问题的不二人选。通过栈来实现递归,并没有特定的套路,需要在理解递归机制的基础上进行分析,解决问题的路径可能与递归算法相同也可能不同。

2024-05-10 18:09:06 974 26

原创 经典面试题---环形链表

如果你在面试中遇到了这道题并清晰流畅地答出了本文的内容,那么你的面试就稳了一半了。如果觉得写的不错就三连支持一下吧!加纳……

2024-05-07 18:14:48 845 32

原创 哈夫曼编码---一种无损数据压缩算法

1. 整体上要采用变长编码,出现频次多的字符用短码。2. 通过树来帮助我们编码,就可以保证某个字符的编码不是另一个字符编码的前缀。3. 往树的左子树表示编码增加一个“0”,往树的右子树表示编码增加一个“1”(也可交换)。4. 树的叶子节点表示一个字符,从根结点到叶子结点的路径就是该字符的编码。但问题是,即使按照以上的方式来编码,依然有很多可能的编码方式(树的形状)能供我们选择。既然都研究到这里了,我们肯定不会随机选择一个。

2024-04-28 21:38:21 1106 28

原创 C语言贪吃蛇(可在头文件中添加食物,选择撞墙是否会死)

项目为控制台程序,在控制台上实现。1. 实现游戏开始界面,让用户选择模式(撞墙/循环)等;2. 实现地图的绘制;3. 实现贪吃蛇,并使其根据用户的命令移动;4. 实现食物的随机刷新,并为每一种食物设置分值;5. 在游戏过程中打印适当的提示信息以及实时信息的刷新;6. 实现贪吃蛇的变长;7. 实时检测游戏状态(正常/撞墙/撞到自己);

2024-04-19 20:53:35 1192 22

原创 C语言双向链表

链表的种类很多,主要由三个要素决定:是否带头,单向还是双向,是否循环。根据这三个要素的组合,共可得到8(2*2*2)种链表1. 单链表:不带头单向不循环链表。2. 双向链表:带头双向循环链表。之前我们已经实现过单链表单链表在三个元素的选择中,选择的都是较为简单的选项,结构简单那就意味着我们在对其进行操作时所能用的现成条件较少,操作函数的实现就较为复杂。双向链表作为单链表的另一个极端,每个元素都选择了较为复杂的那个,而将结构设计的复杂的目的,就是为了解决一些操作实现起来很麻烦的问题。

2024-04-15 20:45:32 754 16

原创 如何开辟动态二维数组(C语言)

C语言标准库中并没有可以直接开辟动态二维数组的函数,但我们可以通过动态一维数组来模拟动态二维数组。二维数组其实可以看作是一个存着"DataType []"类型数据的一维数组,也就是存放着一维数组地址的一维数组。所以,我们就可以动态开辟一个数组指针数组,再为每一个元素动态开辟一个一维数组的空间,以此来模拟动态二维数组。但是,数组指针数组似乎也不太好开辟,或者说开辟完后不太符合我们的预期,因为其元素的类型为"DataType [n]",所指定的一维数组的大小无法修改。

2024-04-12 20:42:58 652 13

原创 单链表和文件操作使用练习:通讯录

1. Contact.h和Contact.c分别为实现通讯录的头文件和源文件。2. SList.h和SList.c分别为实现单链表的头文件和源文件。3. test.c为测试用的源文件,用于调用通讯录提供的函数。4. Contact.txt用于存储联系人信息。

2024-04-12 20:42:47 483 13

原创 C语言单链表

单链表相对于顺序表来说,优势有:1. 对数据进行增加删除较为方便,因为我只需要改变结点之间的链接关系即可。2. 不会浪费空间,有需要我才会开辟新的结点(尽管每个结点都是结构体,所占空间比数组元素多)。劣势:1. 查找不便,只能一个一个地通过next指针来查找,且无法访问某结点的前一个结点。而顺序表则可通过下标访问操作符来对数据进行直接访问。

2024-04-09 21:40:56 1698 15

原创 C语言实现快速排序算法

快速排序的非递归算法是用栈模拟递归实现的,由于太麻烦我就没写,感兴趣可以自己尝试写写。单趟排序算法用哪个,快速排序递归还是非递归,层次较深时换用什么排序算法,这些都是可以自由组合的。

2024-04-06 19:03:21 1278 32

原创 稀疏矩阵的链式存储结构:十字链表

int row;//1~n//非零元素所在行,列后继链域//行,列链表的头指针向量int m;//行数int n;//列数int len;//非零元素个数}CrossList;

2024-04-04 15:34:37 725 3

原创 稀疏矩阵的三元组表表示法及其转置

/一个三元组元素//非零元素行下标和列下标}Triple;//稀疏矩阵//非零元素的三元组表//矩阵行数,列数,非零元素个数//容量}TSMatrix;

2024-04-04 11:13:17 2764 13

原创 C语言实现顺序表

代码仅作参考,顺序表是一种思想而不是固定的程序或代码,只要能达到相同的目的即可。其细节要依据实际要处理的问题来进行修改。C语言实现学生管理系统-CSDN博客。

2024-04-02 17:48:39 949 9

原创 编译和链接

在C语言标准(ANSI C)的任何一种实现中,都存在两个不同的环境:翻译环境和执行环境。翻译环境:负责将该环境中的源代码转换为可执行的机器指令(二进制指令)。执行环境:负责实际执行代码。而翻译环境所作的事,就主要是进行编译和链接。编译:处理项目中的各个源文件(.c),并生成对应的目标文件(.obj)。链接:建立各个目标文件之间的联系。其中,编译还可被分为三个过程:预处理(预编译),编译,汇编。

2024-04-02 17:48:26 1346 9

原创 文件操作(随机读写篇)

首先要指出的是,本篇文章中的“文件指针”并不是指FILE*类型的指针,而是类似于打字时的光标的东西。打开文件时候,文件指针会指向文件开头。刚打开文本文件时,文件指针自动指向文件起始处,之后会随读写内容移动。读数据时,从文件指针位置向后读取,读取成功后,文件指针指向被读取数据的末尾;写数据时,从文件指针位置向后写,写入成功后,文件指针指向被写入数据的的末尾。当我们想要在某指定位置处读取数据,或着在某指定位置处写入数据时,就需要用到接下来所要介绍的函数,也就是进行文件的随机读写。

2024-03-30 17:45:49 786 10

原创 文件操作(顺序读写篇)

上面说的适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);所有输出流一般指适用于标准输出流和其他输出流(如文件输出流)。建议先看。

2024-03-30 16:09:58 913 5

原创 老壁灯带你入门动态规划

这种解法,虽然极力避免了对重复情况的考虑,但是其递归的本质,还是使其在处理较大数据时会超时。而且,相比于动态规划,这种解法似乎有点无头苍蝇的感觉,对所有情况进行无差别尝试。回溯的解法,其运算过程像是树一样,不断展开,每一种情况对应树的一个末梢。有了这个树状的结构,我们其实可以将每种情况是什么一并打印出来,但是这道题只要求我们求出可行方案的种数。所以,我们似乎还是做了很多不必要的工作,我们的小问题留下的信息太多了,我们每次计算做的事也太多了。

2024-03-27 21:49:40 1106 7

原创 文件操作(基础知识篇)

可以将内存中的数据持久化地存储到文件中。我们所运行的程序的数据是存储在电脑的内存中的,如果不将数据持久化地存储起来,那么在程序退出时,内存中的数据就会随内存的回收而消失。可以持久化保存数据的,就被称为外存,如硬盘(文件),光碟等。例如,你写了一个通讯录来管理自己的联系人,但是你并没有将联系人的信息存储到文件中。那么,随着程序的退出,你联系人的信息会全部被清除,当你再次打开程序时,就需要重新录入联系人的信息。这使得该程序毫无意义。

2024-03-27 21:49:00 744 8

原创 C语言实现学生管理系统

这是迄今为止,第一个由我自己独立完成的项目,没有借鉴过相关的文章或视频。项目中依然存在许多问题,例如缺少对学生或课程信息输入合法性的检查……对学生和课程的查找功能本应该单独封装为函数的,但是我在写了好几个涉及该功能的函数之后才意识到这个问题,实在懒得大改了,于是将错就错,反正这个功能写起来也并不麻烦。算上头文件总计920行代码,最有成就感的一集。

2024-03-24 16:55:16 1151 5

原创 利用Base64加密算法将数据加密解密

Base64准确来说并不像是一种加密算法,而更像是一种编码标准。我们知道现在最为流行的编码标准就是ASCLL,它用八个二进制位(一个char的大小)表示了127个字符,任何二进制序列都可以用这127个字符表示出来。而Base64则是用6个二进制位表示了64个字符,也就是说,任何的二进制序列也都可以用这64个字符表示出来,这也是其名称的来源。我们加密的方法,就是将原来的信息以ACSLL的标准转化为二进制序列(如果不是6的倍数,就用0补齐),然后按照Base64的标准,将其转化为该标准下的字符。

2024-03-23 20:20:16 2312 13

原创 浮点数在计算机中的存储

浮点数的存储与整数的存储规则不同,其遵循IEEE 754的规定来存储。值得注意的是,由于M(有效数字)的位数是有限的,所以并不是所有浮点数都能精确存储在float类型的数据之中。

2024-03-23 20:19:55 1014 1

原创 从一无所有的角度出发,带你一步步实现kmp算法

kmp算法就是在一个字符串中寻找子字符串的算法,其由D.E.Knuth、J,H,Morris和 V.R.Pratt三位大佬共同提出,所以叫kmp算法。该算法将解决该问题的时间复杂度,从原本暴力算法的O(n*m)降低到了O(n),尽管在数据量较小时并不能节省很多的时间,但是对于极大的数据量是很有意义的。这就是我所理解的kmp算法,核心有两个:1. 让i不回溯,这是让时间复杂度降低的根本所在。2. 根据上一次匹配留下的信息,使子字符串的前缀与已匹配部分的后缀相匹配。

2024-03-21 21:43:12 1219 11

原创 电子科技大学链时代工作室招新题C语言部分---题号H

这一版中,我们考虑了许多种情况,可以看到if和else语句写了一长串,以告诉程序在遇到不同情况时该怎么做。感兴趣的小伙伴可以仔细看看第4和5个分支,这种情况是最难想到的。比如输入aab和bbc时,正确答案应该是aba,而没有这两个分支时会输出acc。虽然这段代码看起来天衣无缝,万无一失,能讨论的情况都考虑了(我至今都想不通到底是什么测试用例会导致其失败)。但是在oj上跑时,始终会提示“wrong answer on test 2!

2024-03-21 21:42:59 839 3

原创 电子科技大学链时代工作室招新题C语言部分---题号G

这一段代码的问题就在于add那里,将开头连续的1一并忽视掉。这就会导致需要单独处理一开始就只有开头连续1的情况,我们已经说过,当你开始考虑特殊情况时,你就已经输了一半。不止如此,这还会导致我们能产生的最多字节变化的数量减少,因为开头的连续1也可以断开产生更多变化字节。还是那句话,当你的代码需要考虑特殊输入情况时,你就要想办法改改它了,尽管它看起来万无一失。

2024-03-19 20:26:29 1031 3

原创 电子科技大学链时代工作室招新题C语言部分---题号F

最低血压的一题,主要是题目要求太松了。

2024-03-19 20:26:13 695 4

原创 电子科技大学链时代工作室招新题C语言部分---题号E

前面已经说了,这是一气之下写出来的破罐子破摔写法,没有什么参考意义。经过这几天的做题,我发现,当你开始用if语句来处理各种特殊情况时,你就失败一半了。能用通用算法的,绝不用if语句来处理特使情况。所以千万不要放弃一个较好的算法而去尝试暴力解法。

2024-03-15 17:26:32 990 1

原创 电子科技大学链时代工作室招新题C语言部分---题号D

这一版解法缺乏对题目的深入分析,以及对数学关系的挖掘。由此导致程序做了很多不必要的计算,使得时间复杂度过高而超时。这次深入分析了题目中的数学关系,并对算法做了大量的优化。但是仍然超时,能反应的过来吗牢底?我当时血压都高了。但是没办法,我们只能继续做优化。这次循环最多只有一重了,如果再不过就不太厚道了。那么也是理所当然地拿下第一题。你问为什么第一题是D?因为前三道是保护自尊心的送分题,小学生都会做,我们就直接跳过。C语言题的题号一直到H,感兴趣的同学点波关注,我们尽快更新。

2024-03-14 20:19:38 1045 4

原创 内存函数详解

此时,arr+2指向的空间与arr指向的空间是有重叠部分的,结果并不是我们所预期的“1 2 1 2 3 6 7”而是“1 2 1 2 1 6 7”(不同平台可能有不同的结果,vs2022和vscode输出的都是前者,因为他们对该函数的实现较为完善,与memmove的实现相似。1. memcpy函数的作用是内存拷贝,即将source指向的空间中的num个字节拷贝到destination指向的空间中去,然后返回destination原本的值。由于指向的空间有重叠的部分,所以source中一定会有内容被修改。

2024-03-06 22:02:26 454 4

原创 C语言结构体的大小,结构体内存对齐

在自己正真了解过之前,一直认为结构体的大小就是结构体内部成员大小的总和。但当你去尝试打印结构体的大小时,会发现事实并非如此,也不会像你想的那样简单。给出这样的两个结构体,它们的元素完全相同,只是定义的顺序不一样。按照直觉来说,它们的大小都应该是两个字符和一个整形的大小的总和,也就是6。但是当我们实际打印出来之后会发现,struct S1的大小是8,而struct S2的大小是12。也就是说,结构体的大小肯定不只是由其成员的大小和数量决定,至少还会与其成员定义的顺序有关。

2024-03-06 22:02:07 966 1

原创 详解字符串函数<string.h>(下)

在不同的系统和C语言标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头文件中说明 的,C语言程序启动的时候就会使用⼀个全局变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会讲对应 的错误码,存放在errno中,而⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是 有对应的错误信息的。5. strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标记。

2024-03-01 16:40:23 786 2

原创 详解字符串函数<string.h>(上)

该函数会将“source”指向的字符串追加到“destination”指向的字符数组的后面,原本的'\0'会被覆盖,源字符串的'\0'会被一起追加到字符数组之后(某些实现中可能是额外添加的'\0')。由于strlen函数返回值的类型为“size_t”(unsigned int),所以两个strlen函数返回值相减,得到的结果的类型也是“size_t”,而该类型的数据一定会是大于等于零的,这与我们的代码所表达的意思不一致。在使用时,要求用户传入需要计算长度的字符串的起始位置,并返回字符串的长度。

2024-03-01 16:40:15 1036 4

原创 详解8道指针笔试题(后四道)

cp[2]”减减,其值变为“c”,解引用后得到地址1。6.“cpp[-2]”相当于“*(cpp-2)”,也就是对“cpp(3)”解引用得到“c+3”,“c+3”再次解引用得到地址4。4.“p”的类型为“int(*)[4]”,“p”加四跳过四个含四个元素的数组,“p[4]”又等价于“ *(p+4)”, 即如图所示的绿色数组,“p[4][2]”则代表该数组的第二个元素;1.创建含四个元素的“char* ”类型数组“c”,所含四个地址分别指向“ENTER”,“NEW”,“POINT”,“FIRST”的首元素;

2024-02-20 15:54:47 892 2

原创 详解8道指针笔试题(前四道)

经典指针笔试题,做不了吃亏,做不了上当

2024-02-20 13:50:48 326

原创 通过sizeof和strlen来深入理解数组名和指针

当我们遇到sizeof(数组名),strlen(字符数组名)或是sizeof(指针有关表达式)等问题的时候,我们就需要清楚地知道括号里的内容到底代表着什么,而研究这些问题就可以帮助我们深入理解数组名和指针。

2024-02-18 17:24:47 952

原创 递归经典问题:青蛙跳台阶和汉诺塔问题

假设有n个台阶,青蛙每次跳跃可跳过一个或两个台阶,要使青蛙跳到最上面,有多少种跳法?

2024-01-24 19:24:56 1058 1

原创 C语言解决N皇后问题

显然,我们需要一个二维数组来充当棋盘,以记录有哪些位置是不能放置的。i < n;i++)j < n;j++)由于题上给的n为一个变量,所以在无法使用变长数组的情况下我们可以使用动态数组。将棋盘初始化为0以便之后进行标记。这时候就有人要问了:“你都初始化为零了,为什么不用int类型的数组呢?道理很简单,int类型变量占四个字节,而char类型变量占一个字节。

2024-01-01 19:31:20 652 2

空空如也

空空如也

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

TA关注的人

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