- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AOV网的拓扑排序
[课题六] 设计程序完成如下功能:对给定的AOV网,产生所有的拓扑序列
一.问题分析和任务定义
本课程设计要求以图的任意两种存储结构创建一个AOV网,网中各结点可以是任意数据类型。并以创建的AOV网进行拓扑排序,将拓扑排序后的所有内容显示输出。拓扑排序是能反映AOV网中活动之间的先后关系的,拓扑排序后的序列是反映哪个活动必须在哪个活动之前完成的。
根据对本设计任务要求的理解和分析,现以以下三点问题进行分析:
1.输入数据的形式和输入范围
在本次课程设计的任务要求中,要求对一个AOV网进行拓扑排序,则必须首先创建一个AOV网,所有首先要输入该图的总顶点数和总边数。输入的数据必须是整数,顶点数必须在100范围以内(在这次设计中规定图的最大顶点数在100以内。)在此之后,须输入所有顶点代表的顶点数值,输入的个数是之前已定好的总顶点数。该顶点的数值必须是字符型(本设计中规定顶点的数值字符型)。字符间不用空格。最后输入一组边,形式为“弧头顶点,弧尾顶点”。各边间必须有一空格。输入的个数为之前已确定的边的总数。在此各顶点全为字符型。
因本程序采用的是邻接表的存储结构。故在各表头结点上链接邻接结点时,因各邻接顶点链接与表头结点的顺序不同拓扑排序的序列结果就不同。如表头顶点1后首先链接顶点3,在3之后再链接顶点2,和在1之后先链接2后3。那在拓扑排序的过程入栈的顺序不会一样,则拓扑后的结果序列也不会一样。故输入边的顺序不同,链接在表头结点后的顶点顺序就会不同。在此,我们规定本设计中的输入边时必须按邻接顶点从大到小的顺序输入边。
2.输出数据的形式
因在本设计中是对一AOV网进行拓扑排序,那排序后最终输出的结果是将所有AOV网的顶点按拓扑排序的顺序显示输出出来。输出的是一组字符,每个字符之间有一空格将其隔开。
3.测试数据的选定
根据对本设计的分析确定本设计的测试数据如下:
3.1输入的顶点数和边数:6 8;输入的各顶点数值为:abcdef;输入的各顶点边为:a,d a,c a,b c,e c,b d,e f,e f,d。输出的结果为:f a c b d e。拓扑排序成功
3.2输入的顶点数和边数:6 8;输入的各顶点数值为:abcdef;输入的各顶点边为:a,d a,c a,b b,c c,d c,b e,f f,d。输出的结果为:拓扑排序失败,该图含有有向回路。
3.3输入的顶点数和边数:4 5;输入的各顶点数值为:wxyz;输入的各顶点边为:w,y w,y w,x x,z z,y。输出的结果为:w x z y。拓扑排序成功
3.4输入的顶点数和边数:4 5;输入的各顶点数值为:wxyz;输入的各顶点边为:w,z w,x x,z z,y y,w。输出的结果为:拓扑排序失败,该图含有有向回路
二.概要设计和数据结构的选择
由于一个设计在具体实现其功能前必须确定在程序中用到的数据结构和整个程序分为几个模块及各模块之间的关系。大致确定概要设计后才可以具体完成各子功能模块的算法。以下按两个方面来分析程序概要。
1.程序中用到的数据结构类型
以下分别分析本设计中所涉及到所有的数据结构类型
1.1邻接图数据类型的分析与定义
本设计任务是要用到AOV网,AOV网是反映活动之间关系的图,故主要的数据结构是图结构。因用邻接表实现AOV的存储结构比较易实现拓扑排序,且空间复杂度比邻接矩阵小,故在这里选择邻接表做为图的存储结构。在邻接表中,有各顶点的数据类型定义。在本设计中,定义顶点的数值均采用字符型,因字符型既可以接受数字做为字符存储又可以接受任何字符。可在实际情况中用字符来代表需要排序的活动。该邻接表的类型定义如下:
typedef enum{DG,DN,UDG,UDN}Graphkind;//图的种类
typedef struct ArcNode
{
char adjvex;//该弧指向顶点的位置
struct ArcNode *nextarc;//指向下一条弧的指针
int *info;//该弧相关信息的指针
}ArcNode;
//定义边表结点
typedef struct VertexNode
{
char verdata;//顶点数据
ArcNode *firstarc;//指向第一个邻接顶点
}VertexNode;
//定义表头结点
typedef struct
{
VertexNode vertex[MAX_V_N];//图的所有表头顶点
int vexnum,arcnum;//图的顶点数和弧数
Graphkind kind;//图的种类标志
}AdjList;
//定义邻接表
1.2链栈的数据类型定义与分析
在本程序中还必须要用到一个栈的数据结构,由于链栈判空栈和初始化栈的算法很简单,均需要一个语句即可完成,故在这
文档评论(0)