![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 79
数据结构
lanhuazui10
这个作者很懒,什么都没留下…
展开
-
孩子兄弟树实现
树、森林与二叉树之间有一个自然的对应关系,它们之间可以相互转换,即任何一个森林或一棵树都可以唯一地对应一棵二叉树,而任一棵二叉树也能唯一地对应到一个森林或一棵树上。孩子兄弟树采用孩子兄弟链存储结构是为每个结点设计3个域,即一个数据元素域、一个指向该结点的左边第一个孩子结点(长子)的指针域、一个指向该结点的下一个兄弟结点的指针域。if(t==NULL || p==NULL || p==t) //要查结点为根结点:无父结点。//孩子结点没找到,查兄弟结点。if(t->data == key)//查找根结点。转载 2023-05-01 22:45:53 · 138 阅读 · 0 评论 -
线索二叉树实现
所谓的线索二叉树就是加上线索的二叉树,我们知道在有n个结点的二叉树中必定存在n+1个空链域(叶子结点的左右孩子指针都为空),由此利用这些空链域来存放结点的前驱和后继的信息,构成线索。=NULL && p->rightChild == cur) //判断这个前驱结点的右孩子是否为当前结点。if(p->rightChild == cur) //判断前驱结点的右孩子是否就是当前结点。if(p->leftChild == cur)//判断后继结点的左孩子是否为当前结点。//将前驱结点的右指针指向后继。转载 2023-05-01 22:35:52 · 96 阅读 · 0 评论 -
二叉树链式实现
/拷贝t2右子树到t1右子树。if(t->leftChild==p || t->rightChild==p)//判断t的左右孩子是否为p。= NULL) //判断该结点右子树是否为空。转载 2023-05-01 20:08:53 · 74 阅读 · 0 评论 -
树及二叉树概念
本身是有序树;树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2;例如,图 1a) 就是一棵二叉树,而图 1b) 则不是。图 1 二叉树示意图本节介绍了什么是二叉树,以及二叉树的性质,同时还介绍了满二叉树和完全二叉树以及各自所特有的性质,初学者需理解并牢记这些性质,才能更熟练地使用二叉树解决实际问题。转载 2023-04-30 21:56:43 · 55 阅读 · 0 评论 -
广义表原理及实现
前面讲过,数组即可以存储不可再分的数据元素(如数字 5、字符 'a'),也可以继续存储数组(即 n 维数组)。但需要注意的是,以上两种数据存储形式绝不会出现在同一个数组中。例如,我们可以创建一个整形数组去存储 {1,2,3},我们也可以创建一个二维整形数组去存储 {{1,2,3},{4,5,6}},但数组不适合用来存储类似 {1,{1,2,3}} 这样的数据。有人可能会说,创建一个二维数组来存储{1,{1,2,3}}。在存储上确实可以实现,但无疑会造成存储空间的浪费。转载 2023-04-30 19:11:54 · 1062 阅读 · 0 评论 -
三元组顺序表矩阵压缩实现
*这里是依次遍历矩阵M的三元组表,找到每个元素对应矩阵的哪一列,再通过cpot[col]找到每列的第一个非零元素,本质还是按照每列的次序去重排三元组表*/矩阵转置的实现思路是:不断遍历存储矩阵的三元组表,每次都取出表中 j 列最小的那一个三元组数据,互换行标和列标的值,并按次序存储到一个新三元组表中。所以我们遍历到的这个三元组时,当其与其后面的拥有相同列元素的三元组进行比较的时候,它一定是最小的,图 2 的数组中,存储的是三元组(即由 3 部分数据组成的集合),组中数据分别表示(行标,列标,元素值)。转载 2023-04-30 00:24:14 · 1319 阅读 · 0 评论 -
矩阵的压缩存储
数据结构中,提供针对某些特殊矩阵的压缩存储结构。针对以上两类矩阵,数据结构的压缩存储思想是:矩阵中的相同数据元素(包括元素 0)只存储一个。转载 2023-04-29 21:29:55 · 196 阅读 · 0 评论 -
数组的顺序存储
① 数组是高级语言一般都支持的数据类型,这里学习数组在计算机内部如何处理,主要是存取,地址计算;② 从逻辑结构上看,数组可以看成是一般线性表的扩充。二维数组视作线性表① 把矩阵Am×n看成n个列向量的线性表:αj=(a1j,a2j, …,amj),(1 ≤ j ≤ n)本身也是一个线性表,称为列向量。②把矩阵Am×n看成m个行向量的线性表:βi = (ai1, ai2, …, aij, …, ain),(1 ≤ i≤ m)称为行向量。高维数组。转载 2023-04-29 21:21:02 · 4522 阅读 · 1 评论 -
模式匹配的改进方法(KMP算法)
KMP算法(快速模式匹配算法)C语言详解https://www.cnblogs.com/zhangtianq/p/5839909.htmlKMP入门级别算法详解--终于解决了(next数组详解)_abc的next数组_JensLee的博客-CSDN博客转载 2023-04-29 16:53:43 · 51 阅读 · 0 评论 -
堆分配存储串实现
/若是非空串,则按串长分配存储区,否则ch为NULL。//pos字符之后的每个字符向后移,腾出插入T->length插入空间。//先释放串S原有空间,再分配跟串T相同长度的存储空间,再去拷贝。//用Sub返回S的第pos个字符起长度为len的子串。//从串S中删除第pos个字符起长度为len的子串。//从pos字符起len长度前移。//在串S的第pos字符之前插入串T。//重新分配指定大小空间。//堆分配存储串数据结构定义。//求串的长度,即字符个数。//分配串常量给串S。原创 2023-04-29 16:31:54 · 84 阅读 · 0 评论 -
串定长顺序结构实现
/BF算法,在串s中从pos位置起寻找子串t,如果找到则返回其第一个字符在s串的位置。//子串T遍历完成,返回在主串S中第pos位置后第一次出现的位置,否则返回-1。//求子串,返回串S的第pos个字符起长度为len的子串,存到sub字符数组中。//然后从pos位置起的字符往后挪t_len(实际能插入的长度)位,再将t插入。//串S查找的初始位置,从pos位置开始比较。//先调用定位方法,找到子串t在串s中的位置pos,//在串S的第pos个字符之前插入串T。//从串S的第pos位置起查找子串T。原创 2023-04-29 15:03:58 · 82 阅读 · 0 评论 -
串的定义和分类
数据结构中,字符串要单独用一种存储结构来存储,称为串存储结构。这里的串指的就是字符串。严格意义上讲,串存储结构也是一种线性存储结构,因为字符串中的字符之间也具有"一对一"的逻辑关系。只不过,与之前所学的线性存储结构不同,串结构只用于存储字符类型的数据。无论学习哪种编程语言,操作最多的总是字符串。需要注意的是,空格串和空串不同,空格串中含有字符,只是都是空格而已。转载 2023-04-29 12:49:16 · 282 阅读 · 0 评论 -
循环队列实现
对顺序队列改进,循环队列,因为顺序队列中入队和出队front和rear都是不断加1,变成循环队列可以通过取余操作重复使用队列空间。//初始化队列,从下标0开始计数。//front下标不一定比rear小了,i不能直接加1,也要取模运算。//入队要先判断队列是否满,牺牲一个空间元素。//入队尾指针不能直接加1,要取模。//头指针等于尾指针,队列就为空。//出队不能直接加1,要取模。main.c接口函数。原创 2023-04-28 22:54:39 · 62 阅读 · 0 评论 -
顺序形式队列实现
/尾指针,若队列不空,指向队尾元素的下一个位置。//头指针,若队列不空,指向队列头元素。//动态数组存储数据变量指针。#define MAXSIZE 8 //最大队列长度。//从对头出队,头指针加加。//销毁队列,释放base申请空间。//队列满,直接返回。//rear先用再加。//顺序队列数据结构定义。main.c测试接口。原创 2023-04-28 22:36:59 · 36 阅读 · 0 评论 -
链式队列实现
/front和tail都是代表头结点,数据域为空,不存数据。//Q-front是头结点,从开始结点取数据。//p指向最后一个节点,置为空队列。//结点s相当于头结点指针。//求队列的长度,即队列的元素个数。//尾插法插入新节点s。//从对头开始遍历队列。//请空队列保留头结点。//判断是否为空队列。//入队,将元素x插入队尾。//取出对头元素,存到v中。//构造一个空队列Q。main.c测试接口。原创 2023-04-28 22:20:10 · 79 阅读 · 0 评论 -
链式栈实现
/链式栈数据结构定义。main.c测试接口。原创 2023-04-27 20:59:36 · 54 阅读 · 0 评论 -
顺序栈实现
s->top = 0;//栈顶元素初始值为0,所以先用再自加1。printf("栈空间已满,%d 不能入栈.\n",x);printf("栈空间已空,不能取栈顶元素.\n");printf("内存不足,无法申请空间.\n");printf("栈空间已空,不能出栈.\n");//栈长度,即栈的元素个数。//顺序栈数据结构体定义。//清空栈,把s置为空栈。//销毁栈,栈s不再存在。main.c测试接口。原创 2023-04-27 20:21:06 · 62 阅读 · 0 评论 -
单链表实现
/pHead没有变化,pHead->pnext是不断变化的,始终作为当前节点的指针。printf("\n********显示当前单链表中的全部元素******\n");printf("\n********显示当前单链表中的全部元素******\n");printf("\n********显示当前单链表中的全部元素******\n");printf("\n********显示当前单链表中的全部元素******\n");//假定我们的顺序表A-》B-》C,我们要删除的是A的后续节点B,A-》C。原创 2023-04-24 19:54:11 · 82 阅读 · 0 评论 -
顺序表实现
/顺序表的长度,指向最后一个节点的位置,last的存在的目的:为了在函数调用的时候传递数据方便,因为我们与分配的空间中,并不是立即存满的。printf("初始化后顺序表的元素个数:%d", GetSizeSeq(lPtr));/// pList:目标的顺序表, pos:获取元素的下标 ,e:将元素值放入。///pList:目标的顺序表, pos:获取元素的下标 ,e:将元素值放入。///获得当前数组顺序表的元素个数,pList:顺序表的起始地址。//pList:目标顺序表,x待插入的元素,k插入的位置。原创 2023-04-24 19:20:18 · 77 阅读 · 0 评论 -
线性表的链式实现(单链表)
单链表的定义为了表示每个数据元素与其直接后续元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后续的信息,即每个结点存放本身的数据元素和下一个元素的地址。n个结点连接成一个链式线性表的结构我们叫做链表,当每个结点只包含一个指针域时,叫做单链表。首先给出一个线性表,存放数据元素,a1到 an有这样的线性逻辑关系。单链表在存储空间上是这样存放的,它是存放在任意位置的,这个任意位置表示它们不一定要连续。如图所示的 a2、a3与 a3、a4。第二个很明显的差别是单链表在存...转载 2021-05-24 01:09:20 · 1299 阅读 · 0 评论 -
线性表的顺序实现
顺序表的定义线性表的顺序存储又称为顺序表来看一个生活中的例子:周末和朋友一起吃火锅,人非常多,我们需要在等候区等候,这个等候区就与顺序表有非常多的相似之处,借助它去理解顺序表的特点。首先,在等候区有非常多的椅子,这些椅子往往是排成一排连续排放的,中间不会空出很大的空间造成浪费。这就与在顺序表中选取存储单元的方法是一样的,选取一段地址连续的存储单元去存放顺序表。接着工作人员会安排我们在椅子上连续的坐下等候。在存储单元当中去进行数据的存放是一样的,也是依次地存放线性表当中的数据元素,中间也不会空出许多存转载 2021-05-23 20:07:33 · 633 阅读 · 0 评论 -
线性表的定义与常用操作接口定义
线性表的定义:线性表是具有相同类型的n(n>=0)个数据元素的有限序列。一般可以表示为:L=(a1,a2,…,ai,ai+1,…,an)。a1是唯一的“第一个”数据元素,又称为表头元素; an 是唯一的“最后一个”数据元素,又称为表尾元素。除第一个元素外,每个元素有且仅有一个直接前驱,除最后一个元素外,每个元素有且仅有一个直接后继.以上就是线性表的逻辑特性,这种线性有序的逻辑结构正是线性表名字的由来。线性表有如下特点:(1).线性表是零个或多个数据元素的几何(2).线性表中的数原创 2021-05-22 17:00:58 · 585 阅读 · 0 评论 -
图解排序算法(六)之堆排序
堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。堆 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图:同时,我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子该数组从逻辑上讲就是一个堆结构,我们用简单的公式来描述一下堆的定义就是:转载 2021-05-05 23:55:19 · 123 阅读 · 0 评论 -
图解排序算法(五)之归并排序
基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略,分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之。下面我们来看归并排序的思路(先讲思路再来具体讲归并的细节):当要排序一个数组的时候,归并排序法首先将这个数组分成一半。然后想办法把左边的数组给排序,右边的数组给排序,再将它们归并起来。怎么让左边和右边的部分有序呢,继续把转载 2021-05-05 23:21:48 · 310 阅读 · 0 评论 -
图解排序算法(四)之快速排序
快速排序基本思想及步骤算法思想上节介绍的冒泡排序扫描过程只对相邻的两个元素进行比较,因此在互换两个相邻元素时候只能消除一个逆序。如果能通过两个不相邻的元素交换,消除待排序记录中的多个逆序,则会大大加快排序的速度。快速排序方法中的一次交换可能消除多个逆序。从待排序记录序列中选取一个记录(通常选取第一个记录)为标准记录,其关键字设为K1,然后将其余关键字小于K1的记录移到前面,而将关键字大于或者等于K1的记录移到后面,结果将待排序记录序列分成两个子表,最后将关键字为K1的记录插到其分界线的位置处,这原创 2021-05-05 19:49:10 · 313 阅读 · 0 评论 -
图解排序算法(三)之折半插入排序
折半插入排序利用二分法的思想,在一个有序的序列中,找到新元素在该序列中的位置,然后插入。如图1所示,共有n个元素,前i个元素已经是有序序列,现在要将第i个元素插入其中。折半插入排序需要做两步工作:找到待插入元素的位置、插入。图1 插入排序示意图首先要定义两个指针(不是语法里面的指针,是下标的意思)low和high用于寻找a[i]的插入位置,low指向a[0],high指向a[i-1],中点mid=(low+high)/2,图2 “折半”示意图如图2所示二分法的思想是,比较..转载 2021-05-05 17:06:00 · 9640 阅读 · 1 评论 -
图解排序算法(二)之希尔排序
希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现。基本思想 希尔排序的实现思路是:先将整个记录表分割成若干部分,分别进行直接插入排序,以使整个序列基本有序,然后再对整个记录表进行一次直接插入排序。增量d表示将n个数据元素分成d个子序列,每个子序列元素之间相差也是d 简转载 2021-05-05 16:44:18 · 112 阅读 · 0 评论 -
图解排序算法之3种简单排序(选择,冒泡,直接插入)
排序是数据处理中十分常见且核心的操作,虽说实际项目开发中很小几率会需要我们手动实现,毕竟每种语言的类库中都有n多种关于排序算法的实现。但是了解这些精妙的思想对我们还是大有裨益的。本文简单温习下最基础的三类算法:选择,冒泡,插入。先定义个交换数组元素的函数,供排序时调用简单选择排序 简单选择排序是最简单直观的一种算法,基本思想为将序列分为有序序列和待排的无序序列,每一趟从后面n-i个待排数据元素中选择最小的一个元素作为有序序列的第i个元素,直到所有元素排完为止。 在算法实现时,每一趟确定最原创 2021-05-05 16:13:41 · 2075 阅读 · 1 评论 -
算法概念【PPT整理】
算法1.算法(Algorithm)的定义算法是规则的有限集合, 是为解决特定问题而规定的一系列操作2.算法的特性 (1) 有限性:有限步骤之内正常结束,不能形成无穷循环。 (2) 确定性:算法中的每一个步骤必须有确定含义, 无二义性。 (3) 输入: 有多个或0个输入。 (4) 输出: 至少有一个或多个输出。 (5) 可行性: 原则上能精确进行, 操作可通过已实现的基本运算执行有限次而完成。在算法的五大...原创 2020-09-13 16:33:07 · 2962 阅读 · 0 评论 -
数据结构的基本概念【PPT总结】
数据结构的相关名词:数据(Data) 数据元素(Data Element) 数据对象(Data Object) 数据结构(Data Structure) 数据类型(Data Type) 数据抽象与抽象数据类型1.1. 数据(Data) 数据是描述客观事物的数值、字符以及能输入机器且能被处理的各种符号总称。换句话说,数据是对客观事物采用计算机能够识别、存储和处理的形式所进行的描述。简而言之,数据就是计算机化的信息。1.2. 数据元素数据元素是组成数据的...原创 2020-09-13 15:28:27 · 1900 阅读 · 0 评论