数据结构
文章平均质量分 51
ScissorsD_初夏
struct
展开
-
初夏小谈:单链表的增/删/查/改操作(完整版)
链表谈到它我就想起了小时候吃的一种糖(我们把它叫链子糖)。它虽然总是会黏在牙齿上,但超甜的,让我们既爱又恨,所以总会联想起它。哈哈^_^.......回到正文今天的链表。这次是第一次完整的写一个链表。链表的思想简单,但真的自己一个一个实现还是遇到了不少的问题。其中一个重大的错误就是我经常会拿着指向头指针的指针去修改链表,这样会导致的链表不是想要的。犯这样的错误在于我总以为传值(传的是...原创 2018-12-04 22:44:39 · 513 阅读 · 2 评论 -
初夏小谈:二叉树的三种遍历(1)
二叉树的遍历一般分为三种即为,前序遍历,中序遍历,后序遍历。所谓前序遍历就是从二叉树的根节点出发,先访问根节点,在访问左孩子,然后访问右孩子。注意这是对于每一个结点都符合的条件。中序遍历就是先访问左孩子,再访问根节点,最后访问右孩子。同样对每个节点都适用。后序遍历则是先访问左孩子,在访问右孩子,最后访问根节点。每个节点都是如此。知道了三种遍历方式后拿一个图来先看看各自的遍历顺序...原创 2019-01-15 16:10:24 · 352 阅读 · 0 评论 -
初夏小谈:前序构造二叉树及三种遍历(完整版)
通过前序来构造出一棵二叉树,创建一颗二叉树,可以先创建根节点,后再创建它的左孩子和右孩子。遇到空就停止。对于每个结点都是先创建它的左孩子,之后再创建它的右孩子。但是在创建左孩子和右孩子是,最大的问题就是,待创建数据要移动相应的位。每消耗一个数据就要取下一个元素。可以通过一个变量来计数移动的个数。此外要将每个根节点的左右孩子接起来。因此也要记录每个根节点来连接它的左右孩子。并且进行三种遍历。...原创 2019-01-17 00:12:55 · 562 阅读 · 0 评论 -
初夏小谈:复杂链表的复制
在链表的中有这样一类链表。它至少包含两个指针。其中一个指向下一个结点。有一个指针随机的指向链表的其它结点,也可能指向它自己,也可能指向NULL。对于该类链表的复制来说。最大的难度就是如何处理复制的新链表的这个随机指针指向的问题。因此在对该类链表处理时,就必须根据源链表的指针指向来得到新链表的随机指针得指向。意思就是让新链表得结点和源链表得对应结点必须有一个关系。解决该问题的一般方法就...原创 2019-02-26 20:46:50 · 393 阅读 · 0 评论 -
初夏小谈:排序算法---冒泡排序(极致优化)
冒泡排序算法是我们学习数据结构时所接触到的第一个排序算法,因为其思想比较简单,易于理解,和其形象化的特点。也被我们称之为起泡排序。 冒泡排序就像鱼吐泡泡的过程,最大的最先浮上来一次是次大的。从第一个元素开始,将每两个之间进行比较,如果前面的大于后面的则将他们两个的位置进行交换,如果前面小于或者等于后者元素是则不交换。然后再拿比较后的大的元素继续和它后面的元素进行比...原创 2019-03-10 11:08:57 · 479 阅读 · 0 评论 -
初夏小谈:排序算法---快速排序(超详解)(三种方式实现及优化版本)
快速排序正如它的名字一样牛逼,它是实践中最快的已知排序算法。那么快速排序是怎么一种排法呢?往下看 快速排序是利用了分治的思想,分而治之。将一个大的问题拆分成几个子问题,那么解决掉这些子问题,用它们的解将得到原问题的解。 它的算法思想是:三步骤 ①:首先选择一个基准值(这个基准值可以是待排数列中的任意一个) ②:把小于...原创 2019-03-10 14:48:09 · 1216 阅读 · 0 评论 -
初夏小谈:速查节日倒计时(小项目)
前言:在实现这个小项目中需要用到C++的一些相关知识。例类的相关成员函数,友元,运算符的重载,string,vector的一些操作等。也是对前一段C++基础知识的复习。实现这个小项目也是为了所收获的东西进行实战。在这个小项目实现的过程中也遇到了好几个问题,可能由于春季的温差变化有点大。博主不胜洗礼有点感冒,脑袋有点晕啊,竟然连头文件重复包含了都没有意识到。^_^扯远了。所以不论各路大佬还是成长...原创 2019-03-29 18:06:21 · 327 阅读 · 0 评论 -
初夏小谈:排序算法---归并排序(非递归)
归并排序(MergeSort)一、归并排序是建立在分治法的基础上进行的排序。归并排序的思想是:先将一组数据进行分割成若干的小子序列,然后将这些子序列进行排序,之后再对这些子序列再进行排序。当将两个子序列合并成一个有序子序列,称之为二路归并。在进行归并排序时需要进行三步:①:针对两个有序子...原创 2019-03-22 20:17:41 · 750 阅读 · 0 评论 -
初夏小谈:排序算法---基数排序(小白也能看懂)
在海量数据随机分布时进行排序时最快的当属桶排序因为它的时间复杂度是O(n)也就是只需两趟就可以将所有数据排好,今天所说的就是基于桶排序的思想进行基数排序。 基数排序:就是每次按照其各个位上的大小进行的一次排序,每一次排完后就将排完后的数据重新放回去,接着进行十位上的数字比较大小来在进行一次排序,然后再放回去。。。后面都是这样不断的排序一次,又接着放回去,直到把数组中最大数的位数...原创 2019-04-01 11:21:36 · 836 阅读 · 1 评论 -
初夏小谈:循环队列的基本操作(完整版)
循环队列的入队,出队,队首,队尾等基本操作其核心思想是让队尾拼接到队首元素上,形成一个环。在实现的时候应当注意标记队尾后一个数据的下标不能大于等于队列容量。由于队列先入先出的原则,我用数组进行存储数据,只需操纵数组下标即可。首先队首,队尾应做一个标记以便操作循环队列的出队列,入队列,其次需要定义循环队列的大小,相应的要记录元素的个数。当然通过队首队尾下标也可以表示,再定义一个数组即可。...原创 2018-12-11 23:07:13 · 479 阅读 · 0 评论 -
初夏小谈:队列的基本操作(完整版)
队列的入队,出队等操作队列的特点:先进先出。这种规则在我们生活中屡见不鲜。比如:中午吃饭时的窗口前排队,火车过隧道,各种业务办理排队等等。如果谁插队,大家就会向他(她)投向愤怒,鄙视的目光。甚至可能展开一场弥漫火药的战争。所以还是不要插队,否则后果很严重。这就意味着队列只能在队尾增加数据,只能在队头删除数据。由于队列的特点,如果用顺序表来实现时间复杂度会变成O(n),所以我采用链表的...原创 2018-12-09 22:49:06 · 380 阅读 · 0 评论 -
初夏小谈:反转单链表(头插法、三指针法)
神奇的链子又来了。昨天对链表进行了基本的增/删/查/改操作,今天来一些链表更进阶的一些执行方法之反转链表。第一种方法:熟悉的头插法定义一个新的头指针 ---> 直接把结点依次摘下来 ---> 向新定义的头指针上进行头插。至于为什么要头插呢?链表头插就会把原来的结点顺序进行逆序。这就是本方法的最重要的原因。OK代码如下://1.反转链表//1.1引入一个头...原创 2018-12-05 23:11:41 · 2109 阅读 · 0 评论 -
初夏小谈:堆的基本操作(完整版)
堆的建堆,插入、删除、操作堆本身就是一个完全二叉树,在这里采用数组进行存储。因为可以通过下标快速找到它的孩子。堆的最大作用就是:返回一组的数据的最值。建堆:在建堆的过程中,需要几个基本操作:首先先建立一个数组用来存储堆数据,其次就要开始对这组数据进行建堆的过程,需要将数据进行比较、搬移。这里面需要进行向上调整将数据搬到合适的位置上。注意边界问题:在向上调整的过程中需要判断是否已经...原创 2018-12-14 00:33:28 · 445 阅读 · 0 评论 -
初夏小谈:交换链表结点(链表进阶操作)
链子问题持续更新之交换两个链表中的结点(兼职交换一条链表中两个结点的交换)交换两个链表中的结点,就是要将要交换的两个结点改变,而其它结点不变。四指针法:交换两个结点,就要找到它的前一个结点,将前一个结点的next改为另一个要交换的结点的地址即可,但是这样交换,那么交换得结点及它后的所有结点会全部接到另一个结点,所以再标记两个结点(即两个结点后面的结点),这样就可以方便的进行交换的后续...原创 2018-12-06 21:52:56 · 469 阅读 · 0 评论 -
初夏小谈:删除单链表中重复的结点1.0(链表进阶操作)
初次接触删除链表中的重复结点问题,那就从基础的操作做起。删除连续相同的数据的结点问题,删除结点,那肯定要就删除的结点摘除,把后面链子接上就可以了。所以删除时就需要记录它的前一个结点一边可以连接后面的链表。如果重复的结点可能有很多个,那么就要再标记重复后的下一个结点(与重复结点数据不同)对此就可以使用三指针法进行相关操作。在三指针法操作时,第一个指针是指向开始重复结点的上一个结点,如果...原创 2018-12-06 22:18:01 · 297 阅读 · 0 评论 -
初夏小谈:分割链表(链表进阶操作)
分割链表:在单链表中取任意一个结点的数据,然后对链表进行排列,比它小的排在它前面,大于等于它的排在它后面,要求保持原相对顺序不变。先不看这个操作链表,看到这种做法我就想起了一种排序的做法,不知道大家想起了没有。那就是快速排序思想。在后面的文章中我会尽力去挖掘快排,为大家展现快排的魅力。因为任意取结点中的数据作为参考值,所以就可以把源结点分为两部分即:比参考结点的数据小的在一起...原创 2018-12-07 15:13:12 · 330 阅读 · 0 评论 -
初夏小谈:栈的入栈、弹栈操作(完整版)
今天来说说栈的相关操作即:压栈,弹栈。因为栈就类似于一个子弹夹一样只能从最上面压进去,也只能从最上面弹出来。所以形象的名为:压栈,弹栈,又名入栈,出栈。由于栈的操作只能在栈顶进行,所以就类似于顺序表/链表的尾插,由于链表的尾插时间复杂度是O(n),而顺序表则是O(1)所以我用顺序表的操作来实现栈的压栈,弹栈操作。代码如下:#include"Stack.h"//初始化vo...原创 2018-12-09 13:14:37 · 2050 阅读 · 0 评论 -
初夏小谈:找链表倒数第K个结点
因为单链表不同于数组,数组可以用下标来访问数组中任意一个数据,而单链表却只能依靠于结点的地址来一个一个查找。对此就可以让定义一个快指针和一个慢指针。慢指针也指向第一个结点。一个快指针先走k-1步,因为快指针初识指向第一个结点,然后让两个指针一起走。另外要注意K的范围,及边界的判定问题。代码如下:LinkListNode* FindKLinkList(LinkList* first...原创 2018-12-07 22:57:48 · 280 阅读 · 0 评论 -
初夏小谈:双向循环链表增、删、查、改基本操作(完整版)
带头结点的双向循环链表我之前对链表进行操作时一直是用头指针的方式,今天所说的链表是用头结点的方式。它们二者其实区别不是很大。共同点都是指向链表的第一个结点。不同点是:头结点的存储数据的内存里面可以存储链表信息,也可以什么都不存。而头指针只能用于指向链表第一个结点,它不能存储其它数据,因为它只有存储指针的内存。2.就...原创 2018-12-09 18:20:43 · 995 阅读 · 0 评论 -
初夏小谈:红黑树原理及实现
一、红黑树的概念及产生原因:红黑树就是一棵二叉搜索树,只不过在里面添加了一些特性,它的结点不是红的就是黑的。红黑树(本质二叉搜索树)是在基于二叉搜索树,为了改善在极端情况下,二叉搜索树的查找不佳的情况。(比如,每个结点只有左孩子/每个结点只有有孩子的情况等等)。二叉搜索树的查找次数就是二叉树的高度。平均查找时间复杂度(O(logn)),最差时间复杂度(O(n))为了解决在极端情况下二...原创 2019-06-19 14:04:37 · 561 阅读 · 0 评论