- 博客(55)
- 收藏
- 关注
原创 学习实现堆
如果我们把头结点和尾结点交换位置,并且减小sz,是不是就实现了减去堆顶的问题 ,那么堆的顺序坏了,我们使用向上调整方式,是不是就可以完成对堆顶的删除呢,那我们用向下调整的方法,实现一下后面的功能。尾插结束之后,我们理一下向上调整的思路,向上调整(建立小堆)那底下的一层的结点比自己的父亲结点小就要和父亲结点交换,然后child的下标变成了父亲的下标,再通过child的下标找父亲结点,再比较,直到不再进行交换或者不再父结点到了堆顶。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
2024-03-29 17:15:22
1232
1
原创 学习一下树
我们通常用一个左孩子和右孩子的方式用来表示树,这个设计非常精妙,只把树的每层最左边的那个定义成长兄,长兄根据链表的方式把其他的“兄弟姐们”链接起来,但是用它表示二叉树不如用数组为底层结构的顺序表更方便。顺序表的结构用来表示顺序结构,数组实现的方式,就只能表示完全二叉树,如果分叉较多,用顺序表的方式非常不方便。(1)如果i=1,则结点i是二叉树的根,无双亲,如果i>1,则其双亲结点是结点[i/2]:若一个节点含有子节点,则这个节点称为其子节点的父节点;:一个节点含有的子树的根节点称为该节点的子节点;
2024-03-27 17:35:44
1573
原创 练习一道经典链表题目
我们可以看到假设是报号为三的人走,那我们只要定义一个count 当他增长到三的时候,让此时循环到的人走,那我们是不是的需要一个指针进行循环呢,那我们还需要一个指针进行记录辅助这个遍历指针,否则,将这个指针指向的空间进行释放,那么就找不到链表了,所以我们移动一个位置,count就加一次,然后一前一后两个指针进行挪动。接着我们是实现遍历次数符合则释放空间,剩下最后一个数据时候,在循环单链表中的特点是什么,那就它的尾结点的next指针指向的是自己的头结点。所以这个就是我们的循环遍历的终止条件。
2024-03-26 17:38:26
196
原创 学习一下栈吧
有了顺序表的基础,大家可以认为这里很简单,有所不同的是我们这次取的是栈顶的元素,栈顶的元素就是我们后插入的元素,那我们直接在顺序表里进行尾插,然后尾巴就是栈顶元素。我们如果插入一个元素,top就会向后移动一个位置,那么top的位置就是栈顶元素的下一个,所以我们需要减一才能获取到栈顶元素。因为是特殊的线性表,我们通过对顺序表,单链表,双链表的学习,我们大概也了解了,所以我们话不多说,直接开始思路。我们实现顺序表的时候,会有头插尾插,我们栈只要求我们要后进先出,那我们直接尾插,获得尾巴就好了,不用在考虑了。
2024-03-21 12:40:21
299
1
原创 时间复杂度和空间复杂度
我们用刚才的这个图来确定,离散数学中学的二叉树,我们就按照前序遍历,走到尽头,最多就是开辟了n个额外空间,能重复使用,所以,别的枝杈再用的时候,也是之前的空间,因为函数递归,遍历结束后就会往返这个,空间就会被回收利用。我们值得一提的是一个叫做卡瑞尔公式的,这个公式让我们计算时间复杂度的时候要通过最坏的结果进行计算,举个例子,就是二分查找,如果再坏的话,就是在最后两个数之间找到,这样来计算它的时间复杂度。这个函数递归就区别刚才的时间复杂度,空间一直递归下去,一直需要创建,所以是O(n);
2024-03-19 00:25:17
457
1
原创 学习双链表
尾插的话,我们如何找到末尾的那个结点呢,头结点的prev是不是就存储的末尾结点,并且,我们还要让新插的数据的prev链接上末尾结点,那我们应该先让新插的数据的prev和next指针先存刚才的链表的尾结点,存储完了,在改头哨兵位的prev的结点,让新插的数据成为新的尾结点。”,有了头结点就可以双向循环了。5.头插,我们有了哨兵位,哨兵位不动,哨兵位的next结点,就是我们要头插的位置,这么来看,我们可以受尾插的启蒙,先让新插的数据存储原来链表的各个地址,再让链表存储它的地址。2 先来初始化一下我们的哨兵位。
2024-03-18 11:58:27
382
1
原创 接着介绍单链表的题目
所以我们试试三个指针,第一个在最前面,负责遍历,第二个紧跟着它,第三个紧跟着第二个,当第二个把next指针指向第三个的时候,再把第三个存第二个的地址,然后第一个和第三个就再往前走。这样看的话,不能完全和数组一样,数组可以先合并再排序,但是单链表排序会非常繁琐,我们不让边排序边合并,所以呢,我们建一个新链表,两个指针进行遍历,小的先放,谁先放进了新链表,谁的指针就往前放一个,但是我们要防止空指针的出现,假如两个链表都是一个,那么进行挪动之后,我们要防止出现空指针->val 的情况。
2024-03-18 01:25:06
255
1
原创 学习一下单链表
因为单向循环,所以我们遍历一下,尾巴的标志是什么,就是它的next指针指向的是NULL,所以我们要以它作为条件,进行循环遍历,但是我们还需要尾巴的上一个结点,因为它成了新的尾结点,所以我们有两种思路,第一种就是定义两个指针,两者一前一后,紧挨着进行遍历,最后释放尾结点即可,第二种思路,就是用指针的next->next进行判断为空,值得注意的就是,如果只有一个数据,此时就是尾结点,-next=NULL,不能将NULL再指向next,会报错,所以我们先写一个只有一个数据的时候。中的指针链接次序实现的。
2024-03-17 01:50:59
1386
1
原创 接着介绍一些链表练习的题目
因为单链表的原因,我们如果想要更改是val的节点上一个节点的next指针,我们需要两个指针,一个在前,一个在后,一个负责遍历,一个负责更改。<2>第二种思路,我们可以遍历链表,让链表中指向val的值不是val的链表存进新的链表,然后我们结束时要返回新的链表的头节点,所以呢,我们要有一个头节点用来返回,但是怎么做才能继续往后延长新链表呢,所以我们还要一个指针一直在尾部,负责链接下一个传来的值。紧接着我们发的顺序表的题,我们接着来练习一些单链表的题目,晚上ss会更新单链表的写法。
2024-03-16 18:42:47
240
1
原创 关于顺序表的练习
所以我们只需要定义两个指针,一个指针负责遍历,一个负责接受不是val的值,第二个指针和第一个指针遇到不是val的值就越过,遇到是的第一个指针接着向前遍历,第二个停下,停在是val的地方,第一个接着遍历,直到遇到不是val的值,第二个指针把它存进去,再往前走,思路清晰,代码实操。把数组2合并到数组1上,首先要求就是数组1的空间足够,接着还要求我们要形成非递减顺序的数组,我们两个思路,可以边排序,边插入,也可以先把两个数组头尾想接再进行冒泡排序,第二种比较实现,我们尝试第一个。那我们试试从后面开始。
2024-03-16 11:56:57
338
2
原创 分享一下求十进制数再二进制情况下,数字1的个数
第三种:我们可以知道,减一就会把二进制的第一位改变成相反的(0->1或者1->0),然年后其他位置的一就会移动位置,但是数字1的个数并没有变化,ss就不实际操作了,大家可以举个数字试试,每次&就会减掉一个1,所以我们只要每次把最后一位减一,两个值进行&,得到的结果就可以计算了,我们可以知道 二进制的第一位,是2的零次方乘以这个位上的数,其他的位置都是二的各种次方,所以其他位都是二的倍数,如果第一位为一的话,那么这个数%2一定有1,所以我们只要%2一次,右移一位即可,直到这个数为零,思路清晰,代码实操。
2024-03-16 00:58:07
379
1
原创 介绍字符串的库函数(2)-模拟实现strcmp,strstr
我么首先要遍历两个字符串,也就是我们要一个字符一个字符的比较大小,在遇到'\0' 之前如果有不同的字符,则根据情况返回正整数或者负整数,如果遍历完了字符串,发现两个字符串一模一样,我们就要返回0;如果像ss举例,大家就会发想如果像往常那样遍历,就不好判断出来,那么我们再定义三个指针,一个arr1,一个arr2,最后一个负责切换遍历arr1的起始位置。其实可以发现,如果这两个字符串中没有重复的字符连在一起,我们只需要遍历字符串1就可以了,找到第一个字符相同的,看看后面相同不相同。我们可以看到很简单就实现了。
2024-03-15 14:06:05
355
1
原创 学习一下顺序表吧
把该位置的数据之后的数据往后挪一位,把该数据插入进去,是不是也很简单呢,简直和头插一样,只不过一个头不固定,一个头固定。.第三种就是我们要用的一种扩容原则,成倍扩容,我们以二倍为例,也就是2,4,8,16,32。.第二种扩容方式是固定一个值的扩容,假如每次扩容一百,那么我存了101,那是不是就浪费了99的空间,这样做是有一点浪费的。第二个就是运用assert的断言,我们目的就是为了防止空间的乱用,避免传过来的是空指针从而导致数据的存储失败。5,写完了尾插,我们写一下头插。也就是扩容,怎么扩。
2024-03-15 00:52:28
483
1
原创 介绍一个字符串的运用的部分库函数(1)
这个库函数,在我们初期时候就见到过了,它求得是'\0' 之前的字符个数,如果你建立的字符串没有'\0' ,它就会一直增加字符个数,直到内存中遇到了'\0',求出来的数据是随机的。在图片中我们看到,它的返回类型,以及调用函数,需要传参的东西,此函数可以将source的字符串拷贝到 destination,让我们看一下代码实操。看一下它的用途,比较两个字符串,它会从字符串一个字符对一个字符的比较,每个字符都有对应的ASCLL码值,就可以比较出它的大小。<2>.目标的空间必须足够大,可以拷贝源函数。
2024-03-14 15:32:33
206
1
原创 介绍一下指针数组和数组指针
这样看的话,只与我们前面的代码只差一个括号,括号的优先级要比[ ]高,所以再(*p)中,p先和*结合,这样的话,p首先是一个指针变量,这个指针指向的是一个存储了十个整型的数组,让我们举个例子看一下吧。为什么解引用两次呢,第一次解引用是是相当于通过解引用&arr,找到了这个数组,结果数组的地址加i的情况,再次解引用,就完成了找到数组成员的目的,但是我们一般以二维数组更好的展示数组指针的应用。像我这样的初学者,大家一定要注意接受二维数组传参时是用数组指针接收。举个例子来运用一下指针数组。初来乍到,请大佬关照。
2024-03-13 23:58:00
191
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅