- 博客(47)
- 收藏
- 关注
原创 学习C++(2)缺省参数+引用
缺省参数(也叫默认参数)是声明或定义函数时为函数的参数指定的一个缺省值( 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须在函数声明给缺省值)。①必须用const引用引用一个const对象,const引用也可以引用普通对象,因为对象的访问权限在引用过程中可以缩小,但是不能放大。引用不是重新定义⼀个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间, 引用变量和它引用的变量共用同一块内存空间。在链表中,由于引用不能改变指向,引用必须初始化,所以引用不能代替指针。
2025-10-06 00:59:15
426
原创 学习C++(1)命名空间+输入&输出+函数重载
经过一段时间C语言的学习,虽然中间有差不多半年的时间没有继续学(忙于学校的课程),总之C++的部分终于开启了,作者我在学C语言的时候就比较向往C++,因为身边的计算机专业同学是从C++开始学起的,给作者的感觉是更难且更高级一些,在作者看来,学习一门类似C++这样专业性较高的语言像是踏进了一个新的门槛,能看到一个全新的世界,我也非常愿意在这个过程中一步一步地感受到自己的提升,那么,像刚开始学习C语言时我发的第一篇博客一样,做一个自我介绍:我是一名大二的学生,对于计算机语言有很高的学习兴趣,为了熟练掌握计算机语
2025-09-13 00:28:41
589
原创 学习数据结构(16)快速排序
快速排序的基本思想:快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该基准值将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后左右子序列重复该过程,直到所有元素都排列在相应位置上为止。
2025-09-02 01:05:11
757
原创 学习数据结构(15)插入排序+选择排序(上)
最后将arr[imin]的值和arr[begin]的值交换,arr[imax]的值和arr[end]的值交换,begin往前移一位,end往后移一位。有一个需要注意的点:当最大值就是arr[begin]时,此时arr[imin]先和arr[begin]交换,那么imax标记的是最小值,arr[imax]再和arr[end]交换就会出错,解决方法是把imin赋给imax,此时arr[imin]先和arr[begin]交换,imax标记的就是最大值,再将arr[imax]和arr[end]交换。
2025-08-31 15:56:19
913
原创 学习数据结构(14)二叉树OJ
若传入的根节点为空,返回true,在不为空的情况下,若左子树节点存在且根节点的值与左子树节点的值不一致,返回false,若右子树节点存在且根节点的值与右子树节点的值不一致,返回false,若以上判断都为真,继续遍历左子树和右子树,只有当左子树和右子树返回值都为true时,函数才返回true。先将输入的字符串储存到数组中,在创建二叉树的函数中,若遍历到'#',返回NULL,否则依据值创建二叉树节点,并对当前创建的节点的左右指针递归调用函数,返回当前节点的指针。对创建好的二叉树通过递归进行中序遍历。
2025-08-30 01:08:51
1146
原创 学习数据结构(13)二叉树链式结构下
循环判断队列是否为空,若不为空则提取队头数据,将队头出队,若队头数据不为空指针,则二叉树为非完全二叉树,销毁队列,返回false,若直到跳出循环队头数据一直为空指针,则二叉树为完全二叉树,销毁队列,返回true。若给出二叉树的前序序列,则序列中第一个即二叉树的根节点,若给出二叉树的中序序列,则根节点左右两侧的序列分别是根节点的左子树和右子树,若给出二叉树的后序序列,则序列中最后一个即二叉树的根节点。④某二叉树的后序遍历序列与中序遍历序列相同,均为ABCDEF,则按层次输出(同一层从左到右)的序列为(A)
2025-08-28 23:12:26
362
原创 学习数据结构(12)Top-K问题+二叉树链式结构上
以求前K个最大的数据为例,假设数据集合中有N个数据,首先用数据集合中前K个数据建小堆(若要求前K个最小的数据则建大堆),然后将剩余N-K个数据依次和堆顶数据做比较,若数据大于堆顶数据则入堆并调整,遍历完数据集合后,堆中的数据就是数据集合中前K个最大的元素。链式结构二叉树的节点由三个域组成,数据域和左右指针域,左右指针分别指向该节点的左孩子和右孩子,若无孩子,则指向NULL。Top-K问题即求大量数据中最大或最小的前K个数据,由于数据量较大,一般的方法都不可取,故使用堆的方式解决问题。
2025-08-27 09:15:48
231
原创 学习数据结构(11)二叉树(堆)下
如果有⼀个集合 K = {k0,k1,k2,...,k(n-1)} ,把它的所有元素按完全二叉树的形式存储在一个一维数组中,并满足:K(i)<=2*i+1且K(i)<=2*i+2(K(i)>=2*i+1且K(i)>=2*i+2),i=0,1,2... ,则称为小堆(或大堆),将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆。通过向上调整或向下调整将数组排列成堆的结构(若要排升序,则建大堆,排降序,则建小堆),将数组开头的元素和末尾的元素交换,将此时数组开头的元素看作双亲,向下调整。
2025-02-19 22:23:09
701
原创 学习数据结构(10)栈和队列下+二叉树(堆)上
将不为空队列中前Size-1个元素入队列进另一个为空的队列中,同时将前Size-1个元素从不为空队列中出队列,则原先不为空队列中只剩一个元素,取队头数据,再将此数据出队列,返回队头数据。先判断q1队列是否为空,若为空,则将元素入队列q1,否则将元素入队列q2,即将元素入队列进不为空的队列中,但第一次入队列时,尽管q1,q2都为空,元素仍会入队列q2。题目要求实现的函数有六个,分别是初始化队列,入队列,从队列开头移除并返回元素,返回队头元素,判空,销毁队列。当s1和s2都为空时,MyQueue为空。
2025-02-15 23:29:36
794
原创 学习数据结构(9)栈和队列上
遍历字符串,遇到左括号则入栈,遇到右括号时,判断栈是否为空,是则,销毁栈,直接返回false,不是则取栈顶数据,判断栈顶数据是否与右括号相对应,是则将栈顶数据出栈,不是则销毁栈,直接返回false,循环结束,判断栈是否为空,为空则说明括号全部配对,返回true,不为空则只有一种可能:栈中有未配对的左括号,返回false。队列是只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特点,进行插入操作的一端称为队尾,进行删除操作的一端称为队头。
2025-02-13 00:23:41
400
原创 学习数据结构(8)双向链表
顺序表在随机访问,频繁访问上具有优势,链表在任意位置插入或删除数据上具有优势,顺序表可能存在空间浪费,链表不存在空间浪费。传一级指针:(能保持接口一致性)双向链表一般指带头双向循环链表。
2025-02-10 20:45:08
481
原创 学习数据结构(7)单链表OJ下+链表分类
C为环形部分的周长,假设slow刚到入环节点时,fast在如图所示的位置,此时fast与slow之间的距离为N,由于fast每次走三步,slow每次走一步,所以每运动一次fast和slow之间的距离就会减少两步,若N为偶数,则N不断减2最终可以为0,即fast和slow相遇,若N为奇数,N会减为-1,此时slow和fast错过,fast和slow之间的距离变为C-1,若C-1为偶数(即C为奇数),则fast和slow可以相遇,若C-1为奇数(即C为偶数),则fast和slow还是不能相遇,最终也不会相遇。
2025-02-09 11:12:50
1026
原创 学习数据结构(6)单链表OJ上
创建新的空链表,在两个指针都不为NULL的条件下,两个指针分别同时遍历两个链表,每次遍历比较节点中数据的大小,小的数据节点尾插到新链表中,退出循环后,将不为空的链表指针以后的所有节点尾插到新链表中,但这种方法由于新链表为空链表,在插入第一个节点时与插入后面的节点写法不同,造成代码比较冗杂。:(我的解法)遍历链表,得到节点个数,节点个数除以二,得到从头节点到中间节点的遍历次数,再遍历链表,找到中间节点,但较复杂。(参考代码)和解法一类似,但对起始的三个相邻节点的选择不同,且更加简洁。
2025-02-07 00:28:12
382
原创 学习数据结构(4)顺序表+单链表
链表中每个节点都是独立申请的(即需要插入数据时才去申请⼀块节点的空间),需要通过指针 变量来保存下一个节点位置才能从当前节点找到下一个节点。节点⼀般是从堆上申请的,从堆上申请来的空间,是按照⼀定策略分配出来的,每次申请的空间可能连续,可能不连续。链表是⼀种物理存储结构上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。节点的组成主要有两个部分:当前节点要保存的数据和保存下⼀个节点的地址(指针变量)链式结构在逻辑上是连续的,在物理结构上不⼀定连续。
2025-01-29 16:08:29
561
原创 学习数据结构(3)顺序表
(注意要保证有效数据个数不为0且pos大于等于0,小于有效数据个数,当pos等于0时相当于头部删除,当pos等于有效数据个数-1时相当于尾部删除)(注意要保证pos大于等于0,小于等于有效数据个数,等于0时相当于头部插入,等于有效数据个数时相当于尾部插入)(这里注意要保证有效数据个数不为0)
2025-01-28 11:57:51
606
原创 学习数据结构(2)空间复杂度+顺序表
函数栈帧在编译时已经确定了,只需要关注函数在运行时额外申请的空间,有size_t end、size_t i、int exchange 三个额外创建的变量,F(N)=3,故空间复杂度为O(1)顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口。递归算法的空间复杂度=单次递归的空间复杂度*递归次数,每调用一次递归函数开辟一个函数栈帧,这里调用了N次,空间复杂度为O(N)(这是作者在百度上找的图)
2025-01-26 23:45:06
1482
原创 学习数据结构(1)时间复杂度
若要查找的字符在字符串第一个位置,T(N)=1,若要查找的字符在字符串最后一个位置,T(N)=N,若要查找的字符在字符串中间位置,T(N)=N/2或N/2+1(N是偶数),或T(N)=(N+1)/2(N是奇数),因此,Fucn5的时间复杂度分为:最好情况:O(1),最坏情况:O(N),平均情况:O(N)T(N)=M+N,若M和N相差不大,T(N)可看成2N或2M,若M>>N,T(N)=M,若M<<N,T(N)=N,故时间复杂度为O(N)T(N)=N^2+2*N+10,只保留最高次项,则时间复杂度为O(N)
2025-01-25 20:20:25
934
原创 复习C语言(2)
strlen函数遇\0结束,所以要找数组中第一次出现0的位置,由于数组是字符型数组,所以只需使-1--i补码的后八位全为0即可,-1的补码为11111111111111111111111111111111,当i=255(00000000000000001111111111111111)时,a[i]为0,所以strlen(a)=255。(3,4)是逗号表达式,逗号表达式的值为最后一个表达式的值,即4,那么数组中有4个元素,共16个字节。5>若输入字符中含有非数字字时,返回非数字自负前面的数字。
2025-01-19 01:48:16
390
原创 复习C语言(1)
按照课程安排,作者的C语言理论学习基本结束,今天开始开一个新的C语言复习系列,收集整理在C语言复习过程中发现的遗漏点以及C语言的编程题。
2024-10-27 18:35:55
284
1
原创 学习C语言(25)
C语言设置了一些预定义符号,可以直接使用,预定义符号是在预处理期间处理的__FILE__(进行编译的源文件)__LINE__ (文件当前的行号)__DATE__(文件被编译的日期)__TIME__ (文件被编译的时间)__STDC__(如果编译器遵循ANSI C,其值为1,否则未定义)(VS2022没有完全遵循ANSI C,未定义)例:#define MAX 1000;case(注:定义的内容如果过长,可以分行写,在分开的处加一个续行符\即可)
2024-10-20 21:34:03
1045
原创 学习C语言(23)
上面的适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);所有输出流一 般指适用于标准输出流和其他输出流(如文件输出流)
2024-10-06 00:49:16
1095
1
原创 学习C语言(21)
编译器只为联合体最大的成员分配足够的内存空间,联合体的特点是所有成员共用同⼀块内存空间。所以联合体也叫:共用体给联合体其中一个成员赋值,其他成员的值也跟着变化。
2024-09-28 23:24:30
1167
原创 学习C语言(20)
如:structint a;char b;float c;}x;char b;float c;}a[20],*p;上面两个结构在声明的时候省略掉了结构体标签在上面代码的基础上,p=&x;是不合理的编译器会把上面的两个声明当成完全不同的两个类型,所以是非法的,匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使用⼀次。
2024-09-25 23:12:26
1317
原创 学习C语言(19)
数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容保存在内存的低地址处。数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容保存在内存的高地址处。整型提升:11111111 11111111 11111111 10000000。和momcpy的差别是memmove函数处理的源内存块和目标内存块是可以重叠的。memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。超过⼀个字节的数据在内存中存储的时候,会遇到存储顺序的问题。(1)设计一个小程序来判断当前机器的字节序。
2024-08-30 23:54:12
439
原创 学习C语言(16)
arr为字符数组中第一个元素的地址,解引用后为字符a,字符a的ASC||码值为97,strlen函数默认把97看作地址,向后统计字符串长度,97作为地址的空间不一定属于当前程序,程序可能会报错。int arr[i][j]中arr表示二维数组名,a[i]表示一维数组名,有时可作地址,arr表示地址时指整个首个一维数组的地址(二维数组可以看作元素为一维数组的数组)初始化数组的大括号中很容易看成大括号,这里是小括号,表示逗号表达式,所以数组初始化实际上是{1,3,5,0,0,0}这种写法是把a的地址赋给p。
2024-08-19 23:21:45
547
原创 学习C语言(10)
在n=n&(n-1)中,当n末位是1时,-1后为0,结果末位必是0,则必少一个1;当n末位是0时,n-1打乱了末位前的分布,必出现错位,有错位必出0,则必少一个1;有符号整数的三种表示⽅法均有符号位和数值位两部分,2进制序列中,最⾼位的1位是被当做符号位,剩余的都是数值位。符号位都是用0表示“正”,⽤1表示“负”,无符号整数全为数值位。(1)结构体是自定义的数据类型,结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量,如:标量,数组,指针,甚至是其他结构体。
2024-08-03 00:19:20
637
原创 学习C语言(9)
(1)bug指程序漏洞,调试(debug)是寻找程序中存在的问题的过程(2)Debug通常称为调试版本 ,包含调试信息,不做任何优化,便于程序员调试程序Release称为发布版本,往往进行了各种优化,不包含调试信息,便于客户使用。
2024-07-30 23:59:02
589
原创 学习C语言(8)
(1)单个文件C语言编译器对源代码进行编译是从第一行往下扫描的,如果在函数调用之前没有发现函数的定义,就会报警告,为了解决这个问题,应该在函数调用之前先声明这个函数,声明函数需要交代清楚函数的返回类型,函数名,和函数的参数(相当于函数定义的第一行),函数声明中参数只保留类型,省略掉名字也是可以的函数的定义也是一种特殊的声明,所以也可以把定义放在调用之前(2)多个文件一般情况下,函数的声明,类型的声明放在头文件(.h)中,函数的实现放在源文件(.c)中。
2024-07-24 14:14:14
415
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅