<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[m0_56808122的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/m0_56808122</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; m0_56808122]]></copyright><item><title><![CDATA[C++中的引用知识点小结]]></title><link>https://blog.youkuaiyun.com/m0_56808122/article/details/122784157</link><guid>https://blog.youkuaiyun.com/m0_56808122/article/details/122784157</guid><author>m0_56808122</author><pubDate>Sun, 06 Feb 2022 11:22:11 +0800</pubDate><description><![CDATA[文章目录引用的概念引用特性常引用使用场景引用和指针的区别
引用的概念
引用不是新定义一个变量，而是给已存在变量取了一个别名，编译器不会为引用变量开辟内存空间，它和它引用的变量共用同一块内存空间。
比如：李逵，在家称为"铁牛"，江湖上人称"黑旋风"。那么这里的“铁牛”、“黑旋风”就称李逵的引用。
在程序中呢，引用的用法如下：
类型&amp; 引用变量名(对象名) = 引用实体；
举个例子：
void TestRef()
{
	int a = 10;
	int&amp; ra = a;//&lt;====定义引]]></description><category></category></item><item><title><![CDATA[【Leetcode】链表的回文结构与相交链表]]></title><link>https://blog.youkuaiyun.com/m0_56808122/article/details/122707734</link><guid>https://blog.youkuaiyun.com/m0_56808122/article/details/122707734</guid><author>m0_56808122</author><pubDate>Sat, 29 Jan 2022 15:10:08 +0800</pubDate><description><![CDATA[文章目录链表的回文结构相交链表
链表的回文结构

所谓回文结构通俗的讲就是链表的节点要关于中间的节点对称，那么如何判断是否对称呢，思路如下：
首先我们需找出链表中的中间节点，然后再将中间节点作为新的头节点来创建一个新的链表，往后的节点依次尾插到该头节点后，再将该新链表逆置，最后再将新链表与原链表做比较即可。
图示如下：

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), nex]]></description><category></category></item><item><title><![CDATA[【Leetcode】链表的合并与分割]]></title><link>https://blog.youkuaiyun.com/m0_56808122/article/details/122706617</link><guid>https://blog.youkuaiyun.com/m0_56808122/article/details/122706617</guid><author>m0_56808122</author><pubDate>Thu, 27 Jan 2022 18:21:53 +0800</pubDate><description><![CDATA[文章目录合并两个有序链表链表分割
合并两个有序链表
首先看题目描述：

当看完题目后，我们知道实现两链表的合并不可能在原链表中完成，所以我们需要新建链表，通过对原先两链表之间各个节点的比较依次将节点尾插在新建的链表中，最后返回新节点即可。图示如下：

需要注意的是，当两链表中有一个链表已经走到尾结点，那么证明另一个链表中的剩下的节点的值都是比走结束的那个链表中的节点值要大，所以最后还需将这些剩下的节点都尾插到新链表中。
代码实现如下：
/**
 * Definition for singly-linked ]]></description><category></category></item><item><title><![CDATA[双向循环链表详解及其基本功能的实现]]></title><link>https://blog.youkuaiyun.com/m0_56808122/article/details/122691066</link><guid>https://blog.youkuaiyun.com/m0_56808122/article/details/122691066</guid><author>m0_56808122</author><pubDate>Tue, 25 Jan 2022 21:45:44 +0800</pubDate><description><![CDATA[文章目录循环链表概念定义节点类型及初始化销毁链表链表头插链表尾插特定位置插入链表头删链表尾删特定位置删除查找节点获取节点个数判断链表是否为空打印链表
循环链表概念
在单链表详解中我们提到了链表的几种基本的结构，在这里要详细讲到的就是带头双向循环链表，其结构如下：

该链表拥有1个头节点，且每个节点都有一个前驱指针和一个后继指针，分别用来保存前一个节点的地址和后一个节点的地址，这样就能够实现链表的双向访问的功能，需要注意的是链表的最后一个节点的后继指针指向头节点，头节点的前驱指针指向最后一个节点，带头双向循环]]></description><category></category></item><item><title><![CDATA[【Leetcode】单链表中快慢指针(双指针)的运用]]></title><link>https://blog.youkuaiyun.com/m0_56808122/article/details/121307287</link><guid>https://blog.youkuaiyun.com/m0_56808122/article/details/121307287</guid><author>m0_56808122</author><pubDate>Sat, 13 Nov 2021 21:14:41 +0800</pubDate><description><![CDATA[文章目录Leetcode876.链表的中间结点链表中倒数第k个结点
Leetcode876.链表的中间结点

相信对于学习链表的初学者来说，首次看到这个题目时，首先想到的应该是通过对整个链表进行一遍遍历求出链表节点的个数，然后再通过循环来找到中间节点(实不相瞒我第一次也是这样想的)。但是通过两次循环，不免增加了代码量和时间复杂度。那么，接下来就介绍一下最优的解题思路。
最优思路
定义两个指针，其中一个指针为慢指针，另一个指针为快指针，对本题而言，慢指针每次走一步(向前移动一个节点)，快指针每次走两步(向前移]]></description><category></category></item><item><title><![CDATA[单链表基础知识详解——基本概念结构及函数实现(增删查改)]]></title><link>https://blog.youkuaiyun.com/m0_56808122/article/details/120822151</link><guid>https://blog.youkuaiyun.com/m0_56808122/article/details/120822151</guid><author>m0_56808122</author><pubDate>Tue, 19 Oct 2021 16:45:21 +0800</pubDate><description><![CDATA[文章目录链表的概念及结构初始化链表打印单链表创建新节点计算链表节点数单链表头插单链表尾插特定位置插入特定位置之前插入特定位置后插入单链表头删单链表尾删特定位置删除删除特定位置的节点删除特定位置的后一节点单链表查找修改链表
链表的概念及结构
概念：链表是一种物理存储结构上非连续、非顺序的存储结构，数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。链表由一系列结点（链表中每一个元素称为结点）组成，结点可以在运行时动态生成，每个结点包括两个部分：一部分是存储数据元素的数据域，另一部分是存储其他结点地址的指针域]]></description><category></category></item><item><title><![CDATA[Leetcode初体验：移除元素 与 删除有序数组中的重复项]]></title><link>https://blog.youkuaiyun.com/m0_56808122/article/details/120710582</link><guid>https://blog.youkuaiyun.com/m0_56808122/article/details/120710582</guid><author>m0_56808122</author><pubDate>Tue, 12 Oct 2021 16:34:45 +0800</pubDate><description><![CDATA[文章目录移除元素删除有序数组中的重复项
移除元素

图解：

代码如下：
int removeElement(int* nums, int numsSize, int val){
    int src=0;
    int dst=0;
    while(src&lt;numsSize)
    {
        if(nums[src]==val) //当src处的位置为val时，src向前移动一步
        {
            src++;
        }
        els]]></description><category></category></item><item><title><![CDATA[一学就会的顺序表 —— 结构及各种接口 ( 头插 / 删、尾插 / 删、特定位置查找 / 插入 / 删除 ) 的实现]]></title><link>https://blog.youkuaiyun.com/m0_56808122/article/details/120670956</link><guid>https://blog.youkuaiyun.com/m0_56808122/article/details/120670956</guid><author>m0_56808122</author><pubDate>Sat, 09 Oct 2021 17:00:26 +0800</pubDate><description><![CDATA[文章目录顺序表概念及结构初始化顺序表检查容量销毁顺序表打印顺序表增加数据头插尾插特定位置插入删除数据头删尾删特定位置删除顺序表查找顺序表修改
顺序表概念及结构
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构，一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表一般可分为：

静态顺序表：使用定长数组存储元素
动态顺序表：使用动态开辟的数组存储

两者的结构区别如下图：

现实中，静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了，空间开多了浪费，开少了不]]></description><category></category></item><item><title><![CDATA[数据结构初章——时间复杂度与空间复杂度]]></title><link>https://blog.youkuaiyun.com/m0_56808122/article/details/120529898</link><guid>https://blog.youkuaiyun.com/m0_56808122/article/details/120529898</guid><author>m0_56808122</author><pubDate>Tue, 28 Sep 2021 23:42:39 +0800</pubDate><description><![CDATA[文章目录算法效率算法的复杂度时间复杂度大O的渐进表示方法常见时间复杂度计算举例复杂度对比空间复杂度
算法效率
算法效率主要涉及两种，即时间效率与空间效率；而时间效率在算法中是以时间复杂度来表示，空间效率在算法中是以空间复杂度来表示，接下来就来介绍一下复杂度。
算法的复杂度
算法在编写成可执行程序后，运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏，一般是从时间和空间两个维度来衡量的，即时间复杂度和空间复杂度。
时间复杂度主要衡量一个算法的运行快慢，而空间复杂度主要衡量一个算法运行所需要的额]]></description><category></category></item><item><title><![CDATA[C语言学习阶段性总结！(内附超详知识导图+重点知识详解)]]></title><link>https://blog.youkuaiyun.com/m0_56808122/article/details/120502542</link><guid>https://blog.youkuaiyun.com/m0_56808122/article/details/120502542</guid><author>m0_56808122</author><pubDate>Mon, 27 Sep 2021 11:13:32 +0800</pubDate><description><![CDATA[C 语言学习阶段性结束啦！！！
经过几个月时间的学习，终于对C语言有了更加全面的认识和理解，为了有更完整的知识框架，特意制作了一张思维导图，在此分享给各位博友：

重难点知识详解
函数系列：
库函数详解 (一)
库函数详解 (二)
指针系列：
指针系列 (一)
指针系列 (二)
指针系列 (三)
指针系列 (四)
指针系列 (五)
当然除了上述博主认为的重难点之外，其实C语言中还有许许多多的重要知识点都罗列在导图中，有兴趣的博友欢迎一起学习！
下一阶段将是对数据结构和算法的学习，希望以此为基，能够收获更多的]]></description><category></category></item><item><title><![CDATA[通讯录2.0版本（文件保存版）]]></title><link>https://blog.youkuaiyun.com/m0_56808122/article/details/120379670</link><guid>https://blog.youkuaiyun.com/m0_56808122/article/details/120379670</guid><author>m0_56808122</author><pubDate>Sun, 19 Sep 2021 14:17:51 +0800</pubDate><description><![CDATA[前言：在此前的一篇博客  通讯录动态版本  中我完成了一个能够动态增加容量的通讯录，当通讯录运行起来的时候，可以给通讯录中增加、删除数据，此时数据是存放在内存中，但是当程序退出的时候，我们会发现通讯录中的数据就不存在了，等下次运行通讯录程序的时候，数据又得重新录入，这样的通讯录使用起来不免会有很多麻烦，所以为了解决这个问题，本次将会带来通讯录2.0版，即可以用文件保存的版本。接下来我们一起来看看吧！
在 一次性就能学会的文件操作！ 介绍了许多对文件的操作，本次就会用到这些操作来优化我们的通讯录。
文章目录保]]></description><category></category></item><item><title><![CDATA[一次性就能学会的文件操作！(文件操作函数详解)]]></title><link>https://blog.youkuaiyun.com/m0_56808122/article/details/120301436</link><guid>https://blog.youkuaiyun.com/m0_56808122/article/details/120301436</guid><author>m0_56808122</author><pubDate>Thu, 16 Sep 2021 23:40:15 +0800</pubDate><description><![CDATA[前言：在上一篇博客关于文件的基础知识中我们对文件有了一定的了解，本篇博客将会详细讲解操作文件的函数。
文章目录文件的顺序读写字符输入输出函数 ——  fgetc 与 fputcfputc函数fgetc函数文本行输入输出函数 ——  fgets 与 fputsfputs函数fgets函数格式化输入输出函数 ——  fscanf 与 fprintffprintf函数
文件的顺序读写
文件顺序读写的函数如下，接下来我们将一一介绍这些函数。

注：在使用这些函数之前要引用头文件 &lt;stdio.h&gt;
在此]]></description><category></category></item><item><title><![CDATA[关于文件的你需要知道的一些基本知识]]></title><link>https://blog.youkuaiyun.com/m0_56808122/article/details/120291937</link><guid>https://blog.youkuaiyun.com/m0_56808122/article/details/120291937</guid><author>m0_56808122</author><pubDate>Tue, 14 Sep 2021 23:24:32 +0800</pubDate><description><![CDATA[文章目录什么是文件为什么使用文件文件类型文件缓冲区文件指针文件的打开和关闭
什么是文件
文件是计算机文件，属于文件的一种，与普通文件的载体不同，计算机文件是以计算机硬盘为载体存储在计算机上的信息集合；在程序设计中，我们一般谈的文件有两种：程序文件、数据文件 (从文件功能的角度来分类的)。
程序文件：
包括源程序文件（后缀为.c）,目标文件（windows环境后缀为.obj）,可执行程序（windows环境
后缀为.exe）。
数据文件：
文件的内容不一定是程序，而是程序运行时读写的数据，比如程序运行需要从中]]></description><category></category></item><item><title><![CDATA[通讯录动态版本的实现（源码+分析）]]></title><link>https://blog.youkuaiyun.com/m0_56808122/article/details/120236343</link><guid>https://blog.youkuaiyun.com/m0_56808122/article/details/120236343</guid><author>m0_56808122</author><pubDate>Sat, 11 Sep 2021 23:50:41 +0800</pubDate><description><![CDATA[文章目录通讯录功能关键功能的实现1.创建和初始化通讯录2.增加联系人3.删除联系人4.查找联系人5.修改联系人代码总览test.ccontact.hcontact.c运行效果
通讯录功能
实现的通讯录为一个动态增加版本的通讯录，该通讯录能够通过需求自行的增加存放联系人的数量，主要功能为：
1.能够根据需求（要存多少联系人就给多少空间）存放联系人信息
联系人的信息：姓名+性别+年龄+电话+地址
2.能够增加人的信息
3.能够删除指定人的信息
4.能够查找指定人的信息
5.能够修改指定人的信息
6.能够显示通讯]]></description><category></category></item><item><title><![CDATA[动态内存管理详解（动态内存函数介绍 + 常见动态内存错误 + 经典笔试题）]]></title><link>https://blog.youkuaiyun.com/m0_56808122/article/details/120194112</link><guid>https://blog.youkuaiyun.com/m0_56808122/article/details/120194112</guid><author>m0_56808122</author><pubDate>Fri, 10 Sep 2021 17:01:56 +0800</pubDate><description><![CDATA[文章目录为什么存在动态内存分配动态内存函数malloc和free
为什么存在动态内存分配
我们已经掌握的内存开辟方式有：
例如
int val = 20;// 在栈空间上开辟四个字节
char arr[10] = {0};// 在栈空间上开辟10个字节的连续空间

但是上述的开辟空间的方式有两个特点：
1.空间开辟大小是固定的。
2.数组在申明的时候必须指定数组的长度，它所需要的内存在编译时分配。
但是对于空间的需求，不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道，那数组的编译时开辟空]]></description><category></category></item><item><title><![CDATA[位段及其内存分配]]></title><link>https://blog.youkuaiyun.com/m0_56808122/article/details/120102834</link><guid>https://blog.youkuaiyun.com/m0_56808122/article/details/120102834</guid><author>m0_56808122</author><pubDate>Sun, 05 Sep 2021 00:50:49 +0800</pubDate><description><![CDATA[文章目录什么是位段位段的内存分配位段跨平台问题
什么是位段
位段的声明和结构体是类似的，但有两个不同之处：
1.位段的成员必须是int、unsigned int、signed int或char（属于整型家族）类型
2.位段的成员名后面有一个冒号和一个数字
举个栗子：
struct A
{
  int _a:2;
  int _b:5;
  int _c:10;
  int _d:30;
};

这里的A就是一个位段类型。
那么位段类型中的成员的冒号后的数字代表什么意思呢？
其实冒号后面的数字代表该成员需要用]]></description><category></category></item><item><title><![CDATA[结构体内存对齐（结构体大小的计算）]]></title><link>https://blog.youkuaiyun.com/m0_56808122/article/details/120077214</link><guid>https://blog.youkuaiyun.com/m0_56808122/article/details/120077214</guid><author>m0_56808122</author><pubDate>Sat, 04 Sep 2021 16:53:28 +0800</pubDate><description><![CDATA[文章目录结构体内存对齐规则
结构体内存对齐规则
我们知道，每种类型都有相应的大小，如int型占4字节，double型占8字节，char型占1字节；那么结构体也为一种类型，它的大小为多少呢？
我们可以举个栗子看一看
#include&lt;stdio.h&gt;
struct S1
{
	char c1;
	int i;
	char c2;
};
struct S2
{
	double d;
	char c;
	int i;
};
int main()
{
	printf("%d\n", sizeof(str]]></description><category></category></item><item><title><![CDATA[库函数详解（二）—— 内存函数+模拟实现（部分）]]></title><link>https://blog.youkuaiyun.com/m0_56808122/article/details/120021195</link><guid>https://blog.youkuaiyun.com/m0_56808122/article/details/120021195</guid><author>m0_56808122</author><pubDate>Wed, 01 Sep 2021 12:03:39 +0800</pubDate><description><![CDATA[文章目录memcpy——内存拷贝11.函数功能2.模拟实现memmove——内存拷贝2（可重叠）1.函数功能2.模拟实现memcmp——内存比较memset——内存设置
memcpy——内存拷贝1
1.函数功能

memcpy函数是用于拷贝内存块的函数，该函数有三个参数，第一个参数为拷贝的目标地址（void * destination），第二个参数为拷贝源地址（const void * source），因为在拷贝过程中源字符串不会变化，所以参数用 const 修饰，第三个参数为在内存中拷贝的字节数（size]]></description><category></category></item><item><title><![CDATA[库函数详解（一）—— 字符串函数+模拟实现（部分）]]></title><link>https://blog.youkuaiyun.com/m0_56808122/article/details/119980593</link><guid>https://blog.youkuaiyun.com/m0_56808122/article/details/119980593</guid><author>m0_56808122</author><pubDate>Mon, 30 Aug 2021 23:35:19 +0800</pubDate><description><![CDATA[文章目录长度不受限的字符串函数strcpy——字符串拷贝1.功能介绍2.模拟实现strcat——字符串追加1.功能介绍2.模拟实现strcmp——字符串比较1.功能介绍2.模拟实现长度受限的字符串函数strncpy——部分拷贝
长度不受限的字符串函数
strcpy——字符串拷贝
1.功能介绍

strcpy即字符串拷贝函数，即通过该函数将一个字符串中的内容拷贝到另一个字符串中去，该函数的参数为两个指针，其中一个为目标的起始地址（即要拷贝到的目的地），另一个为被拷贝字符串空间的起始地址，因为该函数的返回值为目]]></description><category></category></item><item><title><![CDATA[玩透指针系列（终章）——指针笔试题（画图+超详解析）！]]></title><link>https://blog.youkuaiyun.com/m0_56808122/article/details/119832404</link><guid>https://blog.youkuaiyun.com/m0_56808122/article/details/119832404</guid><author>m0_56808122</author><pubDate>Sun, 22 Aug 2021 15:47:01 +0800</pubDate><description><![CDATA[文章目录指针笔试题笔试题1笔试题2笔试题3
指针笔试题
笔试题1
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int *)(&amp;a + 1);
printf( "%d,%d", *(a + 1), *(ptr - 1));
return 0;
}
//程序的结果是什么？

画图分析：

因为 a 为数组，在这里为首元素地址，所以 a+1 就为 2 的地址；

int *ptr = (int *)(&amp;a + 1);

解释：&am]]></description><category></category></item></channel></rss>