初阶数据结构
文章平均质量分 95
起床写代码啦!
一个菜鸡
展开
-
一起学数据结构(10)——排序
从本文开始,通过若干篇文章展开对于数据结构中——排序的介绍。 将一堆杂乱无章的数据,通过一定的规律顺序排列起来。即将一个无序序列排列成一个有序序(由小到大或者由大到小)的运算。 在数据的排序中需要注意,如果需要排序的对象同时有多个数据域(例如对学生进行排序,往往有学号,班级等多个数据域),排序往往是针对于其中一个数据域进行的。 对于排序,本文及下面的文章中将着重介绍下列给出的排序:插入排序、希尔排序、选择排序、冒泡排序、快速排序、归并排序、计数排序。原创 2023-10-22 11:09:26 · 543 阅读 · 0 评论 -
一起学数据结构(9)——二叉树的链式存储及相关功能实现
但是,对于非完全二叉树,由于结构并不像完全二叉树一样有一定规律,因此,利用非完全二叉树存储数据的操作较为复杂。因此,文章后续实现的功能主要是利用递归来针对于非完全二叉树自身而言,例如求非完全二叉树的叶子结点数目,二叉树的深度等等。对于二叉树的层序遍历,由于需要每一层挨个访问结点,因此,不能再用前面递归的思想来实现此功能。在结点访问的过程中,每个结点都是按照:根结点、左结点、右结点的顺序。2.若本结点不符合1中的判定条件,则存在两种情况,一是本结点为空,二是本结点为分支结点。对于第一种情况,返回值返回。原创 2023-10-18 20:48:28 · 429 阅读 · 0 评论 -
如何利用堆来模拟堆排序
在排序阶段,虽然依旧采用向下调整函数,但是需要注意,建堆采用的向下调整是针对于每一个结点的,但是在排序阶段,向下调整只是在某次循环中,针对首结点进行向下调整,最坏的情况下,调整的次数为。二叉树层数与每层结点数量的关系如上图所示,从上面介绍向下调整的方法中,可以推断出每层结点最坏情况下需要向下调整的次数,树的第一层结点最坏情况下,每个结点需要调整的次数为。对于代码的实现,只需要更改函数中的。的结点,因为建立大堆,所以,如果子结点中最大的子结点大于父结点则交换,反之不变,操作一次后,需要指向上一个非叶结点。原创 2023-09-27 23:29:21 · 129 阅读 · 0 评论 -
一起学数据结构(8)——二叉树中堆的代码实现
二叉树的逻辑结构只是根据想象创建出来的结构,但是在计算机存储时,并不存在逻辑结构这种形式。而是下方的存储结构。所以,以下所有操作的对象都是存储结构中连续的数组。例如需要在上述二叉树中插入一个新的结点,并且此结点存储了元素。逻辑结构表示如下:对于存储结构而言,以上操作只是在已有数组的末尾插入了一个值。存储结构表示如下:其中,指针用来后续进行连续空间的开辟,表示数组的长度,用来记录数据的容量,一旦就需要进行扩容。原创 2023-09-24 14:48:59 · 136 阅读 · 1 评论 -
一起学数据结构(7)——树及二叉树的基本概念及存储
在存储上述给出的树时,由于每一个结点下面的子结点的数量都是随机的,所以,只有在得知结点的度的情况下,才可以提前开辟一定量的空间进行存储。前面的关于数据结构的文章中,介绍了顺序表,链表,栈,队列等数据结构。从给出的树的结构图可以看出,树的定义是满足递归的,即:树在定义的过程中,多次用到了自身。对于完全二叉树的顺序存储,一个比较典型的例子就是堆:堆是一个非线性结构的数据结构,结构上满足完全二叉树,适合用顺序存储。通过上述给出的完全二叉树的结构,可以的出,当完全二叉树结点数量的最小值,就是第。原创 2023-09-20 17:06:38 · 98 阅读 · 0 评论 -
一起学数据结构(6)——栈和队列
对于链式结构,只需要,在每次插入之前,开辟一个单独的结点即可。作为形式参数时,函数内部对于形式参数的更改,并不会影响这两个指针中实际保存的内容。上篇文章中,对栈的概念及特点进行了解释,并且给出了栈实现的具体代码。在文章的前面提到,队列的特点是尾部插入元素、头部删除元素、先进先出。所以,对于删除队列中的元素,只需要先将。对于队列,与栈相同的一点是,依然只能在表尾插入数据。在后续的操作中,需要通过向所编写的功能函数中传递两个结构体指针。在前面的删除元素、删除元素的功能中,每进行一次变动,都会有。原创 2023-09-11 23:15:50 · 1051 阅读 · 5 评论 -
一起学数据结构(5)——栈和队列
题目要求在判断有效字符串时,需要满足相同类型的括号闭合,以及正确的闭合顺序。对于正确的闭合顺序这一要求,决定了题目不能使用数组来统计不同类型的括号的数量,判断相同类型阔号的数量是否为偶数来解决问题。1.前面说到,为了演示扩容的第二种方式,所以在通过栈顶向栈中插入元素这一操作时,首先需要检查表示栈中已有元素数量的变量。因此,上面所提到栈是一种只能在表尾进行插入、删除的数据表这一概念,在这里也可以解释为,栈是一种只能在。由上面给出的关于栈底、栈顶的相关定义可知,因为此时的栈为空,所以,栈底、栈顶指向同一位置。原创 2023-09-10 13:55:45 · 839 阅读 · 8 评论 -
一起学数据结构(4)——带头结点的双向循环链表
对双向循环链表的结点,虽然也是由数据域和指针域构成,但是,双向循环链表的指针域中,分别存储了上一个结点的地址和下一个结点的地址,为了后续方便表示,将存储上一个结点地址的指针命名为。后,根据上面给出的双向循环的链表结构不难发现:链表的第一个结点并不存储整型元素,只是用于链接下一个结点和最后一个结点。,虽然形式参数是一级指针,并且同样改变了形参的内容,但是最后的返回值返回了形式参数中存储的地址,只需要在外部定义一个指针用于接受函数的返回值即可。与单链表相同,双向链表中的结点需要同时存储多种类型的数据。原创 2023-08-25 22:10:45 · 816 阅读 · 3 评论 -
一起学数据结构(3)——万字解析:链表的概念及单链表的实现
个结点构成的,每个结点中包含了两个与,一个是用于存储数据元素信息的数据域,另一个是用于存储下一个数据元素信息地址的指针域。通过上面的错误例子。对于第三种情况,需要考虑到,上面给出的查找函数返回的地址并不是插入新结点的地址,而是在这个地址对应的结点的前面进行插入。但是对于上面给出的代码,并不能完成对多个结点的数据元素的打印,因为在创建结点后,并没有将前后的结点进行链接。对于链表,也和顺序表一样,可以实现增删查改各种功能,而实现这些功能的基础,就是如何创造新的结点,为了解决这个问题,可以专门定义一个函数。原创 2023-08-08 02:45:38 · 956 阅读 · 25 评论 -
一起学数据结构(2)——线性表及线性表顺序实现
比如上面给出的代码,如果需要存储的数据的个数只有几个,则会造成极大的内存空间浪费,如果需要存储的数据的个数大于100,则超出了数组的最大存储范围。使用动态顺序表后,对于内存空间的使用便灵活很多,例如,编写一个内存空间检查函数,每次向顺序表中添加数据元素时,先通过内存空间检查函数进行检查,当内存空间不够用时,可以通过动态内存管理函数。头删的过程与头插相反,进行头插的操作时,需要把元素整体向后移动,且移动的顺序是从后向前,对于头删,则是需要从前向后一次覆盖前面的数据。表示一元多项式,便是线性表的一个应用。原创 2023-07-28 17:46:30 · 560 阅读 · 28 评论 -
一起学数据结构(1)——复杂度
对于冒泡排序时间复杂度的计算,通过上面给出的概念,可以知道,时间复杂度针对的对象是代码中临时占用内存空间的变量,可以理解为,为了解决某个问题或者为了完成代码而创建的变量,对于上面的代码,可以看出,为了完成冒泡排序,创建了三个变量分别是。对于例1,即冒泡排序的复杂度的计算:需要注意,当有循环嵌套时,时间复杂度的计算应按照累加,而不是累乘,对于冒泡排序,可以理解为,共有N中情况,每种情况中代码的基本操作的执行次数一次为。在计算双动递归的空间复杂度之前,需要了解一个概念,及:时间是累加的,空间是可以重复利用的。原创 2023-07-25 09:30:00 · 509 阅读 · 35 评论