《数据结构》课程设计报告课程题目:关键路径学院:班级:学号:姓名:指导教师:完成日期:目录一、需求分析 ............................... 错误!未定义书签。
二、概要设计 ............................... 错误!未定义书签。
三、详细设计 ............................... 错误!未定义书签。
四、调试分析 .............................. 错误!未定义书签。
五、用户使用说明 ...................... 错误!未定义书签。
六、测试结果 .............................. 错误!未定义书签。
七、附录 ..................................... 错误!未定义书签。
一、需求分析1、问题描述AOE网(即边表示活动的网络),在某些工程估算方面非常有用。
它可以使人们了解:(1)研究某个工程至少需要多少时间(2)哪些活动是影响工程进度的关键在AOE网络中,从源点到汇点的有向路径可能不止一条,但只有各条路径上所有活动都完成了,这个工程才算完成。
因此,完成整个工程所需的时间取决于从源点到汇点的最长路径长度,即在这条路径上所有活动的持续时间之和,这条路径就叫做关键路径(critical path)。
2、设计步骤(1)、以某一工程为蓝本,采用图的结构表示实际的工程计划时间。
(2)、调查并分析和预测这个工程计划每个阶段的时间。
(3)、用调查的结果建立AOE网,并用图的形式表示。
(4 )、用CreateGraphic ()函数建立图的邻接表存储结构,能够输入图的顶点和边的信息,并存储到相应存储结构中。
(5)、用SearchMaxPath()函数求出最大路径,并打印出关键路径。
(6)、编写代码并调试、测试通过。
3、测试数据○v2○v5○v1○v4○v6○v36v1 v2 v3 v4 v5 v68v1 v2 a1 3v1 v3 a2 2v2 v4 a3 2v2 v5 a4 3v3 v4 a5 4v3 v6 a6 3v4 v6 a7 2v5 v6 a8 1二、概要设计为了实现上述函数功能:1、抽象数据类型图的定义如下:ADT Graph {数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。
数据关系R:R={ VR };VR={<v,w>|v,w∈V,且P(v,w),<v,w>表示从v到w的弧,谓词P(v,w)定义了弧<v,w>的意义和信息}基本操作:InitGraph(G);初始条件:图G存在。
操作结果:构造一个图的顶点数为MAX,弧的个数也为MAX,其他信息都相应初始化了的图。
CreatGraph(& G);初始条件:已经初始化了的图G。
操作结果:通过输入函数输入图的顶点个数,各顶点信息,弧的条数,以及弧的其他信息,构造图G。
}2、抽象数据类型栈的定义如下:ADT Stack {数据对象:D={ai | ai ∈ElemSet,i=1,2,…,n,n≥0}数据关系:Rl={<ai-1,ai>| ai-1,ai∈D,i=2,…,n }约定a n端为栈顶,a i端为栈底。
基本操作:InitStack(&S)操作结果:构造一个空栈S。
StackEmpty(S)初始条件:栈S已经存在。
操作结果:若栈S为空栈,则返回TRUE,否则FALSE。
Push(&S,e)初始条件:栈S已经存在。
操作结果:插入元素e为新的栈顶元素。
Pop(&S,&e)初始条件:栈S已存在且不为空。
操作结果:删除S的栈顶元素,并用e返回其值。
}三、详细设计1、图的邻接表存储结构如下:#define MAX 20typedef struct ArcNode irst=NULL;}void CreateGraphic(ALGraph &G){int i,j,s,n;ArcNode *p,*pp; ata); irst=NULL; ata)==0) 则停止查找,并保存弧尾break; 所示的顶点在头结点中的序号j for(s=0;s<;s++) ata)==0) 则停止查找,并保存弧头break; 所示的顶点在头结点中的序号s pp=(ArcNode *)malloc(sizeof(ArcNode)); irst!=NULL) irst; irst=pp; irst;p;p=p->next){ irst;p;p=p->next){ ata);irst;p;p=p->next){ k=p->adjvex;ee=ve[j];el=vl[k]-(p->info2);if(el==ee) printf("%s ",p->info1);}}printf("\n");return OK;}四、调试分析1、本次课程设计题目思路特别清晰,算法特别简单,但是在编程过程中遇到了一系列的问题都值得思考与分析。
2、首先是在图的创建过程中,用邻接表创建图的时候,指针使用没有正确到位而引发了一系列问题,后来通过与老师同学一起分析才找到了问题的症结所在。
之前用临时指针p保存头结点的first指针,然后让p指向已经存好信息的表结点pp,这样操作并没有真正把它连起来,下次循环时,又覆盖了原来的信息。
3、在成功创建了图后,把主函数中生成的图作为参数传给Critial()时,又发现原来图中的活动这一信息又改变了,全变成乱码了,原来是由于存放活动的字符串str3,由于不断的输入,导致最后字符串什么也没有了,而图中每个弧的活动指针都指向它,所以就全乱了,后来就把它改为字符串数组,并且把它设为全局变量。
4、在调试Critial()这一函数中,也遇到了一些问题,在观察零入度栈S的栈顶元素和拓扑序列栈T的时候,在watch窗口中输入*,发现一直乱变,根本不知道它的栈内元素,甚至怀疑栈的初始化函数有没有写对,后来通过查找以前堆栈类型问题以及与同学题目作对比才发现就是由于窗口输入内容写错了,应该改为*。
五、用户使用说明第一行输入顶点个数vexnum。
第二行输入各个顶点的名称。
第三行输入弧的边数arcnum。
接下来的arcnum行输入每一条弧的弧尾顶点、弧头顶点、活动以及权值大小。
六、测试结果七、附录以下是该程序设计的完整代码:#include<>#include<>#include<>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2#define MAX 20#define SIZEMAX 20#define ADD 10typedef int Status;typedef int Infotype;typedef char Vertextype; typedef int Elemtype; int ID[MAX]={0};int ve[MAX]={0};char str3[MAX][10]; typedef struct ArcNode {int adjvex;struct ArcNode * next; char * info1;int info2;}ArcNode;typedef struct VNode {Vertextype data[3]; ArcNode * first;}VNode,AdjList[MAX]; typedef struct{AdjList vertices;int vexnum;int arcnum;}ALGraph;typedef struct{Elemtype * base;Elemtype * top;int maxsize;}Stack;void Init(ALGraph &G){=MAX;=MAX;for(int i=0;i<;i++)[i].first=NULL;}void CreateGraphic(ALGraph &G){int i,j,s,n;ArcNode *p,*pp;char str1[10],str2[10];scanf("%d\n",&;for(i=0;i<;i++){scanf("%s",[i].data);[i].first=NULL;}scanf("%d\n",&;for(i=0;i<;i++){scanf("%s%s%s%d",str1,str2,str3[i],&n);for(j=0;j<;j++)if(strcmp(str1,[j].data)==0)break;for(s=0;s<;s++)if(strcmp(str2,[s].data)==0)break;pp=(ArcNode *)malloc(sizeof(ArcNode));pp->adjvex=s;pp->info1=str3[i];pp->info2=n;pp->next=NULL;ID[s]++;if[j].first!=NULL){p=[j].first;if(p->next!=NULL){while(p->next->next!=NULL){p=p->next;}p=p->next;}p->next=pp;}else[j].first=pp;}}Status InitStack(Stack &S){=(Elemtype *)malloc(SIZEMAX*sizeof(Elemtype));if(! exit (OVERFLOW);=;=SIZEMAX;return OK;}Status Pop(Stack &S,int &e){if== return ERROR;e=*;return OK;}Status Push(Stack &S,int e){if{=(Elemtype *)realloc,+add)*sizeof(Elemtype));if(! exit (OVERFLOW);=+;=+add;}*++)=e; irst;p;p=p->next){k=p->adjvex; ID[k]--;if(ID[k]==0) Push(S,k);if( ( ve[j] + (p->info2) ) > ve[k] )ve[k]=ve[j]+(p->info2);}}if(count< return ERROR;else return OK;}Status Critial(ALGraph G){int i,j,k,ee,el;int vl[MAX];Stack T;InitStack(T);ArcNode * p;if(!Topo(G,T)) return ERROR;for(i=0;i<;i++) vl[i]=ve[];while(!Empty(T)){for(Pop(T,j),p=[j].first;p;p=p->next){k=p->adjvex;if(vl[k]-(p->info2)<vl[j]) vl[j]=vl[k]-(p->info2);}}printf("关键顶点为a:");for(j=0;j<;j++){if(ve[j]==vl[j]) printf("%s ",[j].data);}printf("\n");printf("关键路径为a:");for(j=0;j<;j++){for(p=[j].first;p;p=p->next){k=p->adjvex;ee=ve[j];el=vl[k]-(p->info2);if(el==ee) printf("%s ",p->info1);}}printf("\n");return OK;}int main(){ALGraph G;Init(G);CreateGraphic(G);Critial(G);return 0;}。