数据结构知识汇总
文章平均质量分 73
tagyona
独立思考。不论是做题,还是人生。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
顺序栈及运算实现
利用顺序存储结构实现的栈称作顺序栈(Sequential Stack).类似于顺序表,栈中的数据元素用一个预设的足够长度的一维数组来存放,栈底位置可以设在数组的任一端点,而栈顶是随着插入和删除运算而变化的,用top指针指示当前栈顶的位置。顺序栈的类型描述如下:#define MAXSIZE 100typedef struct{ elemtype data[MAXSI转载 2013-01-26 15:23:02 · 2447 阅读 · 0 评论 -
线索二叉树上的运算实现
1.遍历中序线索二叉树遍历线索二叉树,只要从头结点出发反复找结点的后继,直到又回到头结点时止。查找一个结点的后继有两种情况:如果结点的右线索标志rtag=1,右指针所指即为中序后继。如果结点的右线索rtag=0,该结点有右孩子,由中序遍历的定义知其后继结点应是它的右子树上的最左下结点;即沿着它的右孩子结点的左指针链一直往下找,当某结点左线索标志为1时,该结点就是要找的最左下结点。下面给出遍转载 2013-02-02 15:10:28 · 692 阅读 · 0 评论 -
线性表应用举例——一元多项式相加问题
多项式相加算法的思路是,不产生新的结点而利用原有结点空间,设两个指针变量p和q分别指向A和B两个多项式单链表的第一个结点,依次比较两指针所指结点的指数项。若指数相等系数相加,和不为零修改*p的系数项并删除*q,和为零删除*p和*q;若指数不等,p->expexp时*p为和多项式中的一项,p->exp>q->exp时把*q插在*p之前(*q为和多项式中的一项);所有操作之后要相应的移动指针。直到其中转载 2013-01-21 21:45:51 · 3397 阅读 · 0 评论 -
图的遍历
图的遍历是图的重要操作,对图和网的许多操作都是建立在对图的遍历操作的基础之上,如图的连通性问题、拓扑排序问题等。通常有两种遍历图的方法,即深度优先搜索遍历和广度优先搜索遍历,这两种遍历方法对无向图和有向图都适用。1.深度优先搜索遍历图的深度优先搜索遍历类似于树的先根次序遍历,是树的先根次序次序遍历的推广,其递归定义如下:(1).从图中的某个顶点Vo出发并访问它;(2).依次从Vo的转载 2013-02-08 00:07:43 · 1517 阅读 · 0 评论 -
单源最短路径——Djkstra算法
所谓单源最短路径,是指从一个顶点(源点)出发到其他各顶点的最短路径,即给定有向网G和源点Vk,求从Vk到G中其他各顶点Vj(j=1,2,····,n,j!=k)的最短路径。迪杰斯特拉提出了一种按路径长度递增的次序产生最短路径的算法。其基本思想是,把网中所有顶点分成两组,第一组是已确定最短路径的顶点集合S,第二组是尚未确定最短路径的顶点集合V;把V中的顶点按最短路径长度递增的顺序逐个添加到S中,转载 2013-02-08 23:13:14 · 2757 阅读 · 0 评论 -
无向连通网的最小生成树
对于一个无向网(即带权无向图),生成树上各边权值之和称作这棵生成树的代价,最小代价生成树是各边权值综合最小的生成树,简称最小生成树。一个无向连通网的最小生成树也可能不是惟一的,但总代价一定是最小的。构造无向连通网的最小生成树方法可以有多种,下面介绍Prim和Kruskal算法就是构造最小生成树的两种算法。1.prim算法prim算法是从连通网中的某一个顶点开始,以此作为生成转载 2013-02-08 20:09:53 · 11736 阅读 · 0 评论 -
所有顶点对之间的最短路径
求所有顶点对之间的最短路径的显而易见的方法是,每次以一个顶点为源点重复执行dijkstra算法n次来求得,总的执行时间为O(n^3).下面介绍的是费罗伊德提出的另一个算法。该算法也是用邻接矩阵a表示有向网,其时间复杂度也是O(n^3),但在形式上更简单些。Floyd算法的基本思想是,从邻接矩阵a开始进行n次迭代,第一次迭代后a[i,j]的值是从Vi到Vj且中间不经过编号大于1的顶点(即V2转载 2013-02-10 22:33:21 · 2400 阅读 · 0 评论 -
AOV网与拓扑排序
如果有向图中用顶点表示活动而用弧表示活动间的优先关系,则该有向图为顶点表示活动的网成为AOV网(Activity On Vertex network)。显然,AOV网应是有向无环图即DAG图。这是因为工程中的各子工程(活动)先后有序不可能存在环,若存在意味着一个子工程以自身的后续子工程的完成为开始条件的谬论。所有,对设计的工程流程图即给定的AOV网,首先要检查它是否存在环路。检查的办法是构转载 2013-02-11 18:50:41 · 4460 阅读 · 0 评论 -
AOE网与关键路径
如果在有向图中用顶点表示事件,用弧表示活动,用弧上的权表示活动持续时间,称该带权有向图(即有向网)为边表示活动的网(activity on edge network),简称AOE网。在AOE网中,只有一个顶点代表的事件发生后,从该顶点出发的各个弧所代表的活动才能开始,只有以弧头关联一个顶点的各个弧所代表的活动都已结束,该顶点所代表的事件才能发生。一项工程可以由若干个子工程活动组成。用AOV转载 2013-02-12 17:58:57 · 8832 阅读 · 0 评论 -
线索二叉树的构造算法
建立线索二叉树的过程称作对二叉树的线索化,线索化需要在遍历的过程中来实现。在对二叉树的某种次序遍历的过程中,一边遍历一边建立线索,若当前访问结点的左孩子域为空则建立前趋线索,若右孩子域为空则建立后继线索。为实现这一过程,可设指针pre指向刚刚访问过的结点,指针p指向当前结点,就可以方便前趋和后继线索的填入。下面给出的是中序线索二叉树线索化的递归算法,其中函数inorderthr处理头结点以及与转载 2013-02-02 12:35:35 · 2098 阅读 · 0 评论 -
二叉树的层次遍历
所谓层次遍历是指从二叉树的根结点开始从上到下逐层遍历该二叉树,在同一层次中从左到右依次访问各个结点。由层次遍历的定义可知,层次遍历是从根结点开始访问,然后访问它的左孩子和右孩子,接下来是它左孩子的左孩子和右孩子,右孩子的左孩子和右孩子······。即在访问完某个结点后,一般不能马上访问它的左孩子和右孩子(除根结点等特殊情况外),需要把它的左右孩子信息保存起来。这种方式正好与队列的操作特点吻合,转载 2013-01-30 23:23:03 · 659 阅读 · 0 评论 -
基于遍历的几种二叉树运算的实现和应用举例
1.查找结点x的运算search(bt,x)查找二叉树bt中的结点x,可以结合在4种遍历算法中的任何一个算法中进行。在此以前序遍历来实现查找运算的递归算法。bitree search(bitree bt,elemtype x)//利用前序遍历实现在二叉树bt中查找元素为x的结点,并返回结点地址{ if(bt!=NULL)//如果二叉树bt非空 { if(b转载 2013-01-31 21:51:55 · 1593 阅读 · 2 评论 -
链栈及运算实现
利用链式存储结构实现的栈称作链栈(link stack).链栈中的每一个数据元素用一个结点表示,其数据形式与单链表完全相同。链栈从本质上讲就是单链表,无非是限制了插入和删除运算只能在链头进行,所有可以说链栈是限制插入和删除运算只能在链头进行的单链表。由于在链头运算,所以不用像单链表那样附加头结点,更方便运算。链栈的类型定义如下:typedef struct node{ ele转载 2013-01-26 17:39:28 · 1432 阅读 · 0 评论 -
单链表的基本操作
1.单链表的建立LinkList *CreateLinkList()//建立一个带头结点的单链表并返回其头结点的地址{ char ch; int x; LinkList *head;//head为头结点指针 LinkList *r,*P;//r为尾指针,P为新申请结点指针 head=(LinkList *)malloc(sizeof(Li转载 2013-01-21 13:22:12 · 667 阅读 · 0 评论 -
顺序队列及运算实现
队列的顺序存储结构实现称作顺序队列。与顺序表一样,顺序队列也是用一维数组来存储其数据元素的。由于队列中数据元素的变化,其队头和队尾位置也随之变化,故需要设两个指针分别指向当前的队头和队尾位置;为了方便运算,通常约定队尾指针rear指向当前队尾元素的实际位置,而队头指针front指向当前队头元素实际位置的前一个位置。顺序队列的类型定义如下:typedef struct{ ele转载 2013-01-27 21:28:46 · 1199 阅读 · 0 评论 -
链队列及运算实现
队列的链式存储结构实现称作链队列。与链栈相似,链队列实际上也是单链表。为了操作上的方便,根据队列的FIFO特点,需要设队头和队尾两个指针,并把这两个指针封装在同一个结构体内;此外,常采用带头结点的单链表,使得队空与非空具有同一结构形式。链队列的类型定义如下:typedef struct node{ elemtype data; struct node *next;}转载 2013-01-27 23:51:12 · 1758 阅读 · 0 评论 -
遍历二叉树的递归算法
二叉树的遍历是指按照某种次序寻访二叉树中的每个结点,使得每个结点都被访问一次且只被访问一次。遍历是二叉树中经常要用到的一种操作。在许多实际应用问题中,常常需要查找具有某一特征的结点,或者对二叉树中的每个结点逐个访问,在访问的过程中对某些结点或全部节点进行相应的处理。1.前序遍历前序遍历二叉树的递归定义为:若二叉树为空数则遍历结束,否则(1).访问根结点(2).前序遍历根结点的左转载 2013-01-29 21:54:49 · 606 阅读 · 0 评论 -
遍历二叉树的非递归算法
三种次序的寻访路线,它是从根结点开始沿左子树深入直到最左下端时,返回进入刚刚遇到结点的右子树;在右子树中,也是先深入到它的最左下结点时返回刚遇到结点的右子树······如此深入和返回,直到从根结点的右子树返回根结点止。在这一过程中,返回结点的顺序恰与深入结点的顺序相反,先深入的后返回,正好符合栈的特点。所以可以用栈来保存遍历过程中的结点信息来实现遍历二叉树的非递归算法,并且假定栈空间足够大不会发生转载 2013-01-30 23:01:49 · 966 阅读 · 0 评论 -
二叉树的简单运算实现
二叉树基本运算的实现算法,依赖于具体的存储结构;采用不同的存储结构,二叉树的基本运算的实现算法是不同的。这里讨论的运算实现算法,是以二叉链表为存储结构的。1.设置空二叉树void setnull(bitree bt)//设置一颗空二叉树,即置头结点的左右孩子链域为空{ bt->lchild=NULL; bt->rchild=NULL;}2.求二叉树的根ele转载 2013-01-29 20:33:40 · 790 阅读 · 0 评论 -
遍历序列与二叉树的复原
1.利用前序序列和中序序列恢复二叉树二叉树的前序遍历是先访问根结点,再按前序遍历方式遍历根结点的左子树和右子树,即由前序序列可以确定二叉树的根结点。另一方面,中序遍历是先中序遍历左子树,然后访问根结点,最后中序遍历右子树;根结点在中序序列中必然将结点分割成为两个子序列,根结点前的子序列是其左子树的中序序列,根结点后的子序列是其右子树的中序序列。现在可以根据这两个子序列在前序序列中找到对应的左子转载 2013-01-31 21:02:43 · 2306 阅读 · 0 评论 -
堆排序(Heap Sort)算法学习
原文链接:http://www.nowamagic.net/algorithm/algorithm_HeapSortStudy.php在程序设计相关领域,堆(Heap)的概念主要涉及到两个方面:一种数据结构,逻辑上是一颗完全二叉树,存储上是一个数组对象(二叉堆)。垃圾收集存储区,是软件系统可以编程的内存区域。本文所说的堆,指的是前者。堆排序的时间复杂度是转载 2013-03-22 19:03:55 · 725 阅读 · 0 评论
分享