AOV网的拓扑序列生成数据结构与算法课程设计报告.doc

AOV网的拓扑序列生成数据结构与算法课程设计报告.doc

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AOV网的拓扑序列生成数据结构与算法课程设计报告

题目:AOV网的拓扑序列生成 一、问题分析和任务定义 本次课程设计要求对于给定的AOV网求出它所有拓扑序列。AOV网(Activity on Vertex Network)是一个有向无环图(Directed Acycline Graph,DAG图)。AOV网中,如果顶点Vi表示的活动在和顶点Vj表示的活动之前进行,则称Vi是Vj的前驱顶点,Vj是Vi后继顶点。拓扑排序就是将有向无环图中的各个顶点排成一个序列,使得所有的前去后继关系都得到满足。对于相互之间没有次序关系的顶点,在拓扑排序的序列中可以处在任意的位置。因此,拓扑排序的结果往往是不唯一的。本次课程设计的主要任务就是将给定的一个AOV网输出所有的该种序列。下面以图一为例: 对于该图其所有的拓扑序列如下: (1)、V0 V1 V2 V3 V4 (2)、V0 V1 V2 V4 V3 (3)、V1 V0 V2 V3 V4 (4)、V1 V0 V2 V4 V3 二、数据结构的选择和概要设计 对于给出的AOV网首先要确定它的存储方式,这里选择邻接表,它的具体数据结构如下图二所示: typedef struct node{ //邻接表中的结点类型 int number; //结点编号 struct node *next; //指向下一个结点 int info; //与表头结点边的信息 }ListNode; typedef struct{ //定义表头结点数组 int number; //顶点信息 ListNode *firstarc; //指向第一个邻接点 }AdjList; //表头结点类型 typedef struct{ //邻接表类型 AdjList head[max_vertex_num]; //邻接表的组 int vexnum ,edgnum; //顶点个数、边的个数 }ALGraph; 一种拓扑序列的生成一般有一下步骤: (1)、从有向无环图中选择一个没有前驱结点的顶点并加入到结点的序列中; (2)、从有向无环图中删除该顶点以及该顶点为尾的所有的弧; (3)、重复(1)(2)的步骤。 在整个拓扑排序的过程中需要频繁的检查顶点的前驱以及作删除顶点和弧的操作,在这里我们用两个全局变量rudu[max_vertex_num]和visited[max_vertex_num]来分别实现这两个操作,如果rudu[i]为零则表示无前驱结点,如果visited[i]为零则表示没有被访问过。如果每删除一个结点就检查,那样的话时间复杂度将很大(等于遍历所有的顶点一遍),因此设计一个堆栈,把检测到的入度为零的结点入栈。每次删除顶点只要从栈中取出一个结点即可。这里堆栈也有一个数据结构,具体实现如图三所示: typedef struct{ int data[max_vertex_num];//堆栈数组 int top;//栈顶标志 }Stack; //顺序表类型 但是如果需要实现一个AOV网所有拓扑序列的生成则不止如此。在每找到一个符合要求的结点后入栈,从而实现一种拓扑排序。在一趟拓扑排序结束后,应该进行恢复删除的结点和删除的弧,并标记已经有过的序列,在恢复某几个个结点后进行下一次的拓扑排序。这里用到递归的思想。具体实现见下面的详细设计。 三、详细设计和编码 本次课程设计的重点在于输出AOV网的所有拓扑序列,因此图的创建即输出之类的问题不做为重点,在此设计过程略过。 对于拓扑排序算法流程图如图四所示: 实现该算法的具体编码如下: void topusort(Stack *L,ALGraph *G,int i){//拓扑排序 ListNode *P; int j,k;Soutput(L); Sinsert(L,i); //把顶点Vi加入到栈中 P=G->head[i].firstarc; visited[i]=1; //把排序过的点标记 while(P) { j=P->number; rudu[j]--; //把以Vi为头的终止结点入度减1 P=P->next; } if(L->top+1==G->vexnum){//判断栈中一种拓扑排序完成

文档评论(0)

almm118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档