<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Sugar_goat的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Sugar_goat</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Sugar_goat]]></copyright><item><title><![CDATA[Linux基础指令]]></title><link>https://blog.youkuaiyun.com/Sugar_goat/article/details/137910640</link><guid>https://blog.youkuaiyun.com/Sugar_goat/article/details/137910640</guid><author>Sugar_goat</author><pubDate>Fri, 19 Apr 2024 10:45:12 +0800</pubDate><description><![CDATA[注意到我们上图中 ls -a指令我们可以展开以.开头的隐含的文件，那么什么是隐含的文件呢？这里我们注意一下tree指令，我们说了文件系统相当于就是一棵树，所以tree就是将文件树给展开。接下来是本节最后一个指令，是mv指令，这是一个剪切指令，可以将目录剪切到其他目录底下。首先是ls类型的指令，这类指令可以让我们看见当前文件目录下的文件。我们为什么要通过文件路径来找到相应的文件或者目录呢？今天我们要来探究Linux中的基础的指令。下面我们要来看看拷贝的指令：cp指令。那么文件目录又是如何创建的呢？]]></description><category></category></item><item><title><![CDATA[c++类的默认成员函数：构造函数]]></title><link>https://blog.youkuaiyun.com/Sugar_goat/article/details/137808630</link><guid>https://blog.youkuaiyun.com/Sugar_goat/article/details/137808630</guid><author>Sugar_goat</author><pubDate>Tue, 16 Apr 2024 09:34:24 +0800</pubDate><description><![CDATA[在下面这个问题中，我们创建的队列会直接调用类中的两个栈的构造函数进行初始化，这样这个类的队列就不用另外写一个构造函数。类中还存在一个默认的指针，叫做this指针，我们不能在形参中写this指针，但是我们可以在函数体中使用this指针。在讲构造函数之前，我们还要补充一些类开辟空间的知识。我们来看我们之前写的日期类的构造函数应该如何书写。所以究竟什么是构造函数，它有什么作用？本质上构造函数就是帮助我们进行初始化的工具。下面我们来通过例子来展示构造函数的优势。我们也可以写成全缺省的形式。实现好的栈的构造函数。]]></description><category></category></item><item><title><![CDATA[c++中类的实例化]]></title><link>https://blog.youkuaiyun.com/Sugar_goat/article/details/137676652</link><guid>https://blog.youkuaiyun.com/Sugar_goat/article/details/137676652</guid><author>Sugar_goat</author><pubDate>Tue, 16 Apr 2024 08:44:30 +0800</pubDate><description><![CDATA[刚刚说到C++中有struct和class两个关键字，它们的区别在于struct是默认将所有的成员公有化，class默认将所有的成员私有化，到这里，有人会问，什么是公有化？这也就说明了我们在使用c语言和c++所关注的重点是不同的，所以c++中产生了类，这就是实例化对象的都包含的特征，就比如我们可以写一个用户端的类实现用户端应该具备的功能。这样子，我们就可以将top变为私有变量，我们只能通过类的内部去访问，具体的我们可以创建一个函数去调用，这个就是私有成员变量存在的意义。说了这么多，究竟什么是类的实例化呢？]]></description><category></category></item><item><title><![CDATA[c++中的内联函数和空指针]]></title><link>https://blog.youkuaiyun.com/Sugar_goat/article/details/137676104</link><guid>https://blog.youkuaiyun.com/Sugar_goat/article/details/137676104</guid><author>Sugar_goat</author><pubDate>Fri, 12 Apr 2024 12:54:52 +0800</pubDate><description><![CDATA[在C语言中我们学到了宏和宏函数，宏对于类型没有严格的限制，而且不需要建立栈帧，可以提高运行效率，但是宏不能进行调试，容易出错，而且没有类型检查。了解了内联函数，我们再来了解一个简便的关键字auto，auto可以根据右边的变量或者右边的返回值的类型来推导参数类型。再往后，我们都知道C语言中的空指针称为NULL，事实上在底层的编码中，NULL是由宏定义为0的。注意：auto不能作为函数的参数，且不可以用来定义数组。auto关键字在返回值很长的时候具有简化代码的作用，]]></description><category></category></item><item><title><![CDATA[c++中的引用]]></title><link>https://blog.youkuaiyun.com/Sugar_goat/article/details/137590410</link><guid>https://blog.youkuaiyun.com/Sugar_goat/article/details/137590410</guid><author>Sugar_goat</author><pubDate>Wed, 10 Apr 2024 12:16:14 +0800</pubDate><description><![CDATA[我们来看下面的这个函数它是将n作为返回值，但是要知道的是，这个n不是直接赋值返回给ret的而是先会创建一个临时变量之后再赋值给ret。原因也是func返回时也会创建一个临时变量，它具有常属性，这样子赋值，也就是说将权限放大了。对于引用我们还有最后一点，我们来了解以下权限的放大缩小和平移问题。那么这里有人会问我们能将引用作为返回值返回n的地址吗？那么引用究竟有什么实际的好处呢？那么我们使用引用到底有什么好处呢？我们再来看以下的程序为什么会报错？下面的代码是可行的，因为它是赋值。同样的，下面的代码也会报错。]]></description><category></category></item><item><title><![CDATA[c++函数重载]]></title><link>https://blog.youkuaiyun.com/Sugar_goat/article/details/137569510</link><guid>https://blog.youkuaiyun.com/Sugar_goat/article/details/137569510</guid><author>Sugar_goat</author><pubDate>Wed, 10 Apr 2024 09:30:00 +0800</pubDate><description><![CDATA[在C语言中我们要实现同类型的两个数字相加很简单，但是我们如果是两个数据传入不匹配的函数中就可能会发生错位，因此c++中创造了一种新的语法叫做：函数重载。我们了解过编译链接过程的朋友们都知道，编译器在处理代码时，都会进行以下操作，先会预处理，之后会进行编译和汇编，最后会进行链接和生成可执行程序。在链接的过程中会生成符号表，会将函数名和地址联系在一起，c++中的函数重载就是通过符号表的不同来实现的。函数重载，简单说就是函数名相同的前提下，用于针对传入的参数类型不同的情况。注意函数中只有声明没有定义就会报错。]]></description><category></category></item><item><title><![CDATA[c++中的缺省参数]]></title><link>https://blog.youkuaiyun.com/Sugar_goat/article/details/137568698</link><guid>https://blog.youkuaiyun.com/Sugar_goat/article/details/137568698</guid><author>Sugar_goat</author><pubDate>Tue, 09 Apr 2024 21:55:31 +0800</pubDate><description><![CDATA[我们先来看我们已经学习过的栈数据结构：随着使用，开辟的空间可能会不够用，我们会进行扩容，这里的扩容过程中，我们难免的会进行异地扩容，所以为了避免异地扩容，我们就会使用缺省参数，比如我们已知要添加1000个数据我们就可以直接通过缺省参数传值开辟如数空间。注意我们在给函数传参的时候我们只能从左向右传参数，也就是说要么是全部缺省，否则被缺省的参数的前面一定是有值的。而现在，我们可以通过使用缺省参数，来减少扩容的消耗，调用函数的时候我们可以将我们需要开辟空间的数量传入其中。什么叫做缺省参数呢？]]></description><category></category></item><item><title><![CDATA[c++中的命名空间]]></title><link>https://blog.youkuaiyun.com/Sugar_goat/article/details/137567515</link><guid>https://blog.youkuaiyun.com/Sugar_goat/article/details/137567515</guid><author>Sugar_goat</author><pubDate>Tue, 09 Apr 2024 21:34:02 +0800</pubDate><description><![CDATA[这行代码就是将我们定义的bit命名空间展开，但是我们展开命名空间可能会遇到麻烦，相当于这个空间种的变量外界可以随意访问，具有一定的风险性，所以一般情况下我们不会这么做。但是在c++中我们可以自行开辟一块命名空间出来，我们可以将我们所需要的变量的名称放在一块区域中，当我们需要使用的时候我们就通过那块命名空间的名称去调用这个变量。通过以上的讲解，我们对于命名空间有了大致的了解，那么我们除了使用访问限定符，还有调用命名空间中成员的方式吗？思考，如果一个项目下出现了同一个名称的命名空间会如何？]]></description><category></category></item><item><title><![CDATA[二叉树：递归算法的理解和运用]]></title><link>https://blog.youkuaiyun.com/Sugar_goat/article/details/136966108</link><guid>https://blog.youkuaiyun.com/Sugar_goat/article/details/136966108</guid><author>Sugar_goat</author><pubDate>Sat, 23 Mar 2024 14:34:14 +0800</pubDate><description><![CDATA[上一期中，我们了解到了堆，堆的结构也可以叫做二叉树的顺序结构，今天我们一起来看看二叉树的链式结构，我们还要学习有关于二叉树递归的书写。这里就提示我们左右子树的高度是不一样的，我们要分别记录两个子树的高度，高度是最大的高度，也就是左子树和右子树的高度我们要取最大值。我们要明确的是，叶子结点就是左右子树都为空的结点，那么我们的思路就明了了，一种特殊的结点，当结点为空就返回0。我们先来思考我们怎样计数：我们可以仿造先序遍历的方式，进入一个结点就+1，但是我们计数的工具是什么呢？我们先来思考：什么是叶子结点？]]></description><category></category></item><item><title><![CDATA[堆排序详解]]></title><link>https://blog.youkuaiyun.com/Sugar_goat/article/details/136965410</link><guid>https://blog.youkuaiyun.com/Sugar_goat/article/details/136965410</guid><author>Sugar_goat</author><pubDate>Sat, 23 Mar 2024 13:40:36 +0800</pubDate><description><![CDATA[我们先来纠正一个误区，以小堆为例，有人认为，当我们的堆为小堆的时候，这时候我们的堆就是有序的，这种说法是错误的。创建小堆后，我们确实可以得到最小的值，但是我们会发现那1的孩子结点4和3就没有办法调整过来了。首先我们先要创建大堆，这里很多人可能会问，为什么我们排列升序要创建大堆呢？今天中，我们要来了解基于堆的一种排序，堆排序，也就是让堆中的数据变得有序。观察以下的一个堆，虽然它满足小堆，但是它并不是有序的 1 4 3 7 6。在上一期中我们了解了什么是堆，这里我们简单总结一下，究其本质，我们说过，]]></description><category></category></item><item><title><![CDATA[数据结构：堆的创建和使用]]></title><link>https://blog.youkuaiyun.com/Sugar_goat/article/details/136923584</link><guid>https://blog.youkuaiyun.com/Sugar_goat/article/details/136923584</guid><author>Sugar_goat</author><pubDate>Thu, 21 Mar 2024 23:47:34 +0800</pubDate><description><![CDATA[这里我们要了解topk问题的具有现实的意义，比如我们在点外卖时，我们要选取销量前十的我们就可以使用topk解决问题。所以每一次结束比较后我们都要将父结点赋值给孩子节点，并让父结点走向当前孩子结点的父结点。上一期我们学习了树和二叉树的定义，其中我们了解到了两种特殊的二叉树：满二叉树和完全二叉树。向下调整中，我们定义父结点，之后通过上面的父结点和子节点的关系，我们可以找到左子节点，因为堆是顺序结构，所以我们定义的方式和顺序表是一致的。那么我们要怎么寻找每次的孩子结点和父结点的下标呢？下面是向下调整算法的书写。]]></description><category></category></item><item><title><![CDATA[数据结构：初识树和二叉树]]></title><link>https://blog.youkuaiyun.com/Sugar_goat/article/details/136922642</link><guid>https://blog.youkuaiyun.com/Sugar_goat/article/details/136922642</guid><author>Sugar_goat</author><pubDate>Thu, 21 Mar 2024 22:28:20 +0800</pubDate><description><![CDATA[注意我们的完全二叉树结点是要连续的，不能中中间出现一个空结点。其中我们还要了解满二叉树和完全二叉树的概念。下面是满二叉树和完全二叉树的结点个数的统计。目前主流的方式是左孩子右兄弟表示法。我们的文件系统就是一个树。]]></description><category></category></item><item><title><![CDATA[数据结构：队列的创建与使用]]></title><link>https://blog.youkuaiyun.com/Sugar_goat/article/details/136636407</link><guid>https://blog.youkuaiyun.com/Sugar_goat/article/details/136636407</guid><author>Sugar_goat</author><pubDate>Tue, 12 Mar 2024 14:00:00 +0800</pubDate><description><![CDATA[队列的结构中和单链表的结构类似，包含下一个结点的指针，同时我们还需要定义一个尾指针，来记录尾部的位置。于此之外，我们还需要创建一个新的结构体来管理整个队列：里面存储的是头部结点和尾部结点。队列中我们还要实现取出队头函数和取出队尾元素，同时我们还要计算队列中的元素。上一期中，我们学习了栈，今天我们来学习一种新的结构叫队列。以上就是关于队列的内容，希望对大家有所帮助！]]></description><category></category></item><item><title><![CDATA[数据结构：栈的创建与使用]]></title><link>https://blog.youkuaiyun.com/Sugar_goat/article/details/136635655</link><guid>https://blog.youkuaiyun.com/Sugar_goat/article/details/136635655</guid><author>Sugar_goat</author><pubDate>Tue, 12 Mar 2024 09:00:00 +0800</pubDate><description><![CDATA[对于栈，我们不能写遍历函数，因为我们访问栈的元素只能从尾部访问，访问后要将它删除，也就是从栈的顶部出去，其中STEmpty函数是用来判断栈是否为空。下面是实现栈空间的核心函数：主要涉及插入和删除，插入我们只能从尾部插入，删除也是尾部删除，因为是后进先出。2、我们选用顺序表来实现栈结构，这里我们堆顺序表可能造成的空间浪费可以忽略不记。下面是栈的结构体的书写：本质上还是顺序表，只是这里我们使用top来指向栈顶空间。对于返回栈顶元素：这里我们要断言，要求pst和顺序表不为空。希望本期内容对大家有所帮助！]]></description><category></category></item><item><title><![CDATA[最强链表：带头双向循环链表（详解）]]></title><link>https://blog.youkuaiyun.com/Sugar_goat/article/details/136611225</link><guid>https://blog.youkuaiyun.com/Sugar_goat/article/details/136611225</guid><author>Sugar_goat</author><pubDate>Mon, 11 Mar 2024 14:35:12 +0800</pubDate><description><![CDATA[学习了普通的链表，我们会发现普通链表的插入和删除有时候也是需要分情况讨论的，并不那么轻松，那是因为单链表的结构所导致的，今天我们来学习一种新的链表结构，它会颠覆我们对于链表的认知，我们会发出感叹：哇！这里我们先来看看尾部插入的逻辑，我们可以通过头结点直接找到尾部结点，我们不需要再从前往后找到尾部结点，但是在这之前，我们应该去创建一个头部结点。之后我们再来看头部插入逻辑：我们在头部插入的时候，我们一定要先链接后面，不然我们先链接了前面我们就无法找到后面的结点。我们来看单链表和双向循环链表的尾部插入对比。]]></description><category></category></item><item><title><![CDATA[单链表详解]]></title><link>https://blog.youkuaiyun.com/Sugar_goat/article/details/136603198</link><guid>https://blog.youkuaiyun.com/Sugar_goat/article/details/136603198</guid><author>Sugar_goat</author><pubDate>Sun, 10 Mar 2024 16:35:12 +0800</pubDate><description><![CDATA[对于尾部插入函数，我们首先定义一个结构体指针变量tail用来指向尾部，这里我们要使用tail来找到链表的尾部，判断的条件就是当tail的next为NULL就停止。1、我们可以即开即用不需要浪费太多内存，因为它的空间都是分别malloc出来的，所以我们可以在不使用时将它的空间free。同理删除pos处的元素也是同样的道理，我们也要找到pos前一个结点的指针和后一个结点的指针，然后将他们连起来。2、链表的插入不需要将数据覆盖，我们只需要将前后链表的指针分别连接起来，比较方便。下面是修改后的头部插入的代码。]]></description><category></category></item><item><title><![CDATA[顺序表详解]]></title><link>https://blog.youkuaiyun.com/Sugar_goat/article/details/136602622</link><guid>https://blog.youkuaiyun.com/Sugar_goat/article/details/136602622</guid><author>Sugar_goat</author><pubDate>Sun, 10 Mar 2024 15:36:27 +0800</pubDate><description><![CDATA[顺序表是最简单的一种数据结构之一，它的本质上就是数组，我们将顺序表分为静态和动态的两种形式，静态顺序表只能存储有限个数据，而动态顺序表可以根据自己的需求来开辟空间存储数据。在头部插入数据时，我们要注意我们只能将第一个位置的数据往后移动，这样才能将新的数据放入第一个位置，因为数组的空间是连续的。对于扩容，我们可以写个函数来检查是否需要扩容，需要的话我们就直接使用realloc来扩容，每次开辟的空间为原来的两倍。在插入数据时，我们需要检查顺序表的空间容量，如果空间容量不足，我们就要对它扩容。]]></description><category></category></item><item><title><![CDATA[模拟实现atoi函数]]></title><link>https://blog.youkuaiyun.com/Sugar_goat/article/details/136354027</link><guid>https://blog.youkuaiyun.com/Sugar_goat/article/details/136354027</guid><author>Sugar_goat</author><pubDate>Wed, 28 Feb 2024 19:31:41 +0800</pubDate><description><![CDATA[3.假如我们传入的参数含有其他符号，如：‘？今天我们来模拟实现库函数atoi，首先我们来介绍一下这个函数。4.假如转化为的数字超过了整形数据的存储范围怎么办？2.假如我们传入的参数中有‘+’‘-’符号怎么办。5.假如我们传入的字符串为空字符串怎么办？1.假如我们传入的参数是空指针怎么办？当然对于这个代码我们仍然可以进行修改。以上就是本期的全部内容。]]></description><category></category></item><item><title><![CDATA[通讯录的制做（转化为文件形式存储）]]></title><link>https://blog.youkuaiyun.com/Sugar_goat/article/details/136328130</link><guid>https://blog.youkuaiyun.com/Sugar_goat/article/details/136328130</guid><author>Sugar_goat</author><pubDate>Tue, 27 Feb 2024 17:45:32 +0800</pubDate><description><![CDATA[前面我们学习到了通讯录使用动态内存去开辟空间，现在学习了文件操作之后我们可以实现将通讯录转化为文件形式储存，我们就可以读取到我们之前存储的内容，而且我们之后加入的内容也不会随着程序的关闭而消失。到这里我们便将一个简单的通讯录讲完了，我们既可以实现存储信息的功能，同时我们还可以将信息转化为文本文件，这样我们就可以实现一个“半永久”式的程序。这段代码我们需要放在初始化的函数中，因为我们先要加载出之前的信息，这个代码就是实现的这一功能。原来啊，我们将数据采用二进制的方式存储，所以看到的就像乱码一样。]]></description><category></category></item><item><title><![CDATA[C语言文件操作]]></title><link>https://blog.youkuaiyun.com/Sugar_goat/article/details/136319241</link><guid>https://blog.youkuaiyun.com/Sugar_goat/article/details/136319241</guid><author>Sugar_goat</author><pubDate>Tue, 27 Feb 2024 12:36:42 +0800</pubDate><description><![CDATA[]]></description><category></category></item></channel></rss>