自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++ string(二)

第一次开不超过16字节的空间在buff上,不在堆上,超过buff的空间,会把buff的空间不要,在堆上重新开一块空间,把原数据拷贝过去,但是buff的空间还是存在的。length 是string中的size,size比较好用,length是在STL之前就存在的,要向前兼容。会开好比n大的空间( >= n),开的是有效的字符的空间,不包含 \0,提前开好空间。const迭代器类似于const int* 只能改变指针的指向,不能改变指向的内容。迭代器(iterator):像指针一样的东西,不一定是指针。

2024-08-03 17:33:14 910

原创 C++ STL简介+string(一)

C++标准库中有exception(异常),iostream(io流),string(字符串),STL(数据结构与算法)string属于C++标准库,string里有100多个函数,我们重点看20,30个,从使用到模拟实现最后到底层。原始版本:惠普->P.J.版本(VS)->SGI版本(GCC,G++)由于编码原因string是被typedef出来的。string的构造,析构,赋值都是深拷贝。string底层是自动开辟的动态的数组。STL是C++标准库的重要组成部分。string:管理字符串的数据结构。

2024-08-02 10:15:54 916

原创 C++模版简介(初阶)

用模版的好处:C语言规定函数不能同名,要写两个不同名的函数,C++有函数重载,可以同名,但是也要写两个参数不同的函数,用函数模版可以提高效率不用写两个函数了。用的同一个模版,调用不同的类,编译器生成了两个不同的类,类模版的参数类型不同(int,double)模版实例化:用函数模版生成对应的函数,跟用类名生成对应的对象一样(用类名实例化对象)如果有实际的函数存在和模版同时也存在,就走函数,因为编译器追求高效,不用推导实例化。不看模版类型是否匹配,要看实例化后的函数类型是否匹配。模版分为函数模版和类模版。

2024-08-01 09:28:32 402

原创 C++内存管理

operator new 和 operator delete 是系统提供的全局函数,new的底层是operator new申请空间,delete的底层是operator delete释放空间。operator new实际上也是通过malloc来申请空间的,申请空间成功就直接返回,失败就抛异常,需要用try,catch捕捉异常,operator delete通过free来释放空间。申请和释放连续的空间,new [] 和 delete[]申请和释放单个元素的空间new 和 delete操作符。

2024-07-29 14:45:49 586

原创 C++类和对象(四)—— 初始化列表,类型转换,友元,匿名对象,static成员

定义:在参数列表后面,以冒号开头,逗号分隔,每个成员变量后面都有括号,括号里可以是初始值或表达式初始化列表是初始化值的地方,是定义的地方三种必须在初始化列表初始的:1.constconst修饰的变量必须在定义的地方就初始化,只有一次初始化的机会,后面不能够修改2.引用引用必须在定义的时候就初始化,只有一次机会初始化3.没有默认构造的自定义类型有默认构造会调用默认构造,没有默认构造就要显示地传值或表达式,也就是有传参的构造去初始化,所以要在初始化列表就定义初始化每个构造函数都有初始化列表:每个成

2024-07-28 09:31:55 910

原创 C++类和对象(三)—— 赋值运算符的重载,日期类的实现,取地址运算符的重载

取地址运算符重载分为普通运算符重载和const 运算符重载,正常情况下,编译器自动生成的就够用,但是特殊情况下,我们不想别人取到当前类对象的地址,想胡乱返回一个地址。比如Print函数中隐含的this指针,本身是Date* const this,加上const后变成了const Date* const this。,它的名字由operator和后面要定义的运算符共同构成,它和其他函数一样,也具有返回值,参数列表,和函数体。const 修饰的成员函数称之为const成员函数,const在参数列表的后面。

2024-07-25 10:17:15 547

原创 C++类和对象(二)—— 构造,析构,拷贝构造

成员会。

2024-07-18 14:40:29 552

原创 C++类和对象(一)

class是关键字,stack是类名,类名就是类型,用stack定义一个变量stack x;类里面的变量是成员变量,函数称为成员函数//函数体int main()stack x;

2024-07-13 16:21:01 751

原创 C++的入门基础(二)

在语法上引用是给一个变量取别名,和这个变量共用同一块空间,并不会给引用开一块空间。取别名就是一块空间有多个名字类型& 引用别名 = 引用对象int main()int a = 2;int& b = a;int& c = a;int& d = b;//对d取别名,d是b的别名,b是a的别名,d就是a的别名b++;// 都是3//这就说明了b、c、d都是a的别名,和a共用同一块空间return 0;

2024-07-11 15:44:09 702

原创 C++的入门基础(一)

本贾尼·斯特劳斯特卢普博士在C的基础上增加了面向对象的特性,这时又增加了继承和、类、封装的概念,为后来的面向对象的编程奠定了基础,这被命名为C++

2024-07-08 23:12:04 624

原创 七大排序-冒泡排序,插入排序,希尔排序(一)

1.先说冒泡排序,冒泡最好是直接有序,但是基本上不可能,如果数字是随机数的话,冒泡基本上都是最坏的情况,冒一趟,其中一个大的数冒到后面了,但是中间可能还有其他大的数,那么基本上就是O(N^2)了。,有n个数,将第n-1下标的数,插入到区间[0,n-2]中,这样会比较n-1次,假设每次都比较最后一次的情况是n-1次,最外层的趟数是n-1,那么时间复杂度是O(N*N):外层循环是比较的趟数N-1次,假设j 一直等于0,内层循环就每次走N次,那么时间复杂度是O(N*N)第二次排序的消耗 (1+2+…

2024-07-06 17:10:57 1308 1

原创 二叉树的链式访问 与 二叉树专题

1.前序遍历:先访问根节点,再访问左子树,最后访问右子树根 左 右2.中序遍历:先访问左子树,再访问根,最后访问右子树左 根 右3.后序遍历:先访问左子树,再访问右子树,最后访问根左 右 根N 表示 NULL前序访问顺序:1 2 3 N N N 4 5 N N 6 N N中序访问顺序:N 3 N 2 N 1 N 5 N 4 N 6 N后序访问顺序:N N 3 N 2 N N 5 N N 6 4 1子问题是:root不为空,k不等于1转化为求左子树加右子树第三层的节点个数每层k都减1,如

2024-07-04 19:23:36 852

原创 二叉树(概念详解)

1.到h-1层都是满节点的,最后1层是不满的,但是从左到右必须是连续的。:一个节点含有的子树的根节点,父亲节点的下一个节点是孩子节点。答案不是的,C语言中的栈和堆是操作系统中的可以存储数据的空间。:若一个节点含有子节点,则称这个节点是它子节点的父节点。1.父亲节点大于任何一个它的孩子节点(根是最大的)1.父亲节点小于任何一个它的孩子节点(根是最小的)树的子树之间是独立的,所以子树之间是不相交的。1.从上到下都是满的,从左到右节点都是连续的。:叶节点是没有子树的节点,也是度为0的节点。

2024-05-28 13:37:53 961 2

原创 栈和队列专题(LeetCode)

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。1.后取地址,相当于开了一个新的队列,在新的队列中许多值是未定义的,相当于随机值,所以不能后取地址。比如tail = 0,k = 4 时,-1+5 = 4 % k+1 = 4,就取到队尾的下标了。,比如非空队列 1 2 3 4,1 2 3导到空的队列中,4直接pop,对应栈顶的删除。将pushlist中的数据导入poplist中,先进的数据就达到先出的效果了。// 返回 False。

2024-05-28 10:34:45 1955 1

原创 leetcode刷题--长度最小的子数组

只要sum加到大于等于target就进来循环,每次都减去起始位置的数,count是每次的长度,让i滑动起来,i++终止条件就是sum < target,就拿到最终的长度了。用滑动窗口不会超出时间限制。普通的暴力解法过不了了。j : 终止位置。

2024-05-23 11:41:59 254

原创 数据结构栈和队列(队列的详解)

假设开始队列为空,phead和ptail都指向NULL要改变一级指针的指向(值)要使用二级指针,解引用改变一级指针。

2024-05-17 09:10:02 960 1

原创 栈和队列(栈的详解)

栈做题关键是找最近的匹配(东西),比如leetcode中括号的匹配,最后祝大家题题AC。

2024-05-12 21:38:19 678 1

原创 二分查找的四种情况

二分查找不断折半,直到找到目标数据,如果找到最后一个数据还没找到,那么就找不到了二分查找又称为区间查找,分为四种情况[ ]左闭右闭,( ]左开右闭,[ )左闭右开,()左开又开( ),[ ) ,[ ] 这三种比较相似,( ]这个画图也可以轻松解决最后在这里祝大家题题AC,好运连连。

2024-05-10 09:30:07 212

原创 时间复杂度与空间复杂度(上篇)

算法在运行的过程中要消耗时间资源和空间资源所以衡量一个算法的好坏要看空间复杂度和时间复杂度时间复杂度衡量一个算法的运行快慢空间复杂度是一个算法运行所需要的额外的空间一个算法中我们更关心的是时间复杂度。

2024-05-07 23:33:12 1120 1

原创 贪吃蛇游戏(C语言实现)

打印前四个节点,打印完第四个节点退出循环,把cur下一个节点打印成空,也就是最后一个节点打印成空释放最后一个节点,把倒数第二个节点的下一个节点的地址置为NULL,倒数第二个节点不用打印,之前打印了前5个节点,节点不会消失,所以倒数第二个节点存在。QQ录屏20240507163633。

2024-05-07 16:56:43 390 1

原创 LeetCode刷题 -- 经典题目,相交链表

望博友们多多支持,祝福我们题题AC。

2024-04-28 20:43:13 297

原创 C语言递归刷题(一)

递归最重要的就是去思考它的结束条件如果有不足之处,还望博友们指出最后祝福我们题题AC。

2024-04-27 20:43:49 593 1

原创 win32 API 函数

WIN32API就是MicrosoftWindows32位平台的应⽤程序编程接⼝win32 API 中有许多可以调用的函数下面就为大家介绍一下这些函数。

2024-04-20 17:13:24 916 1

原创 单链表实现通讯录

Contact.h 声明通讯录函数,定义结构体。test.c 测试通讯录函数。Contact.c 实现通讯录函数。为了方便,就调用单链表的部分函数来实现通讯录。用单链表实现通讯录需要五个文件。姓名,性别,年龄,电话,地址。但其实三个文件也可以实现。

2024-04-19 20:15:38 295

原创 单链表(详解)

链表在物理结构上不一定是连续的在逻辑结构上一定是连续的(可以通过前一个节点的指针找到下一个节点)链表是由一个一个的节点组成的,一个节点存储:指向下一个节点的指针和一个任意类型的数据由此可以知道链表可以通过前一个节点的指针找到下一个节点,各个节点就串联起来了也可以把链表类比成一列火车,火车(链表)有一列列车厢(节点)组成。

2024-04-19 17:19:21 828 1

原创 Leetcode刷题——链表的中间节点

解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。给你单链表的头结点 head ,请你找出并返回链表的中间结点。输入:head = [1,2,3,4,5,6]如果有两个中间结点,则返回第二个中间结点。输入:head = [1,2,3,4,5]解释:链表只有一个中间结点,值为 3。所以慢指针走一个节点,快指针走两个节点。2*慢指针 = 快指针。输出:[3,4,5]输出:[4,5,6]偶数个数据有两个节点。奇数个数据有1个节点。

2024-04-15 18:34:33 273 1

原创 双向链表的实现(详解)

链表的分类: 带头 不带头 单向 双向 循环 不循环一共有 (2 * 2 * 2) 种链表带头指的是:带有哨兵位节点哨兵位(头结点):可以放随机数据,哨兵位指向的下一个节点就是我们的第一个有效节点,我们指的头节点是哨兵位单向:指针只能从前向后遍历双向:指针既可以从前向后遍历又可以从后向前遍历循环:可以通过尾节点找到头节点,从而达到循环主要使用的链表是单链表和双向链表单链表:不带头单向不循环双向链表:带头双向循环。

2024-04-14 23:29:03 535 1

原创 动态顺序表实现通讯录代码(详解)

基于动态顺序表实现通讯录项目顺序表的每个数据都是一个结构体也就是每个联系人信息。

2024-04-07 20:23:10 626 2

原创 数据结构顺序表的初始化,头插,尾插,头删,尾删,指定位置删除,指定位置插入,查找,销毁(详解)

数据结构是什么?数据结构是两个词的集合数据:是一系列的在杂乱无章的数据的集合结构:是有条理,清晰的集合(例如目录)数据结构就是一些有条理数据的集合数据结构是计算机存储和组织数据的方式顺序表是线性表的一种那么顺序表和线性表到底是什么呢?线性表:具有相同特性的数据结构的集合例如:蔬菜:黄瓜,白菜,莲藕相同特性:蔬菜顺序表的底层是数组,但是在数组的基础上有增删查改等方法,就变成了数据结构线性表有物理结构和逻辑结构线性表:物理结构:不一定是连续的逻辑结构:一定是连续的。

2024-04-06 20:48:13 623

原创 文件操作详解(三)--fsee -- ftell -- rewind -- feof函数 -- ferror函数

文件已经结束,ferror读取的时候没有发生错误返回0,发生错误返回非0值。feof没有读到文件末尾返回0,读到文件末尾返回非0值。文件现在读取结束了,但是是什么原因读取结束的呢?feof的作用是:文件读取结束的时候,SEEK_CUR:文件指针当前位置。返回文件指针相对于起始位置的偏移量。让文件指针的位置回到文件的起始位置。SEEK_SET:文件的起始位置。SEEK_END:文件的结束位置。这是test.txt中的字符串。2.可能是读取的时候发生了错误。1.可能是遇到了文件末尾。

2024-04-04 12:43:16 412 5

原创 文件操作详解(二)

fprintf – 把数据以格式化的形式打印到指定的输出流(例如屏幕,文件等)上。fgets会读num-1个字符,最后一位会留给\0(\0是自动放入的)fscanf – 从指定的输入流(文件或键盘等)上读取格式化的数据。把数据以格式化的形式打印在指定的输出流(屏幕,文件等)上。scanf – 从标准输入流(键盘)上读取格式化的数据。从指定的输入流(文件或键盘等)上读取格式化的数据。第二个参数是每个元素的大小(以字节为单位)第二个参数是每个元素的大小(以字节为单位)第一个参数是要写入文件中的字符。

2024-04-03 21:38:22 1081 6

原创 offsetof宏定义的使用和模拟实现详解

offsetof的第一个参数是数据类型(结构体或联合体),第二个参数是偏移量(offsetof用于计算结构体和联合体的偏移量)返回值的类型是size_t(无符号整形)offsetof要包含的头文件stddef.h因为偏移量是某个地址距离0地址处的大小,所以肯定是一个正数struct Achar a;int b;int main()//0//%zd表示size_t类型,//4//对齐规则不知道的可以看我的结构体那篇//计算的都是这个元素的第一个字节的地址距离0地址处的大小。

2024-04-03 16:41:10 429

原创 文件操作详解(一)

我们用pf这个文件指针来指向某个文件的文件信息区(结构体变量),能通过文件信息区的信息可以访问这个文件,:标准输出流,大多数情况下都是输出到显示器界面的,printf输出到标准输出流中。stdin、stdout、stderr其实是FILE*类型的,他们都是文件指针。数据在内存中以二进制的形式存储,不加转化地输出到外存,就是二进制文件。,这些文件信息保存在一个结构体变量中,该结构体变量是由系统声明的。存储在硬盘上的是文件,文件分为数据文件和程序文件两种类型(根据。例如:程序运行时需要从中读取数据的文件,

2024-03-31 22:20:44 1007 1

原创 编译和链接详解

是由malloc,realloc,calloc开辟的动态内存,最后是由free函数释放掉动态开辟的内存的。,正常终止main函数,也可能是意外终止(有可能是出BUG卡死,或突然没电了)将汇编代码转换成二进制指令,即汇编是编译的最后一步,会生成目标文件,词法分析就是简单地将字符分割成关键字,标识符,括号,加号,乘号等。跟据图中信息,如果用add函数去找Add函数,这就是链接错误,库可能是支持基本函数运行的库,也可能是第三方的库。静态分析:通常包括声明和类型的匹配,类型的转换等。

2024-03-31 14:22:58 555

原创 预处理详解(二)-- 条件编译 - 头文件包含 - ##和#运算符

int a = 1;int b = 2;# undef MAX //MAX的宏定义被移除了,后面无法运行了 int c = MAX(a , b);return 0;int a = 1;int b = 2;# undef MAX //MAX的宏定义被移除了,后面无法运行了 int c = MAX(a , b);return 0;int a = 1;int b = 2;# undef MAX //MAX的宏定义被移除了,后面无法运行了 int c = MAX(a , b);

2024-03-30 21:44:48 995 4

原创 预处理详解(一) -- 预定义符号与#define定义

s _ _FILE_ _ //文件%s _ _ DATE_ _ //日期%s _ _ TIME_ _ //时间%d _ _ LINE_ _ //行号%d _ _ STDC_ _ //如果编译器支持 ANSI C,那么该值为1,//否则未定义#define定义常量在预处理阶段被替换成对应的内容(stuff)// name:符号名// stuff:符号内容1000//使用reg 等同于使用 registe,还更为简洁for;;//初始化//调整//判断都可以省略不写。

2024-03-30 16:04:25 1106 2

原创 动态内存管理

要解决这个问题非常简单,只要这个指针不使用了,要把它立即置为NULL,这样再对它进行多次释放,指针为空,free函数为空,什么也不做,就不存在对同一块空间的多次释放。3.需要扩展的空间后方没有空间可以扩张,并且堆中也没有符合要求的空间给50字节扩张,所以无法正常开辟空间,会返回NULL。1.刚好后面的空间是足够存下调整后的空间的大小的。所以会在堆区重新找一份新的空间,并且大小符合要求。并且会把原有的20字节的内容拷贝到新开辟的空间中。2.后面的空间不足以装下调整后的空间。free函数释放空间的指针。

2024-03-26 23:06:01 2245 6

原创 对结构体的认识

2.位段的成员是不能是用&操作符的,所以不可以直接给位段成员scanf(输入值),只能先输入一个值放入一个变量中,然后这个变量再赋值给位段的成员。1.位段的成员名的类型必须是int,unsigned int,signed int 在C99位段的成员也可以选择其他类型。要传结构体的地址,地址压栈比较小 而传结构体过去,结构体压栈的开销比较大,会导致性能的下降。这样写是错的,结构体的大小里面再包含一个结构体+一个整型的大小。自引用:在结构体中包含自己本身的结构体类型的变量。结构体类型是一种自定义类型。

2024-03-23 21:49:03 479 3

原创 牛客的一道题(C)变种水仙花

变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461),(14和61),(146和1),如果所有拆分后的乘积之和等于自身,则是一个Lily Number。例如:求出 5位数中的所有 Lily Number。

2024-03-23 17:11:13 313 1

原创 牛客的一道题(C)序列中删除指定数字

有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。数据范围:序列长度和序列中的值都满足1<=n<=50。

2024-03-23 16:42:00 369 2

空空如也

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

TA关注的人

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