《数据结构的课程设计》报告题目:关键路径问题设计与实现班级:1612401学号:161240113姓名:张修鸣指导老师:孙涵完成日期:2014.1.3目录一.需求分析.二.程序主要功能.三.程序运行平台.四.程序类说明.五.模块分析.六.存在的不足与对策.七.体验感悟八.程序源代码.需求分析设计并实现关键路径的一种应用。
程序主要功能(1)实现拓扑排序和关键路径的发现。
(2)给出一个具体的应用环境。
程序运行平台该程序是用VC++6.0制做的,使用Microsoft Visual C++ 6.0运行该程序,具体操作是:打开Microsoft Visual C++ 6.0,菜单栏里点文件→打开工作区→找到“图书管理系统.dsw”这个文件→打开,或者在资源管理器中双击该文件,此时,VC++6.0会自动打开,并载入该系统相关资源,点击Run命令菜单或者或用快捷键Ctrl+F5运行该程序。
程序类说明typedef struct node{int adjvex; //邻接点域int time;//活动持续时间struct node *next;}Node;Node *p;typedef struct VertexNode{int vertex; //顶点域int indegree; //入度域Node *firstedge; //边表头指针}AdjList[20];typedef struct{AdjList adjlist;//邻接表int Dian;//顶点数int Bian; //边数}ALGraph函数分析:void CreateALGraph(ALGraph *&G) //建立有向图int TopoSort(ALGraph *G,int s[20],int ve[20])//拓扑排序并求各顶点事件的最早发生时间及拓扑逆序列int CriticalPath(ALGraph *G)//求关键路径和关键活动模块分析文件的信息关键活动与关键路径存在的不足与对策由于自身能力有限,所以没有设计好交互界面。
在设计过程中由于设计者的编程功底欠缺,因此学习过程较为艰辛,需要解决的问题也比较多。
在以后的学习中,应该循序渐进,不可急于求成,先打好基础,这样才能更好地发展。
体验感悟在编写程序的过程中,深切的体会到自身能力还有待提高,通过大规模的查询网上资料与相关书籍我学习到了很多以前不知道的编程方法与各种奇妙的函数语句时,提高了自己对程序设计本身的兴趣,更加乐意去学习这方面的新的东西,并在不断地自我挑战中收获着,或知识技能,或信心勇气。
希望自己在今后的学习中可以更好的完善自我。
程序源代码#include<iostream>using namespace std;#include <fstream>typedef struct node{int adjvex; //邻接点域int time;//活动持续时间struct node *next;}Node;Node *p;typedef struct VertexNode{int vertex; //顶点域int indegree; //入度域Node *firstedge; //边表头指针}AdjList[20];typedef struct{AdjList adjlist;//邻接表int Dian;//顶点数int Bian; //边数}ALGraph;void CreateALGraph(ALGraph *&G) //建立有向图{ fstream fp;int i,j,k,cost;Node *s;G=(ALGraph *)malloc(sizeof(ALGraph));fp.open("a.txt",ios::in);if(fp.fail()){cout << "文件打开失败!\n";exit(0);}fp>>G->Dian;fp>>G->Bian;//cout<<"请输各个入顶点号:"<<endl;for(i=0;i<G->Dian;i++){G->adjlist[i].vertex=i;G->adjlist[i].firstedge=NULL;G->adjlist[i].indegree=0;}//cout<<"请输入各个边的弧头顶点弧尾顶点活动持续时间(弧的长度)):"<<endl;for(k=0;k<G->Bian;k++){fp>>i;fp>>j;fp>>cost;s=(Node*)malloc(sizeof(Node));s->adjvex=j;s->time=cost;s->next=G->adjlist[i].firstedge;G->adjlist[i].firstedge=s;G->adjlist[j].indegree++;}}int TopoSort(ALGraph *G,int s[20],int ve[20]){//拓扑排序并求各顶点事件的最早发生时间及拓扑逆序列int i,j,k,num=0,n=0,stack[20];Node *p;for(i=0;i<G->Dian;i++) //计算各个顶点的入度{if(G->adjlist[i].indegree==0){stack[num]=i;num++;}}for(i=0;i<G->Dian;i++)ve[i]=0;while(num!=0){j=stack[num-1];s[n]=j;n++;num--;p=G->adjlist[j].firstedge;while(p){k=p->adjvex;G->adjlist[k].indegree--;if(G->adjlist[k].indegree==0){stack[num]=k;num++;}if(ve[j]+p->time>ve[k]){ve[k]=ve[j]+p->time;}p=p->next;}}if(n<G->Dian)return 0;else return 1;}int CriticalPath(ALGraph *G)//求关键路径和关键活动{int i,j,k,h=0;int ee,el,dut;int v1[20],ve[20],T[20],g[40];int tag;if(!TopoSort(G,T,ve)){cout<<"错误!!网中存在环"<<endl;return 0;}for(i=0;i<G->Dian;i++)v1[i]=ve[G->Dian-1];for(i=G->Dian-1;i>=0;i--){j=T[i];p=G->adjlist[j].firstedge;while(p!=NULL){k=p->adjvex;dut=p->time;if(v1[k]-dut<v1[j])v1[j]=v1[k]-dut;p=p->next;}}cout<<"关键活动:"<<endl;for(j=0;j<G->Dian;++j)for(p=G->adjlist[j].firstedge;p;p=p->next){k=p->adjvex;dut=p->time;ee=ve[j];el=v1[k]-dut;if(ee==el) { //若两者相等,说明这这个活动为关键活动cout<<"("<<j<<","<<k<<")";cout<<" v"<<j<<",v"<<k<<"\t最迟发生时间"<<el<<endl;g[h]=j;g[h+1]=k;h=h+2;}}cout<<"关键路径是"<<endl;for(i=0;i<h;i=i+2)cout<<g[i]<<"->"<<g[i+1]<<" ";return 1;}void main(){ALGraph *G;CreateALGraph(G);CriticalPath(G);}。