1、五、概要设计为了实现上述操作,抽象数据图的定义如下:struct arcnode/声明边表中结点结构 int adjvex; int dut; /边上的权值 struct arcnode *nextarc;struct node /声明头结点结构 int data; int id; /定点入度 struct arcnode *firstarc; 1、基本操作:(1)void create_ALgraph(ALgraph g,int e,int n)建立AOE网的邻接表,e为弧的数目,n为顶点数(2)void oupe_ALgraph(ALgraph g,int n) 输出AOE网的邻接表(3)
2、int Criticalpath(ALgraph g,int n) 求AOE网的各个关键活动2、本程序包含两个模块:(1)主程序模块;(2)建立AOE网的邻接表、输出AOE网的邻接表、求AOE网的各个关键活动;(3)模块调用图:主程序模块建立AOE网的邻接表输出AOE网的邻接表求AOE网的各个关键活动3、流程图六、详细设计1、存储类型,元素类型,结点类型:元素类型为整形和指针型。2、每个模块的分析:(1)主程序模块:main() ALgraph g; int e,n; int tag; printf(n请输入顶点的个数和边的个数,用空格间隔:); scanf(%d%d,&n,&e); crea
3、te_ALgraph(g,e,n); /建立邻接表n输出邻接表信息:n oupe_ALgraph(g,n); /建立输出邻接表n输出AOE网的关键路径:弧:权值n tag=Criticalpath(g,n); /找关键活动 if(!tag) printf(AOE网有回路n(2)建立AOE网的邻接表函数模块void create_ALgraph(ALgraph g,int e,int n) /建立AOE网的邻接表,e为弧的数目,n为顶点数 struct arcnode *p; int i,j,k,w; printf(请输入顶点的信息和入度,用空格间隔: for(i=1;i=n;i+) /结点下标
4、从1开始 scanf(gi.data,&gi.id); /输入顶点信息和入度 gi.firstarc=NULL; for(k=1;kadjvex=j;dut=w;nextarc=gi.firstarc; /插入下标为i的边表的第一个结点的位置 gi.firstarc=p;输出AOE网的邻接表函数模块void oupe_ALgraph(ALgraph g,int n) /输出AOE网的邻接表 int i;n;i+) p=gi.firstarc;%d,%d-,gi.data,gi.id); while(p!=NULL) %3d%3d,p-adjvex,p-dut); p=p-nextarc; /找
5、下一个邻接点 求AOE网的各个关键活动函数模块int Criticalpath(ALgraph g,int n)/求AOE网的各个关键活动 int i,j,k,count; int tpordVEX_NUM+1; /顺序队列 int veVEX_NUM+1,leVEX_NUM+1; int eARC_NUM+1,lARC_NUM+1; int front=0,rear=0;/顺序队列的首尾指针初值为0 struct arcnode *p; for(i=1;i+) /各事件最早发生事件初值为0 vei=0; if(gi.id=0) /入度为0入队列 tpord+rear=i; count=0;
6、while(front!=rear) front+; j=tpordfront; count+; p=gj.firstarc; k=p-adjvex; gk.id-; if(vej+p-dutvek) vek=vej+p-dut; if(gk.id=0) tpord+rear=k; if(count=1;i-) /按拓扑序列的逆序取顶点 j=tpordi; p=gj.firstarc; if(lek-p-dut i=0; for(j=1;jj+) while(p!=NULL) /计算各边所代表的a(i+1)的ei和li k=p- ei=vej; li=lek-p- if(li=ei) /输出关
7、键活动 printf(:%dn,gj.data,gk.data,p- p=p- i+; return 1; 3)函数调用关系图create_ALgraph(ALgraph g,int e,int n)oupe_ALgraph(ALgraph g,int n)Criticalpath(ALgraph g,int n)3、完整的程序:#includestdio.hstdlib.h#define VEX_NUM 10/定义最大顶点数#define ARC_NUM 20/定义最多边数typedef int vertype;typedef struct node ALgraphVEX_NUM+1;七、程
8、序使用说明及测试结果1、程序使用说明(1)本程序的运行环境为VC6.0。(2)进入演示程序后即显示提示信息: 请输入顶点的个数和边的个数,用空格间隔:(输入后)回车;请输入顶点的信息和入度,用空格间隔(输入后)回车;请输入边的两个顶点以及边上的权值,用空格间隔:即得结果;2、测试结果:例如:输入:请输入顶点的个数和边的个数,用空格间隔:3、调试中的错误及解决办法。调试过程中,遇到了许多的问题,如关于图的存储结构使用邻接矩阵还是邻接表,然后是关于拓扑排序的算法的问题,通过查阅相关数据结构算法的书本解决了编程过程中遇到的问题。运行界面先输入9 11后,回车:再输入1 0 2 1 3 1 4 1 5 2 6 1 7 1 8 2 9 2后回车:输入边的两个顶点以及边上的权值,用空格间隔:回车即得结果:八、实验小结: 首先通过数据结构老师在课堂上的讲解,对关键路径有了认识和了解,求关键路径的算法也了解和理解了,然后参考相关数据结构算法的书本,将求关键路径的算法运行后,遇到了一些小问题,通过查阅相关资料和向其他同学请教,解决遇到的问题,关于图的路径问题还有最短路径也是求图的路径的一种算法,感觉图的用途挺多的,能够解决实际生活中遇到的很多问题。签 名:日 期:实验成绩:批阅日期:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1