![](https://img-blog.csdnimg.cn/direct/8e24dfb49c164ad3a149fcb112f681e8.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构
文章平均质量分 90
使用C语言手撕各类数据结构
夜夜亮晶晶
一窍不通
展开
-
STL库 —— stack queue 的编写
关于C++ STL库中栈stack和队列queue的编写原创 2024-04-18 17:28:39 · 751 阅读 · 0 评论 -
STL库 —— unordered_set与unordered_map的封装
对HashBucket进行封装,使之兼容unordered_set与unordered_map,并完成unordered_set与unordered_map的简单功能原创 2024-05-26 22:54:57 · 1210 阅读 · 0 评论 -
C++数据结构——哈希桶HashBucket
哈希桶(Hash Bucket)是哈希表中用来存储哈希冲突的一个位置。当多个键通过哈希函数映射到同一个索引时,这些键值对被存储在同一个桶中。哈希桶通常采用链表或其他数据结构来存储这些冲突的元素。这种方法被称为“链地址法”,它允许多个键值对共享同一个哈希表索引,从而有效解决哈希冲突问题。原创 2024-05-26 17:37:33 · 974 阅读 · 0 评论 -
C++数据结构——哈希表HashTable
详细介绍了哈希表的实现,包括哈希表的定义、插入、查找和删除功能的实现。作者解释了哈希表的内部结构,如何处理键值对,以及如何通过扩容来解决哈希碰撞问题。文章还详细讲述了如何对非整数键值进行哈希计算,特别是对于字符串键值使用BKDR哈希函数的方法。此外,还提供了完整的哈希表代码示例和测试用例,以帮助读者更好地理解和实践。原创 2024-05-24 21:49:48 · 910 阅读 · 0 评论 -
C++数据结构——AVL树
简单介绍了AVL树的结构和旋转机制原创 2024-05-13 18:38:42 · 1051 阅读 · 1 评论 -
C++数据结构——红黑树
红黑树是一种自平衡二叉搜索树,通过节点的颜色属性(红色或黑色)以及一系列的规则,保证了其高度在最坏情况下为O(log N),从而确保了较高的查询、插入和删除效率。在本文中,我们将详细介绍红黑树的插入操作。原创 2024-05-15 23:29:44 · 946 阅读 · 1 评论 -
快排的非递归版本
我们借助栈来实现非递归的快排,我们需要记住的是,我们的栈存放的是数组的下标,我们还是要借助单趟快排,对从栈中取到下标对应的元素进行排序。我们完成了此次的单趟排序,返回的就是我们的基准值的下标,它的左边都比它小,右边都比它大。其中其实我们不先把left和right压入栈也可以,这样只是更接近的模拟递归。此外,我们要思考一个问题:怎么确定某侧数据处理完毕?因为我们是整理区间,所以当区间左右元素下标相等时,即处理完毕。所以我们的判断条件就是left < keyi-1 或 keyi+1 < right。原创 2024-01-24 21:06:36 · 335 阅读 · 0 评论 -
一篇博客读懂排序
学到这里,其实这些分布的并非是真正的希尔排序,gap到底取多少的值?其实画图把整个流程完整的走一遍我们就可以知道我们的目的是为了让prev和cur指针中间的值都是比key大的值,然后prev++负责记录下一个大的值,cur负责记录比key小的值,每次找到就交换,最后再把prev的值变为key即可。下面我们先来完成单趟,选用一个key值作为基准值,小的排在左边,大的排在右边,这样一次可以把整个数组分为两部分,然后我们还要进行基准值位置的调整,此时的left位置就是key应在的位置。原创 2024-01-24 10:13:13 · 1132 阅读 · 0 评论 -
二叉树OJ题目——C语言
给定一个二叉树root,返回其最大深度。二叉树的是指从根节点到最远叶子节点的最长路径上的节点数。32[0, 104]原创 2023-12-02 21:01:28 · 1009 阅读 · 0 评论 -
二叉树链式结构的实现——C语言
首先要判断根是否存在,如果根存在,继续向下遍历,再次遍历的时候,先判断其左右子树是否存在,若存在,再遍历其左右子树,此时就不用再进行根判断了,根判断的代码只在进入函数时有效执行。我们可以看出,如果root为NULL时,返回0,否则都是向上返回左右结点之和,那么我们就可以直接相加,还要加上它本身。而且在验证的时候还有一个小插曲:当我发现实际和输出不对等时,我没有怀疑代码的正确性,而是发现我的二叉树图画错了。我们看我们的二叉树其实是非常丑的,但是我们通过验证也证明了我们代码的正确性。结点的操作发生在遍历其。原创 2023-12-02 16:04:26 · 1020 阅读 · 0 评论 -
一篇博客读懂完全二叉树——堆
堆原创 2023-11-30 17:30:38 · 843 阅读 · 0 评论 -
栈和队列OJ题目——C语言
在去栈首的时候,我们取到的是队列的最后一个元素,首先想到的肯定是返回我们导完数据后剩的那个元素,直接CV上面的代码,但是我们要能想到在写队列时,我们写过取队尾函数QueueBack,我们可以直接进行判空操作,返回不为空队列的最后一个元素。在删除时,我们也可以使用QueueSize对队列数据的个数进行判断,用QueueFront进行导入队头操作,此时该队列承担的是导数据的任务, 同时导入队头的同时不要忘记要将队头Pop出去。这就是我们的数量不匹配,我们可以在最后进行一个判空,如果最后栈没空,说明数量不匹配。原创 2023-11-25 13:22:41 · 1175 阅读 · 0 评论 -
一篇博客读懂双向链表
链表的销毁当然也是一个结点一个结点free的,而且因为我们的pHead是哨兵位,我们设置的cur应该从pHead的下一个结点开始free,同时,通过对while条件的设置,保证pHead不被重复free。从定义的结构体我们就可以轻松想到我们的链表应当如何初始化,那就是让next和prev都指向它本身,此外,还要记住既然是链表,那么我们的结点都是动态开辟出来的。我们的头删也是要不包括头结点的,所以我们也要额外判断一下pHead的next。我的源代码:登录 - Gitee.com。原创 2023-11-20 18:15:33 · 87 阅读 · 0 评论 -
一篇博客读懂队列——Queue
首先我们要新开结点,其次我们要判断链表是否为空,如果为空,那么ptail和phead都指向新结点;如果不为空,phead的指向不用改变,而ptail的next要只想newnode,然后再把ptail向后移。首先先让队头指向next结点,接着我们就要判断删除的是不是整个队列的最后一个结点,如果删除的是最后一个结点,那么就会影响到我们ptail的指向,所以我们通过判断避免ptail变成野指针。我们再设置一个结构体来存储相关的数据,这样修改指向时不用再用二级指针,而是只需要修改结构体的值即可。原创 2023-11-14 22:11:34 · 286 阅读 · 0 评论 -
一篇博客读懂栈——Stack
一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。原创 2023-11-14 18:56:12 · 78 阅读 · 0 评论 -
单链表OJ题目——C语言
我们在做这题之前要了解什么是哨兵位,因为这题如果不设置哨兵位会多很多麻烦。在我们之前做的题中我们不难发现,当要传入第一个结点时,我们都要判断头结点是否为空,以此来确定是给头结点赋值还是给头结点的next赋值,这就是不带哨兵位的链表,哨兵位其实就是我们动态开辟了一块空间给头结点,这样头结点永远都不会为空。既然头结点永远不会为空,那我们在传值的时候完全可以不用考虑,直接传给phead->next,需要注意的是,在需要返回值时,我们不可以单一的返回phead,而是返回phead->next,另外。原创 2023-11-14 11:17:38 · 110 阅读 · 0 评论 -
一篇博客读懂单链表——Single-List
这里还是和顺序表一样的套路,把它当成一个工程去做,当然就要分文件啦。原创 2023-11-09 17:26:31 · 635 阅读 · 0 评论 -
一篇博客读懂顺序表 —— Sequence-List
当我们要实现通讯录时,我们会自定义一个 contact.h 文件来存储我们的各种声明,自定义一个 contact.c 文件来存储实现声明的函数,同时还会存在一个 test.c 来测试我们代码的可行性。在这里我们学习顺序表时,也要使用这种方式,来分割我们的代码使程序更加简洁耐看:在 SeqList.h 中,我们要声明我们需要的头文件、重新定义的类型、我们需要的函数......原创 2023-11-01 08:17:13 · 653 阅读 · 4 评论