![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 89
介绍数据结构的内容
tsy写代码
代码萌新
展开
-
排序(2)
1、原理:归并排序也是分割区间的问题,但归并排序是一个后序遍历,先开辟一个与原数组同样大小的数组,再将区间划分为1个元素与另1个元素这样的最小区间,然后比较这两者的值,比较完后,小的先放入区间,大的依次放入,然后回到上一层,两个元素与两个元素这样的区间,再比较,直到将整个数组排完。这样我们的第一趟排序就排好了,这趟排序选好了相遇位置处的数据,选好之后左边全是比3小的数,右边全是比3大的数,之后再将其进行一次前序遍历。首先是我们的堆排,这一部分属于树的内容,我先简单的介绍一下堆排,后面再介绍二叉树。原创 2024-08-13 21:40:22 · 926 阅读 · 0 评论 -
c语言实现通讯录底层(顺序表)
2、动态顺序表,不指定顺序表的大小,通过后续存入数据,当开辟的空间存满而自动开辟新的空间供我们存入数据。但是插入数据之前我们是不是应该检查下我们的数组是否已经被存满,如果已经存满的话,我们就需要将这个数组扩容,还有我们初始化后数组空间是0,那我们应该给这个数组创建空间。当我们存入9个数据将原先的8个空间占满时,程序会自动开辟新的空间,我们在relloc中扩充的是原先内存的两倍,故这里空间扩大一倍。通过调试我们可以看到我们成功的存入了1,2,3,4,5这5个数据,并且展示了当前所存元素个数与当前内存。原创 2024-04-24 19:49:53 · 1126 阅读 · 3 评论 -
双向链表的实现
上一节我们写单链表的尾插数据,当我们没有头结点的时候,需要将创建的第一个节点作为头结点,这样是不是很麻烦啊,那我们是不是可以在插入节点之前手动创建一个节点,它不存入任何数据,只是充当头的作用,我们需要尾插数据的时候,直接调用尾插的函数即可,头插也只需要将新节点插入这个节点之后,那么这样的节点我们称它为–在初始化的时候调用即可。上一节我们知道单链表中的一个节点就是一个结构体,它存放了数据域与指针域,但是指针域里只存放了一个指向下一个节点的next指针,而在双向链表中还存放了一个指向上一个节点的prev指针。原创 2024-05-21 18:21:09 · 1042 阅读 · 3 评论 -
单链表的实现
前面我们完成了顺序表以及通讯录,为了节省空间,在顺序表中我们是以2倍的方式来扩大我们的存储空间的,但是假如我们存入10001个数据,那么程序就会将空间扩大到20000,会浪费9999个空间,这样看的话我们浪费的空间仍然比较多,那么有没有办法不浪费我们的空间呢?我们使用链表是让其实现与通讯录,顺序表一样的存储数据的功能,那么我们就需要链表完成与顺序表一样的增,删,查,找的功能。我们想一下,当我们使用这些函数的时候我们是不是需要传入指向这个链表的头节点的指针,当我们直接传入这个指针时,实际上是。原创 2024-05-07 23:42:40 · 506 阅读 · 1 评论 -
单链表实现通讯录
那么我们该如何选择呢?:上面我们知道我们是由一个结构体来储存我们的联系人信息,我们就需要定义一个person联系人的结构体,然后我们之前写的链表里每个节点存储的数据的类型是int型,我们需要将其改为我们现在的person型。1、增加联系人,上面我们说过增加联系人就是调用我们的单链表的插入函数,我们写单链表的时候写了单链表的头插与尾插,在这里都可以,但是为了更符合日常我在这里采用尾插。,就需要遍历整个链表,找到需要删除的联系人的前一个节点,然后将前一个节点与后一个节点连接,最后释放掉需要删除的节点即可。原创 2024-06-01 11:25:10 · 1686 阅读 · 1 评论 -
三个有意思的链表面试题的完成
相信不少朋友看到这题目就已经晕了,那就简单说明下这个题目,题目就是创建一个链表,其中每个节点有两部分–指针域与数值域,指针域里也有两个指针next(指向下一个节点),random(随机指向),要求我们拷贝一份这个链表,使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点。也就是上图的形式,这个题目如果单纯的只拷贝一份链表和每个节点的val,相信大家可以很快的做出,也就是遍历一下原链表,遍历一个节点创建一个新的节点并拷贝值,最后将节点连接形成链表即可。原创 2024-05-25 23:13:48 · 1077 阅读 · 2 评论 -
通讯录(基于顺序表)
那我们在使用这个通讯录的使用其实是使用我们外层的数组结构体,那我们既然要使用外层的数组结构那我们这里的contact.h是不是需要包含SeqList.h这个头文件,那我们这里能写#include“SeqList.h”吗?(4)、删除联系人:删除与增加有些许不同,我们删除是不是要先选择我们删除的对象,那根据什么来选择我们删除的对象呢?(3)、上面的完成了,我们是不是该往我们的通讯录里添加联系人信息了,那我们前面写了头插数据,尾插数据,还有在指定位置插入数据,这三个我们都可以使用,我这里使用尾插联系人;原创 2024-04-27 11:04:10 · 868 阅读 · 2 评论 -
数据结构-排序(1)
1、原理:我们遍历一遍数组,开一个数组中最大数字空间的数组(初始所有位置全为0),然后再遍历数组,原数组出现哪个数字,在开辟的数组对应下标位置处+1,然后再依次遍历开辟的数组,将数组元素不为0的位置赋值回原数组,数组元素为几就赋值几次。上面我们写了插入排序,那要是原数组中的数据与我们要排的数据顺序刚好相反,那么插入排序就会走满每一趟排序,那么它的效率就会退化,可能会变成冒泡的效率。黑线长度一样的排序代表他们的时间复杂度在一个量级,也就是排序所花费的时间差距不大,并且黑线越长排序越快。,效率差距如此大呢?原创 2024-08-09 15:38:54 · 984 阅读 · 0 评论 -
栈与队列的实现
队列的实现也能用数组与链表实现,但是如果用数组实现的话,出队的时候涉及到后面的元素向前移,时间复杂度较大,而用链表的话只需要释放掉第一个节点,然后head指针后移。在这里可以看到我们定义了两个结构体,第一个结构体是队列的节点的结构体,第二个结构体存放的是指向队列的头的指针与指向尾的指针,以及队列大小的size。如果我们直接释放掉外层的ptr的话,里面的节点并没有被释放,所以我们需要一个一个节点的释放,最后释放ptr。取栈顶元素的时候需要注意,我们这里的size是指向栈顶元素的下一位,所以取的时候需要-1;原创 2024-05-28 22:31:21 · 760 阅读 · 1 评论