数据结构课程设计报告 关键路径的实现

合集下载

数据结构中的关键路径算法解析

数据结构中的关键路径算法解析

数据结构中的关键路径算法解析关键路径算法是一种用于确定项目关键路径的方法,它可以帮助我们找到项目中耗时最长的路径,从而可以合理地安排任务和资源,提高项目完成的效率。

在数据结构中,关键路径算法也有着重要的应用。

本文将对数据结构中的关键路径算法进行解析和讨论。

一、什么是关键路径算法?关键路径算法是一种基于网络图的分析工具,它通过构建工程项目的网络模型,确定项目中的关键路径,以便更好地控制和管理项目进度。

关键路径是指项目中最长时间的路径,这条路径上的每个任务都是不能延误的,否则将会对整个项目的完成时间产生直接影响。

二、关键路径算法的基本步骤1. 创建网络图:将项目的任务和其所需的时间以及任务之间的依赖关系表示为有向无环图(DAG),其中顶点表示任务,边表示任务之间的依赖关系。

2. 计算任务的最早开始时间(ES)和最迟开始时间(LS):从图的起点开始,依次计算每个任务的最早开始时间,即该任务能够开始执行的最早时间;然后从图的终点开始,逆序计算每个任务的最迟开始时间,即该任务必须在何时开始以保证项目能够按时完成。

3. 计算任务的最早完成时间(EF)和最迟完成时间(LF):根据任务的最早开始时间和所需时间计算出任务的最早完成时间,即该任务能够完成的最早时间;然后根据任务的最迟开始时间和所需时间计算出任务的最迟完成时间,即该任务必须在何时完成以保证项目能够按时完成。

4. 计算任务的总时差(TF):总时差等于任务的最迟完成时间减去最早完成时间,表示任务可以延误的时间。

5. 确定关键路径:根据任务的总时差,将总时差为零的任务连接起来,形成关键路径。

三、关键路径算法的实例为了更好地理解关键路径算法的应用,我们以一个简单的工程项目为例进行说明。

假设有以下任务需要完成:任务A:7天任务B:5天任务C:10天任务D:6天任务E:3天任务F:8天任务之间的依赖关系如下所示:A ->B -> D -> FA -> C -> E -> F首先,我们可以根据这些任务和依赖关系创建一个有向无环图(DAG),然后按照上述算法的步骤进行计算。

数据结构课程设计实验报告完整版

数据结构课程设计实验报告完整版

数据结构课程设计实验报告完整版【正文】一、实验目的本实验主要目的是通过实践,掌握数据结构的基本概念、常见数据结构的实现方式以及在实际应用中的应用场景和效果。

二、实验背景数据结构是计算机科学与技术领域中的一个重要概念,是研究数据的组织方式、存储方式、访问方式以及操作等方面的方法论。

在计算机科学领域,数据结构是实现算法和解决问题的基础,因此对数据结构的理解和应用具有重要意义。

三、实验内容本次数据结构课程设计实验主要分为以下几个部分:1. 实验环境的准备:包括选择合适的开发平台、安装必要的软件和工具。

2. 实验数据的收集和处理:通过合适的方式收集实验所需的数据,并对数据进行处理和整理。

3. 数据结构的选择和实现:根据实验需求,选择合适的数据结构,并进行相应的数据结构实现。

4. 数据结构的测试和优化:对所实现的数据结构进行测试,包括性能测试和功能测试,并根据测试结果对数据结构进行优化和改进。

5. 实验报告的撰写:根据实验过程和结果,撰写完整的实验报告,包括实验目的、实验背景、实验内容、实验结果和结论等。

四、实验过程1. 实验环境的准备本实验选择了Visual Studio作为开发平台,安装了相应版本的Visual Studio,并根据官方指引进行了相应的配置和设置。

2. 实验数据的收集和处理本实验选取了一份包含学生信息的数据集,包括学生姓名、学号、性别、年龄等信息。

通过编写Python脚本,成功提取了所需信息,并对数据进行了清洗和整理。

3. 数据结构的选择和实现根据实验需求,我们选择了链表作为数据结构的实现方式。

链表是一种常见的动态数据结构,能够高效地插入和删除元素,适用于频繁插入和删除的场景。

在实现链表时,我们定义了一个节点结构,包含数据域和指针域。

通过指针的方式将节点连接起来,形成一个链式结构。

同时,我们还实现了相关的操作函数,包括插入、删除、查找等操作。

4. 数据结构的测试和优化在完成链表的实现后,我们对其进行了性能测试和功能测试。

求关键路径设计报告 数据结构课程设计毕业设计(论文)word格式

求关键路径设计报告 数据结构课程设计毕业设计(论文)word格式

数据结构课程设计题目:关键路径的设计报告科系:计算机科学与技术班级:姓名:题目:1、编写拓扑排序和求关键路径的程序2、单源顶点最短路径问题设计报告一.需求分析1.在实际工程中拓扑排序和求关键路径是经常使用来安排任务的先后顺序,以及找出关键的路径,合理的安排非关键任务的施工顺序。

2.对用邻接矩阵表示的有向图,从某一顶点出发(称为源点)到该图其它各顶点(称为终点)有无路径?最短路径是什么?路径长为多少?问题要求写一个程序从有向网中的某一顶点出发找出该顶点到其余各顶点的最短路径。

对邻接矩阵cost[n][n]中的每一个元素只能有三种情况:①当i=j时,cost[i][j]=0;②当顶点i和j无边时,cost[i][j]=∞;③当顶点i和j有边,且其权值为W ij时,cost[i][j]=W ij。

由于题目中没有规定输出格式,此程序以顶点序号的形式将最短路径输出到终端上去,并输出该最短路径的长度。

二.概要设计1.1抽象数据类型图的定义如下:ADT Graph{数据对象V:V是具有相同特性的数据元素的集合,称为顶点集.数据对象I:I是具有相同特性的数据元素的集合,称为顶点集.数据关系R:R={VR}VR={(v,w)|v,w属于V,(v,w)表示v和w之间存在路径}基本操作P:Creat_ALGraph(&G,V,VR,I)初始条件:V是图的顶点集,VR是图中边的集合,I是边的权值。

操作结果:按V和VR的定义构造图G。

DFS(&G, v)初始条件:v是图的一个顶点,图G存在。

操作结果:从v点深度优先遍历图G。

DFSTraverse(&G)初始条件:图G存在。

操作结果:深度优先遍历图G。

FindIngree( G,b[])初始条件:图G存在,数组b[]已知。

操作结果:图G的每个顶点的度放在数组b中。

TopologicalSort(&G)初始条件:图G存在。

操作结果:对图G进行拓扑排序。

数据结构课程设计关键路径

数据结构课程设计关键路径

数据结构课程设计-关键路径#define max 20#include<iostream>#include<stdio.h>#include<malloc.h>using namespace std;typedef struct ArcNode//定义表结点{int adjvex;//该弧所指向顶点的位置struct ArcNode *nextarc;//指向下一条弧的指针int info;//该弧的权值}ArcNode;typedef struct VNode//定义头结点{int data;//顶点信息ArcNode *firstarc;//指向第一条依附该顶点的弧的指针}VNode,AdjList[max];typedef struct//定义ALGraph{AdjList vertices;int vexnum,arcnum;//图的当前顶点数和弧数int kind;//图的种类标志}ALGraph;typedef struct//定义栈{int *base;//栈底int *top;//栈顶}stack;void initstack(stack &s)//建立空栈{s.base=(int*)malloc(max*sizeof(int)); s.top=s.base;}int stackempty(stack s)//判断是否为空栈{if(s.base==s.top) return 1;else return 0;}int stackfull(stack s)//判断是否为满栈{if(s.top-s.base>=max) return 1;else return 0;}int pop(stack &s)//进行出栈{int e;//出栈先进行赋值,后移动指针if(!stackempty(s)){e=*(s.top-1);s.top--;return e;}else return NULL;}void push(stack &s,int e)//进行入栈{if(!stackfull(s)){s.top++;//进栈先移动指针,后进行赋值*(s.top-1)=e;}}void CreateDG(ALGraph &G)//创建邻接表的图{int k,i,j;char tag;cout<<"请输入图的顶点数目:"<<endl;//输入顶点数目cin>>G.vexnum;cout<<"请输入图的弧的数目:"<<endl;//输入弧的数目cin>>G.arcnum;cout<<"请确认是否输入弧的权值(y/n):"<<endl;cin>>tag;for(i=1;i<=G.vexnum;++i){G.vertices[i].data=i;//初始化顶点值G.vertices[i].firstarc=NULL;//初始化指针}cout<<"请输入弧的相关信息arc(V1-->V2)"<<endl;//构造弧for(k=1;k<=G.arcnum;++k){cout<<endl<<"请输入弧头"<<"[1,"<<G.vexnum<<"]:";cin>>i;cout<<"请输入弧尾"<<"[1,"<<G.vexnum<<"]:";cin>>j;while(i<1||i>G.vexnum||j<1||j>G.vexnum)//如果弧头或弧尾不合法,重新输入{cout<<endl<<"请再次输入弧头"<<"[1,"<<G.vexnum<<"]:";cin>>i;cout<<"请再次输入弧尾"<<"[1,"<<G.vexnum<<"]:";cin>>j;}ArcNode *p;p=(ArcNode*)malloc(sizeof(ArcNode));//分配内存if(!p){cout<<"Overflow!";//如果没有足够的空间,则退出}p->adjvex=j;//对弧结点的弧顶点数据域赋值p->nextarc=G.vertices[i].firstarc;//对弧结点下一条弧指针域赋值p->info=0; // 对弧结点相关信息指针域赋值G.vertices[i].firstarc=p; // 将弧结点插入到对应的单链表if(tag=='y'){cout<<"请输入弧的权值:";cin>>p->info;}}}void ShowMGraph(ALGraph G)//输出图G{int j;ArcNode *p;for(j=1;j<=G.vexnum;++j){if(G.vertices[j].firstarc)cout<<G.vertices[j].data<<"->";else cout<<G.vertices[j].data<<">";for(p=G.vertices[j].firstarc;p;p=p->nextarc)cout<<p->adjvex<<" "<<p->info<<" "<<p->adjvex<<"->"; cout<<endl;}}int degree(ALGraph G,int i)//求各顶点的入度{int *indegree,j,k;indegree=(int*)malloc((G.vexnum+1)*sizeof(int)); ArcNode *p;for(j=1;j<=G.vexnum;j++)indegree[j]=0;for(j=1;j<=G.vexnum;j++){for(p=G.vertices[j].firstarc;p;p=p->nextarc) {k=p->adjvex;++indegree[k];}}return indegree[i];}void critical(ALGraph G)//输出关键活动{ArcNode *p;int i,k,r,j,*ve,*vl,ee,el,count=0;int *indegree,length;indegree=(int*)malloc(G.vexnum*sizeof(int)); ve=(int*)malloc((G.vexnum+1)*sizeof(int)); vl=(int*)malloc((G.vexnum+1)*sizeof(int)); stack S,T;initstack(T);initstack(S);//一,求各顶点的入度for(j=1;j<=G.vexnum;j++)indegree[j]=degree(G,j);//二,求各顶点最早发生的时间vefor(j=1;j<=G.vexnum;j++)//入度为零则进栈if(indegree[j]==0)push(S,j);for(j=1;j<=G.vexnum;j++)//对该数组初始化ve[j]=0;while(!stackempty(S)){i=pop(S);push(T,i);++count;for(p=G.vertices[i].firstarc;p;p=p->nextarc) {k=p->adjvex; //顶点位置if(--indegree[k]==0) push(S,k);r=p->info;if(ve[i]+r>ve[k])ve[k]=ve[i]+r;}//for结束}//while结束if(count<G.vexnum) //判断AOE是否网有回路{cout<<"AOE网有回路!"<<endl;return;}//三,求各顶点的最迟时间for(j=1;j<=G.vexnum;j++)//对vl数组进行初始化vl[j]=ve[G.vexnum];while(!stackempty(T)){j=pop(T);for(p=G.vertices[j].firstarc;p;p=p->nextarc){k=p->adjvex;r=p->info;if(vl[k]-r<vl[j])vl[j]=vl[k]-r;}}//四,对活动的最早时间和最迟时间比较cout<<"============================================== ================"<<endl;printf(" 起点终点最早开始时间最迟完成时间差值备注\n"); for(j=1;j<=G.vexnum;j++)for(p=G.vertices[j].firstarc;p;p=p->nextarc){k=p->adjvex;r=p->info;ee=ve[j]; el=vl[k]-r;printf("%4d %4d %4d %4d %4d ",j,k,ve[j],vl[k]-r,vl[k]-r-ve[j]);if(ee==el)cout<<" 是关键活动"<<endl;elsecout<<" 不是关键活动"<<endl;}//for结束cout<<"============================================== ================"<<endl;length=ve[G.vexnum];cout<<endl<<"2.关键路径长度为:"<<endl;cout<<" "<<length<<endl;//路径长度等于图最后顶点的最早时间}int main()//主函数{ALGraph G;cout<<"=============================="<<endl;cout<<"======1.创建邻接表图=========="<<endl;cout<<"======2.输出邻接表图=========="<<endl;cout<<"======3.寻找关键活动=========="<<endl;cout<<"======4.退出=================="<<endl;cout<<"=============================="<<endl;cout<<"请选择操作:"<<endl;int a;l1:{cin>>a;}system("cls");while(a<=4){switch(a){case 1:cout<<"请正确创建邻接表图:"<<endl; CreateDG(G);cout<<"Create ALGraph success !"<<endl; cout<<"请选择操作:"<<endl;goto l1;break;case 2:cout<<"输出该邻接表图如下:"<<endl; cout<<"=================="<<endl; ShowMGraph(G);cout<<"该图输出完毕!"<<endl;cout<<"=================="<<endl; cout<<"请选择操作:"<<endl;goto l1;break;case 3:cout<<"1.输出关键活动如下:"<<endl; critical(G);cout<<"请选择操作:"<<endl;goto l1;break;case 4:return 0;}}return 0;}原文已完。

数据结构课程设计报告——关键路径

数据结构课程设计报告——关键路径

《数据结构》课程设计报告课程题目:关键路径学院:班级:学号:XX:指导教师:完成日期:目录一、需求分析3二、概要设计4三、详细设计5四、调试分析11五、用户使用说明12六、测试结果13七、附录13一、需求分析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 a43v3 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存在。

数据结构程序设计实验~AOE图的关键路径

数据结构程序设计实验~AOE图的关键路径

数据结构课程设计报告专业网络工程班级姓名学号指导老师评分计算AOE网的关键路径AOE网即边表示活动的网络。

通常,可用AOE网来估算工程计划的完成时间。

如下所示的AOE网包括11项活动,9个事件,每个事件都有所需的完成时间。

我们现在要解决的是:(1)完成整项工程至少需要多少时间(最短时间);(2)哪些活动是影响工程进度的关键(关键活动)。

用e(i)表示活动最早开始时间,l(i)表示活动的最迟开始时间,则l(i)-e(i)为完成该活动的时间余量。

对于本例列表如下:下图就是上述AOE网的关键路径:请编程完成下列工作:1、输入:(1)顶点的信息和入度;(2)AOE网的边(始点、终点和权值)。

2、输出:(1) AOE网的邻接表(按“顶点入度:—>顶点权值”的格式输出)如a 0:-->4 5-->3 4-->2 6(2)输出关键活动每行所显示的分别为开始事件、结束事件、最早开始时间、最迟开始时间和完成活动的时间余量:当l(i)-e(i)=0时,在该行注明为关键活动。

如:a b 0 0 0 关键活动源程序#include<stdio.h>#include<stdlib.h>#include<iomanip.h>#include <process.h>//#define PROJECTNUMBER 9//10//#define PLANNUMBER 11//13typedef struct node{int adjvex;int dut;struct node *next;}edgenode;typedef struct{int projectname;int id;edgenode *link;}vexnode;//vexnode Graphicmap[PROJECTNUMBER];void CreateGraphic(vexnode* Graphicmap,int projectnumber,int activenumber){int begin,end,duttem;edgenode *p;for(int i=0;i<projectnumber;i++){Graphicmap[i].projectname=i;Graphicmap[i].id =0;Graphicmap[i].link =NULL;}printf("某项目的开始到结束在图中的节点输入<vi,vj,dut>\n");printf("如:3,4,9 回车表示第三节点到第四节点之间的活动用了9个单位时间\n"); for(int k=0;k<activenumber;k++){scanf("%d,%d,%d",&begin,&end,&duttem);p=(edgenode*)malloc(sizeof(edgenode));p->adjvex =end-1;p->dut =duttem;Graphicmap[end-1].id ++;p->next =Graphicmap[begin-1].link ;Graphicmap[begin-1].link =p;}}int SearchMapPath(vexnode* Graphicmap,int projectnumber,int activenumber,int& totaltime){int i,j,k,m=0;int front=-1,rear=-1;int* topologystack=(int*)malloc(projectnumber*sizeof(int));//用来保存拓扑排列int* vl=(int*)malloc(projectnumber*sizeof(int));//用来表示在不推迟整个工程的前提下,VJ允许最迟发生的时间int* ve=(int*)malloc(projectnumber*sizeof(int));//用来表示Vj最早发生时间int* l=(int*)malloc(activenumber*sizeof(int));//用来表示活动Ai最迟完成开始时间 int* e=(int*)malloc(activenumber*sizeof(int));//表示活动最早开始时间edgenode *p;totaltime=0;for(i=0;i<projectnumber;i++) ve[i]=0;for(i=0;i<projectnumber;i++){if(Graphicmap[i].id==0){topologystack[++rear]=i;m++;}}while(front!=rear){front++;j=topologystack[front];m++;p=Graphicmap[j].link ;while(p){k=p->adjvex ;Graphicmap[k].id --;if(ve[j]+p->dut >ve[k])ve[k]=ve[j]+p->dut ;if(Graphicmap[k].id ==0)topologystack[++rear]=k;p=p->next ;}}if(m<projectnumber){printf("\n本程序所建立的图有回路不可计算出关键路径\n");printf("将退出本程序\n");return 0;}totaltime=ve[projectnumber-1];for(i=0;i<projectnumber;i++)vl[i]=totaltime;for(i=projectnumber-2;i>=0;i--){j=topologystack[i];p=Graphicmap[j].link ;while(p){k=p->adjvex ;if((vl[k]-p->dut )<vl[j])vl[j]=vl[k]-p->dut ;p=p->next ;}}i=0;printf("| 起点 | 终点 | 最早开始时间 | 最迟完成时间 | 差值 | 备注 |\n");for(j=0;j<projectnumber;j++){p=Graphicmap[j].link;while(p){k=p->adjvex ;e[++i]=ve[j];l[i]=vl[k]-p->dut;printf("| %4d | %4d | %4d | %4d | %4d |",Graphic map[j].projectname +1,Graphicmap[k].projectname +1,e[i],l[i],l[i]-e[i]);if(l[i]==e[i])printf(" 关键活动 |");printf("\n");p=p->next ;}}return 1;}void seekkeyroot(){int projectnumber,activenumber,totaltime=0;system("cls");printf("请输入这个工程的化成图形的节点数:");scanf("%d",&projectnumber);printf("请输入这个工程的活动个数:");scanf("%d",&activenumber);vexnode* Graphicmap=(vexnode*)malloc(projectnumber*sizeof(vexnode)); CreateGraphic(Graphicmap,projectnumber,activenumber);SearchMapPath(Graphicmap,projectnumber,activenumber,totaltime);printf("整个工程所用的最短时间为:%d个单位时间\n",totaltime);system("pause");}int main(){char ch;for(;;){do{system("cls");printf("| 欢迎进入求关键路径算法程序 |");for(int i=0;i<80;i++)printf("*");printf("%s","(S)tart开始输入工程的节点数据并求出关键路径\n"); printf("%s","(E)xit退出\n");printf("%s","请输入选择:");scanf("%c",&ch);ch=toupper(ch);}while(ch!='S'&&ch!='E');switch(ch){case'S':seekkeyroot(); break; case'E':return 1; }}}。

数据结构关键路径及十字链表基本操作课程设计报告

数据结构关键路径及十字链表基本操作课程设计报告

数据结构课程设计报告小组成员:王瑞琦 13052007 姜薇 13052011 刘倩 13052027小组课题:1-1有向图十字链表的操作2-5 关键路径有向图十字链表的操作功能概述将有向图以是十字链表的形式存储,并借助十字链表对有向图进行查找有向图中指定结点的度(出度和入度)、插入有向边和删除有向边等操作。

模块简介创建有向图十字链表:void creat_crosslink(ALGraph *&G,char vex[],int n,etype edge[],int e)查找结点在十字链表中的位置:int LocateVex(ALGraph *G,Vertex u)插入指定边:bool InsertArc(ALGraph *G,etype a)删除指定边:bool DeletetArc(ALGraph *G,etype a)查找有向图中指定结点的度(出度和入度):int Count(ALGraph *G,Vertex u)数据类型/*边的数据类型*/typedef struct{ char vi,vj;int info;}etype;/*弧结点数据类型*/typedef struct ArcNode{ int tailvex,headvex;/* 该弧的尾和头顶点的位置*/struct ArcNode *hlink,*tlink;/* 分别为弧头相同和弧尾相同的弧的链域*/InfoType info;/*若为网络则为权值*/}ArcNode;/*表头结点数据类型*/typedef struct VexNode{ Vertex data;ArcNode *firstin,*firstout; /* 指向该顶点的第一条入弧和出弧*/}VexNode;typedef VexNode AdjList[MAXV];/*十字链表数据类型*/typedef struct{ AdjList adjlist;int n,e;/*图中顶点数n和边数e*/}ALGraph;概要设计CreateDG(建表)(1)获取有向图的顶点数、弧数并存入;(2)依次获取各顶点的值,存入数组,构建十字链表头结点向量组;(3)依次获取弧信息,存入,确认弧结点在十字链表中的位置并对弧赋值;(4)十字链表创建成功;LocateVex(查找)传参:有向图,顶点利用指针依次扫描表头数组,当找到该顶点时,返回该顶点在十字链表表头数组的位置(序号),未找到该顶点时,返回-1。

最短路径_数据结构课程设计报告

最短路径_数据结构课程设计报告

最短路径_数据结构课程设计报告第一篇:最短路径_数据结构课程设计报告数据结构课程设计《数据结构》课程设计报告设计题目:____医院选址____________ 姓名:__________________ 学号:________________ 专业:___________院系:____________班级:_________________ 指导教师:_________________年 1月 3 日数据结构课程设计一、问题描述(1)题目内容:有n个村庄,现要从这n个村庄中选择一个村庄新建一所医院,使其余的村庄到这所医院的距离总和来说较短。

(n>=5)(2)基本要求:(3)可以输出每一对点间的路径长度;然后选取偏心度,最小的偏心度即为所求。

二、需求分析(4)本程序的功能包括找出每一对点间的路径长度。

(5)然后算出每一对点的偏心度。

(6)其中最小的偏心度即为所求。

三、概要设计操作集合:(7)public:MGraph(DataType a[],int b[][MaxSize],int n,int e);//初始化邻接矩阵和路径(8)void Floyd();//弗洛伊德算法的实现(9)void getE();//获取偏心度(10)void showdist();//把每一对顶点之间的路径权值show出来(11)~MGraph(){} //类的析构函数四、数据结构设计(1)DataType vertex[MaxSize];//存放图中顶点的数组(2)intarc[MaxSize][MaxSize];//存放图中边的数组(3)string path[MaxSize][MaxSize];//存放从Vi到Vj的最短路径,初始为//path[i][j]=“ViVj”(4)int dist[MaxSize][MaxSize];//存放求得的最短路径长度(5)int vertexNum, arcNum;//图的顶点数和边数(6)int E[MaxSize][2];//获取最小偏心度和该顶点五、算法设计1.算法分析1)对带权有向图的,调用Floyd算法,对每一对顶点间的最短路径长度的矩阵;2)对最短路径长度矩阵的每列求最大值,即得到各点的偏心度;3)具有最小偏心度的顶点即为所求。

《数据结构》课程设计报告

《数据结构》课程设计报告

《数据结构》课程设计报告一、课程目标《数据结构》课程旨在帮助学生掌握计算机科学中数据结构的基本概念、原理及实现方法,培养其运用数据结构解决实际问题的能力。

本课程目标如下:1. 知识目标:(1)理解数据结构的基本概念,包括线性表、栈、队列、串、数组、树、图等;(2)掌握各类数据结构的存储表示和实现方法;(3)了解常见算法的时间复杂度和空间复杂度分析;(4)掌握排序和查找算法的基本原理和实现。

2. 技能目标:(1)能够运用所学数据结构解决实际问题,如实现字符串匹配、图的遍历等;(2)具备分析算法性能的能力,能够根据实际问题选择合适的算法和数据结构;(3)具备一定的编程能力,能够用编程语言实现各类数据结构和算法。

3. 情感态度价值观目标:(1)培养学生对计算机科学的兴趣,激发其探索精神;(2)培养学生团队合作意识,提高沟通与协作能力;(3)培养学生面对问题勇于挑战、善于分析、解决问题的能力;(4)引导学生认识到数据结构在计算机科学中的重要地位,激发其学习后续课程的兴趣。

本课程针对高年级学生,课程性质为专业核心课。

结合学生特点,课程目标注重理论与实践相结合,强调培养学生的实际操作能力和解决问题的能力。

在教学过程中,教师需关注学生的个体差异,因材施教,确保课程目标的达成。

通过本课程的学习,学生将具备扎实的数据结构基础,为后续相关课程学习和职业发展奠定基础。

二、教学内容根据课程目标,教学内容主要包括以下几部分:1. 数据结构基本概念:线性表、栈、队列、串、数组、树、图等;教学大纲:第1章 数据结构概述,第2章 线性表,第3章 栈和队列,第4章 串。

2. 数据结构的存储表示和实现方法:教学大纲:第5章 数组和广义表,第6章 树和二叉树,第7章 图。

3. 常见算法的时间复杂度和空间复杂度分析:教学大纲:第8章 算法分析基础。

4. 排序和查找算法:教学大纲:第9章 排序,第10章 查找。

教学内容安排和进度如下:1. 第1-4章,共计12课时,了解基本概念,学会使用线性表、栈、队列等解决简单问题;2. 第5-7章,共计18课时,学习数据结构的存储表示和实现方法,掌握树、图等复杂结构;3. 第8章,共计6课时,学习算法分析基础,能对常见算法进行时间复杂度和空间复杂度分析;4. 第9-10章,共计12课时,学习排序和查找算法,掌握各类算法的实现和应用。

关键路径问题数据结构课程设计

关键路径问题数据结构课程设计

关键路径问题数据结构课程设计一、引言二、关键路径问题概述1.定义2.应用场景三、关键路径问题算法分析1.活动网络图的表示方法2.计算活动最早开始时间和最晚开始时间3.计算活动最早结束时间和最晚结束时间4.确定关键路径及其长度四、数据结构设计与实现1.数据结构选择与设计思路2.程序实现流程图及详细说明五、测试与分析结果展示六、总结与展望一、引言在项目管理中,关键路径问题是一个重要的问题,它可以帮助我们确定项目完成所需的最短时间,并且能够帮助我们找到项目中的瓶颈点。

本文将介绍关键路径问题的概念和算法分析,并以数据结构课程设计为背景,详细阐述数据结构设计与实现。

二、关键路径问题概述1.定义关键路径指的是项目中最长的一条连续活动序列,这些活动之间没有任何浮动时间,也就是说如果这些活动出现了延误,整个项目都会受到影响。

因此,在项目管理中,我们需要找到这条关键路径,并尽可能地缩短它的长度。

2.应用场景关键路径问题在项目管理中有广泛的应用,例如建筑工程、软件开发等。

在建筑工程中,我们需要确定每个活动的时间和优先级,以便确定项目完成所需的最短时间。

在软件开发中,我们需要确定每个模块的依赖关系和优先级,以便确定项目完成所需的最短时间。

三、关键路径问题算法分析1.活动网络图的表示方法活动网络图是一种图形化表示方法,它可以帮助我们清晰地了解整个项目中各项任务之间的依赖关系。

在活动网络图中,每个任务都表示为一个节点,并且每个任务之间都有一条边表示它们之间的依赖关系。

2.计算活动最早开始时间和最晚开始时间在计算关键路径时,我们需要计算每个活动的最早开始时间和最晚开始时间。

最早开始时间指的是该活动可以开始执行的最早时间,而最晚开始时间指的是该活动必须开始执行的最晚时间。

3.计算活动最早结束时间和最晚结束时间与计算开始时间类似,在计算关键路径时,我们还需要计算每个活动的最早结束时间和最晚结束时间。

最早结束时间指的是该活动可以完成执行的最早时间,而最晚结束时间指的是该活动必须完成执行的最晚时间。

数据结构课程设计实践课程报告

数据结构课程设计实践课程报告

数据结构课程设计实践课程报告一、课程设计背景及目的数据结构作为计算机科学的基础课程之一,是计算机科学和工程领域学习和实践的重要基础。

在现代社会中,数据结构无处不在,对计算机科学和工程的各个领域都有着至关重要的作用。

因此,这门课程的重要性不言而喻。

那么,为了达到课程的目的和效果,必须通过实践来让学生更好地了解数据结构的概念和应用。

实践是促进知识转化和应用的重要手段。

通过实践,学生可以深入地理解数据结构和算法的本质,加深对计算机底层的理解,同时可以更好的发现和解决问题的能力。

二、课程设计模块及内容1.基本数据结构:线性结构(数组、队列、栈)和非线性结构(二叉树、图等)首先,学生需要学习基本的数据结构,包括线性结构和非线性结构。

这些数据结构是计算机科学中最基本的组成部分,是学生熟练掌握数据结构的必修内容。

在这个模块中,学生将学习每个数据结构的基本操作和应用,了解它们之间的差别和联系,以及它们如何与算法共同工作。

2.高级数据结构:树、堆、哈希表和图在掌握基本数据结构后,学生需要学习更高级的数据结构,如树、堆、哈希表和图。

这些数据结构是在实际应用中使用频率较高的数据结构,学生需要深入理解它们的原理和应用场景,以便将它们有效地应用到实际问题中。

3.算法设计在掌握基本和高级数据结构之后,学生将进入算法的设计和实现环节。

在这个模块中,学生将学习常见算法的设计思想和执行步骤,包括排序、查找、字符串匹配和图算法等。

同时,学生需要掌握如何分析算法的效率和复杂度,以优化算法的效率。

4.实践环节在学习完理论知识之后,学生需要进行实践环节以巩固所学知识。

在课程设计实践中,学生将运用所学知识设计和实现一个小型的数据结构,如一个简单的文件系统或一个简单的图像处理程序。

此外,学生还可以将所学知识应用于项目中,如网站开发或数据处理项目等。

三、课程设计实践过程1.学习理论知识首先,学生需要掌握数据结构和算法的理论知识。

在课堂上,老师将讲解数据结构和算法的概念、基本原理和常见操作等,以及如何分析和实现它们。

数据结构课程设计报告

数据结构课程设计报告

数据结构课程设计报告引言:数据结构是计算机科学中一门重要的基础课程,它研究了如何组织和存储数据,以及如何高效地操作和访问数据。

本文将介绍我在数据结构课程设计中的实践和收获。

一、项目背景与需求分析我们的课程设计项目是设计一个图书管理系统,该系统能够实现图书的录入、查询、借阅和归还等功能。

通过这个项目,我们既能够巩固数据结构的知识,又能够提高我们的编程能力。

在进行需求分析时,我们首先明确了系统的功能需求和非功能需求。

功能需求包括图书的录入、查询、借阅和归还等基本操作,非功能需求则包括系统的性能、可靠性和用户友好性等。

二、系统设计与实现1. 数据结构的选择在设计图书管理系统时,我们需要选择合适的数据结构来存储图书的信息。

考虑到图书的数量较大且需要频繁地进行查询和操作,我们选择了哈希表作为存储图书信息的数据结构。

哈希表具有快速的插入和查询操作,能够提高系统的性能。

2. 数据的存储与管理为了实现图书的录入、查询、借阅和归还等功能,我们设计了相应的数据结构和算法。

首先,我们使用哈希表来存储图书的信息,每本图书都有一个惟一的图书编号。

当用户查询图书时,系统会根据图书编号快速地找到对应的图书信息。

当用户借阅或者归还图书时,系统会相应地更新图书的状态。

3. 系统的性能优化为了提高系统的性能,我们采取了一些优化措施。

首先,我们使用了合适的哈希函数来减少哈希冲突的发生。

其次,我们对系统进行了分块处理,将图书按照一定的规则分成多个块,每一个块都有一个独立的哈希表来存储图书的信息。

这样可以减少每次查询时需要扫描的图书数量,提高查询的效率。

三、系统测试与评估在完成系统设计和实现后,我们进行了一系列的测试和评估。

首先,我们进行了功能测试,验证系统是否能够正常地完成图书的录入、查询、借阅和归还等操作。

其次,我们进行了性能测试,测试系统在不同规模的数据集下的响应时间和吞吐量。

最后,我们进行了用户体验测试,邀请一些用户使用系统,并采集他们的反馈意见。

数据结构课程设计报告

数据结构课程设计报告

数据结构课程设计报告设计报告一、项目简介:本项目是一个基于C++语言的数据结构课程设计,旨在通过实践巩固学习的数据结构知识,并提高编程能力和问题解决能力。

二、项目背景:数据结构是计算机科学中非常重要的一门课程,它研究的是数据的组织、存储和操作方法。

通过学习数据结构可以更好地理解和分析各种算法,并能够设计和实现高效的程序。

三、项目目标:本项目的主要目标是设计和实现一些常见的数据结构,包括链表、栈、队列、二叉树、图等。

通过实现这些数据结构,可以进一步加深对其特性和功能的理解,并能够灵活地应用于实际问题的解决。

四、项目内容:本项目主要包括以下几个部分:1. 链表:实现单链表、双链表和循环链表,并实现相关的操作,如插入、删除、查找等。

2. 栈:实现顺序栈和链式栈,并实现相关的操作,如入栈、出栈、判空、判满等。

3. 队列:实现顺序队列和链式队列,并实现相关的操作,如入队、出队、判空、判满等。

4. 二叉树:实现二叉树的创建、遍历(前序、中序、后序)、搜索等操作,并实现相关的应用,如表达式树、堆等。

5. 图:实现邻接矩阵和邻接表两种表示方法,并实现图的创建、深度优先搜索、广度优先搜索等操作,并实现相关的应用,如最小生成树、最短路径等。

6. 其他数据结构:根据实际需要,可以设计和实现其他一些数据结构,如哈希表、二叉搜索树等。

五、项目实施计划:1. 学习和理解数据结构的基本概念和特性。

2. 分析和设计各个数据结构的实现方法和相关操作。

3. 使用C++语言实现各个数据结构,并编写相应的测试程序进行验证。

4. 进行性能测试和功能测试,并进行相关的优化和改进。

5. 编写项目文档,包括设计报告、使用说明等。

六、项目成果:1. 完成了各个数据结构的设计和实现。

2. 实现了相应的测试程序进行验证和功能测试。

3. 编写了项目文档,包括设计报告、使用说明等。

七、项目总结:通过这个数据结构课程设计项目,我深入学习了各种常用数据结构的实现和应用,提高了自己的编程能力和问题解决能力。

数据结构课程设计报告---关键路径

数据结构课程设计报告---关键路径

数据结构课程设计Array报告院系:信息管理学院专业:软件工程目录一、问题的描述二、系统需求及分析1、简要介绍2、需求分析3、概要设计4、详细设计(1)数据结构(2)创建有向图的邻接表(3)计算各事件及活动的相关信息(4)输出有向图的相关信息(5)判断图中是否有回路(6)计算并输出关键活动(7)计算并输出关键路径(8)操作入口三、系统实现四、设计总结五、附件(完整源代码)一、问题的描述:关键路径问题(起评分:85)1、功能:设计一个程序求出完成整项工程至少需要多少时间以及整项工程中的关键活动。

2、数据:自行设计每个活动的前导活动和后续活动以及活动的进行时间,然后依据这些活动的前后次序,画出其网络图,选择存储结构。

3、操作:(1)求工程最短工期;(2)输出关键路径;(3)输出关键活动。

4、要求:界面友好,提示信息完整。

二、系统需求及分析:1、简要介绍:我们通常把计划、施工过程、生产流程、程序流程等都当成一个工程。

工程通常分为若干个称为“活动”的子工程。

完成了这些“活动”,这个工程就可以完成了。

我们通常用AOE-网来表示工程。

AOE-网是一个带权的有向无环图,其中,顶点表示事件(EVENT),弧表示活动,权表示活动持续的时间。

AOE-网可以用来估算工程的完成时间。

他可以使人们了解:(1). 研究某个工程至少需要多少时间?(2). 哪些活动是影响工程进度的关键?由于AOE-网中的有些活动可以并行进行,从开始点到各个顶点,以致从开始点到完成点的有向路径可能不止一条,这些路径的长度也可能不同。

完成不同路径的活动所需的时间虽然不同,但只有各条路径上所有活动都完成了,这个工程才算完成。

因此,完成工程所需的最短时间是从开始点到完成点的最长路径的长度,即在这条路径上的所有活动的持续时间之和.这条路径长度就叫做关键路径(Critical Path)。

关键路径可以很方便的让我们估算出某个工程最短的时间开销,以及这个工程中哪些活动,即哪些项目是主要的,是影响工程进度的关键,从而让我们对工程的实施做出更好的时间安排,并且可以分清主次,抓住核心工程,做到有的放矢。

C++实现关键路径算法课程设计报告

C++实现关键路径算法课程设计报告

有向图的关键路径计算机与软件工程学院课程设计说明书课程名称: 数据结构与算法课程设计课程代码: 题目:年级/专业/班:学生姓名: 学号:开始时间:2013 年 12 月18 日完成时间:2013 年12月 28 日课程设计成绩:学习态度及平时成绩(20)技术水平与实际能力(20)完成情况(20)创新(5)说明书(计算书、图纸、分析报告)撰写质量(35)总分(100)指导教师签名:年月日目录引言 (1)1需求分析 (1)1.1任务与分析 (1)1.2测试数据 (1)2 概要设计 (3)2.1设计思路 (3)2.2层次图 (3)3 详细设计 (4)3.1主函数的实现 (4)3.2数据录入实现 (5)3.3输出图的各顶点和弧的实现 (6)3.4计算各顶点的入度 (7)3.5输出关键路径 (8)4调试分析 (8)5用户使用说明 (9)6测试结果 (9)6.1录入数据 (9)6.2功能实现 (10)6.3测试结论 (11)致谢 (13)参考文献 (14)摘要具有最大路径长度的路径称关键路径,关键路径上的活动称关键活动。

课程设计主要要求求有向图的关键路径。

用领接表存储结构储存有向图。

用深度遍历的方式输出有向图的顶点和弧。

程序实现了存储有向图,输出有向图的各顶点和弧,计算顶点的入度和求有向图的关键路径这四个功能。

用领接表存储结构储存有向图,用深度遍历的方式输出有向图的顶点和弧,用遍历查找的方式计算顶点的入度。

求关键路径时先用拓扑排序函数判断有向图是否有回路,调用求关键活动的函数找到关键路径,最后输出。

关键词:领接表;入度;AOE网;关键路径;有向图的关键路径引言工程有很多的阶段,这些阶段之间有一定的先后关系和自己的时间。

我们可以用图来表示工程,将其输入程序中,可以用程序计算出工程的相关信息,如,工程完成的最短时间,哪些活动会影响工程的进度等。

要解决这些问题就可以用领接表储存图,并计算各个事件和各个阶段的最早发生时间和最晚发生时间,得到关键活动,从而的到关键路径。

数据结构课程设计报告 关键路径的实现

数据结构课程设计报告 关键路径的实现

青岛理工大学数据结构课程设计报告题目:关键路径的实现院(系):计算机工程学院学生姓名:班级:学号:起迄日期: 2014.7.8—2014.7.19指导教师: 张艳一、需求分析1.问题描述找出实际工程中的关键路径,合理安排关键活动的施工顺序。

要求:(1)表示工程的图可以用邻接表或邻接矩阵存储;(2)应能以图形的方式输出图;(3)输出关键路径和关键活动。

2.基本功能(1)用邻接表存储有向图并建立AOE网 CreateGraph();(2)用图形的形式输出有向图Display();(3)输出关键路径和关键活动 SearchMapPath();3.输入输出输入: (1)有向图的顶点数和弧数,都是int型,中间用空格隔开;(2)图中的各个顶点的值,char型;(3)图中弧的权值、起点、终点,都是int型,中间用空格隔开;输出:起点(char)、终点(char) 、最早开始时间(int)、最迟开始时间(int)、差值(int)、是否为关键活动、关键路径。

二、概要设计1.设计思路:(1) 输入图的顶点数和弧数。

(2) 输入这个图中每段弧的起始点及权值。

(3) 用输入的数据建立AOE网。

(4) 用邻接表来存储图的这些信息。

(5) 用CreateGraph( )函数建立AOE图。

(6)用Display()函数输出AOE图。

(7) 用SearchMapPath ( )函数求出最长路径,并输出关键路径。

(8) 编写程序。

2.数据结构设计:(1)逻辑结构采用图状的结构。

图是一种较线性表和树更为复杂的数据结构。

在线性表中,数据元素之间仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继;在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素(即其孩子结点)相关,但只能和上一层中一个元素(即其双亲结点)相关;而在图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。

数据结构课程设计报告

数据结构课程设计报告

数据结构课程设计报告1. 引言在计算机科学领域中,数据结构是指组织和存储数据的方式,以便于使用和管理。

数据结构的设计和实现对于编程任务的效率和性能具有重要的影响。

本篇报告将针对我们在数据结构课程中的设计项目进行说明和总结。

2. 选题背景我们的选题是实现一个图书馆管理系统,旨在帮助图书馆更好地管理图书借阅和归还的流程。

这个系统涉及到图书馆的各个方面,包括图书的分类、借阅记录、读者信息等。

通过实现该系统,我们希望进一步理解和应用数据结构的概念和方法。

3. 数据结构的选择为了实现图书馆管理系统,我们需要选择合适的数据结构来组织和存储相关数据。

在该系统中,我们选择了以下几种数据结构:- 数组:用于存储图书的基本信息,如书名、作者、出版社等。

数组的随机访问特性使得可以快速地获取某本书的信息。

- 链表:用于存储读者的信息和借阅记录。

链表的插入和删除操作比较高效,符合图书馆管理系统中动态变化的需求。

- 栈:用于实现借书还书的操作。

栈的后进先出特性使得操作的顺序可以得到有效的控制。

4. 系统功能我们的系统包括以下功能:- 图书信息管理:包括添加图书、删除图书、更新图书信息等功能。

通过数组和链表的结合使用,我们可以实现对图书信息的动态管理。

- 读者信息管理:包括添加读者、删除读者、查询读者信息等功能。

同样使用链表结构,可以快速记录和查询读者的信息。

- 借阅和归还处理:通过栈的结构,实现借阅图书和归还图书的操作。

栈的先进后出特性确保了操作的顺序合理且安全。

- 查询功能:可以根据图书的编号、作者、出版社等条件进行图书和读者的查询操作。

通过数组和链表的结合,实现了高效的查询功能。

5. 实现过程与挑战在实现该系统的过程中,我们遇到了许多挑战。

其中一个主要的挑战是如何处理并发操作,例如同时有多个读者同时借阅图书或者查询图书的情况。

我们通过引入互斥锁和条件变量等机制,确保了数据的一致性和正确性。

6. 总结与展望通过本次的数据结构课程设计项目,我们深入了解了数据结构的应用和实践。

数据结构课程设计(论文)--关键路径问题

数据结构课程设计(论文)--关键路径问题

数据结构课程设计(论文)任务书计算机与信息技术学院计算机科学与技术专业级计科一班班课程设计( 论文) 题目关键路径问题1.本课程设计的目的( 1 )巩固和加深对数据结构基本知识的理解,提高综合运用课程知识的能力。

( 2 )使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。

( 3 )使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。

2.课程设计的任务及要求1)基本要求:( 1 )系统设计要能完成题目所要求的功能;( 2 )编程简练,可用,尽可能的使系统的功能更加完善和全面;( 3 )说明书、流程图要清楚;( 4 )提高学生的论文写作能力;( 5 )特别要求自己独立完成;( 6 )要同时上交纸质论文和源程序。

2)创新要求:在基本要求达到后,可进行创新设计,如改善算法性能、友好的人机界面。

3)课程设计论文编写要求( 1 )要按照学年论文的规范写作课程设计论文;( 2 )论文包括需求分析、概要设计、详细设计(源代码)、调试分析及测试、总结、参考文献、附录等。

学生签名:学号:2012 年 5 月 22 日目录一、需求分析 (1)二、概要设计 (3)三、详细设计 (5)四、调试分析及测试 (8)五、总结 (12)参考文献 (13)附录 (13)一、需求分析通常把计划、施工过程、生产流程、程序流程的都当成一个工程。

除了很小的工程外、一般都把工程分为若干个叫做“活动”的子工程。

完成了这些“活动”的子工程,这个工程就可以完成了。

通常我们用有向图表示一个工程。

在这种有向图中,用顶点表示活动,用有向边。

<Vi,V j>表示活动 Vi 必须先于活动 V j 进行。

如果在无有向环的带权有向图中用有向边表示一个工程中的各项活动( A C TIV ITY ),用有向边上的权值表示活动的持续时间( DU R ATION),用顶点表示事件( EV ENT ),则这种的有向图叫做用边表示活动的网络,简称A OE( active on edg es)网络。

关键路径-数据结构课程设计报告

关键路径-数据结构课程设计报告

课程设计报告a)需求分析GreateGraphic():构建AOE网,for(scanf())逐个对图节点信息(包括两邻接点,权值)输入接收,并与分配存储空间。

SearchMapPath()函数:寻找关键路径,构建栈用与存储拓扑排序序列,求得每个节点的相应最早发生时间,最迟完成时间,关键事件的求取,并输出关键路径。

Seekkeyroot()函数:先使用库函数system(‚cls‛)清屏,scanf()对节点数的接收,分配相应的存储空间,调用CreateGraphic()函数和SearchMapPath()函数。

Main()函数:输出主屏信息,判断进入关键路径的程序条件,switch()对条件进行选择。

b)概要设计(1)数据结构typedef struct node{int adjvex;int dut;struct node *next;}edgenode;typedef struct{int projectname;int id;edgenode *lind;}vexnode;(2)程序流程图c)详细设计主函数switch()对条件进行选择判断,进入关键路径的程序,然后对结点数的接收,分配相应的存储空间,构建AOE-网,逐个对图结点信息(包括俩邻接点,权值)输入接收,并与分配存储空间。

寻找关键路径:构建栈用与存储拓扑排序序列,求得每个接点的相应最早发生时间,最迟完成时间,关键事件的求取,并输出关键路径。

d)程序调试(1):C:\Documents and Settings\Administrator\桌面\3\3.cpp(45) : error C2065: 'P' : undeclared identifier (2)C:\Documents and Settings\Administrator\桌面\3\3.cpp(45) : error C2227: left of '->adjvex' must point to class/struct/union(3)C:\Documents and Settings\Administrator\桌面\3\3.cpp(47) : error C2065: 'id' : undeclared identifier 经过仔细的检查,发现45行的‚P‛为大写,我改为小写‘p’以后,运行后只剩下了第三个错误。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

青岛理工大学数据结构课程设计报告题目:关键路径的实现院(系):计算机工程学院学生姓名:班级:学号:起迄日期: 2014.7.8—2014.7.19指导教师: 张艳一、需求分析1.问题描述找出实际工程中的关键路径,合理安排关键活动的施工顺序。

要求:(1)表示工程的图可以用邻接表或邻接矩阵存储;(2)应能以图形的方式输出图;(3)输出关键路径和关键活动。

2.基本功能(1)用邻接表存储有向图并建立AOE网 CreateGraph();(2)用图形的形式输出有向图Display();(3)输出关键路径和关键活动 SearchMapPath();3.输入输出输入: (1)有向图的顶点数和弧数,都是int型,中间用空格隔开;(2)图中的各个顶点的值,char型;(3)图中弧的权值、起点、终点,都是int型,中间用空格隔开;输出:起点(char)、终点(char) 、最早开始时间(int)、最迟开始时间(int)、差值(int)、是否为关键活动、关键路径。

二、概要设计1.设计思路:(1) 输入图的顶点数和弧数。

(2) 输入这个图中每段弧的起始点及权值。

(3) 用输入的数据建立AOE网。

(4) 用邻接表来存储图的这些信息。

(5) 用CreateGraph( )函数建立AOE图。

(6)用Display()函数输出AOE图。

(7) 用SearchMapPath ( )函数求出最长路径,并输出关键路径。

(8) 编写程序。

2.数据结构设计:(1)逻辑结构采用图状的结构。

图是一种较线性表和树更为复杂的数据结构。

在线性表中,数据元素之间仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继;在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素(即其孩子结点)相关,但只能和上一层中一个元素(即其双亲结点)相关;而在图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。

而由于本程序的操作对象是有向图,所以必须采用图状的结构。

(2)存储结构采用链式的结构。

由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位置来表示元素之间的关系,即图没有顺序映象的存储结构,因此采用链式的存储结构。

(3)抽象数据类型图的定义如下: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>的意义或信息}基本操作P:CreateGraph(&G,V,VR );初始条件:V是图的顶点集,VR是图中弧的集合。

操作结果:按V和VR的定义构造图G。

SearchMapPath (&G,V,VR );初始条件:V是图的顶点集,VR是图中弧的集合。

操作结果:求出最长路径,并输出关键路径。

Display(&G,V,VR);初始条件:V是图的顶点集,VR是图中弧的集合。

操作结果:以图形的形式输出图。

}ADT Graph3.软件结构设计:三、详细设计1.定义程序中所有用到的数据及其数据结构:邻接表的存储单元:typedef struct node {int adjvex;int w;struct node *nextedge;}edgenode;表头结点:typedef struct {char data;int id;int x,y; //顶点的横坐标、纵坐标 edgenode *firstedge;}vexnode;2.主函数和其他函数的伪码算法:主函数:void main(){ int vexnumber,arcnumber;printf("请输入这个图中的节点数和弧数:");scanf("%d %d",&vexnumber,&arcnumber);vexnode* Graph=(vexnode*)malloc(vexnumber*sizeof(vexnode));CreateGraph(Graph,vexnumber,arcnumber);SearchMapPath(Graph,vexnumber,arcnumber);}建立AOE网函数:void CreateGraph(vexnode* Graph,int vexnumber,int arcnumber){ int begin,end,duttem;char ch;edgenode *p;//输入顶点信息存储在顶点表中,并初始化该顶点的便表。

for(int i=0;i<vexnumber;i++){Graph[i].id =0;Graph[i].firstedge =NULL;}//输入边所依附的两个顶点的序号i和j然后生成新的邻接点序号为j的//边表结点,将该结点插入到第i个表头部。

printf("请输入这个图中的各个顶点的值:\n");for(i=0;i<vexnumber;i++){scanf("%s",&ch);Graph[i].data=ch;}printf("请输入图中弧的权值、起点、终点:(中间用空格隔开)\n");for(int k=0;k<arcnumber;k++){scanf("%d %d %d",&duttem,&begin,&end);p=(edgenode*)malloc(sizeof(edgenode));p->adjvex =end-1;p->w =duttem;Graph[end-1].id ++;p->nextedge =Graph[begin-1].firstedge ;Graph[begin-1].firstedge =p;}}显示有向图函数:void Display(vexnode* Graph,int vexnumber,int arcnumber) {int i;int arw[6];edgenode *p;initgraph(400, 600);for(i=0;i<vexnumber;i++){if(i%3==0||i==0){outtextxy(100,50*(i+1), Graph[i].data);Graph[i].x=100;Graph[i].y=50*(i+1);}if(i%3==1||i==1){outtextxy(10,50*(i+1), Graph[i].data);Graph[i].x=10;Graph[i].y=50*(i+1);}if(i%3==2||i==2){outtextxy(200,50*i, Graph[i].data);Graph[i].x=200;Graph[i].y=50*i;}}for(i=0;i<vexnumber;i++){p=Graph[i].firstedge;while(p){line(Graph[i].x,Graph[i].y,Graph[p->adjvex].x,Graph[p->adjvex].y) ;outtextxy((Graph[i].x+Graph[p->adjvex].x)/2,(Graph[i].y+Graph[p-> adjvex].y)/2,p->w+48);arw[0]=Graph[p->adjvex].x+5;arw[1]=Graph[p->adjvex].y-10;arw[2]=Graph[p->adjvex].x;arw[3]=Graph[p->adjvex].y;arw[4]=Graph[p->adjvex].x+5;arw[5]=Graph[p->adjvex].y+10;drawpoly(3,arw);p=p->nextedge;}}getch();closegraph();}求解关键路径函数:int SearchMapPath(vexnode* Graph,int vexnumber,int arcnumber) {int totaltime=0;int m=0;int i,j,k,t;char sv[100];int front,rear;int *topology_queue,*vl,*ve,*el,*ee;front=rear=-1; t=0;topology_queue=(int*)malloc(vexnumber*sizeof(int)); vl=(int*)malloc(vexnumber*sizeof(int)); ve=(int*)malloc(vexnumber*sizeof(int)); el=(int*)malloc(arcnumber*sizeof(int));ee=(int*)malloc(arcnumber*sizeof(int));edgenode *p;for(i=0;i<vexnumber;i++) ve[i]=0;for(i=0;i<vexnumber;i++){if(Graph[i].id==0){topology_queue[++rear]=i;m++;}}while(front!=rear){front++;j=topology_queue[front];m++;p=Graph[j].firstedge ;while(p){k=p->adjvex;Graph[k].id --;if(ve[j]+p->w >ve[k])ve[k]=ve[j]+p->w ;if(Graph[k].id ==0) topology_queue[++rear]=k;p=p->nextedge ;}}if(m<vexnumber){printf("\n该图中存在回路,不可计算出关键路径!\n");return 0;}totaltime=ve[vexnumber-1];for(i=0;i<vexnumber;i++)vl[i]=totaltime;for(i=vexnumber-2;i>=0;i--){j=topology_queue[i];p=Graph[j].firstedge;while(p){k=p->adjvex ;if((vl[k]-p->w )<vl[j])vl[j]=vl[k]-p->w;p=p->nextedge;}}printf("| 起点 | 终点 | 最早开始时间 | 最迟开始时间 | 差值 | \n"); i=0;for(j=0;j<vexnumber;j++){p=Graph[j].firstedge;while(p){k=p->adjvex ;ee[++i]=ve[j];el[i]=vl[k]-p->w;printf("| %4c | %4c | %12d | %12d | %4d |",Graph[j].data ,Graph[k].data ,ee[i],el[i],el[i]-ee[i]);if(el[i]==ee[i]){printf(" 是关键活动 ");sv[t]=Graph[j].data;t++;}printf("\n");p=p->nextedge;}}printf("关键路径为:");sv[t]=Graph[vexnumber-1].data;for(i=0;i<=t;i++){ printf("%c",sv[i]);if(sv[i]!=Graph[vexnumber-1].data) printf("→");}printf("\n");return 1;}3.主要函数的程序流程图:图2 CreateGraph()函数流程图图3 Display()函数流程图图4 SearchMapPath()函数流程图4. 画出函数之间的调用关系图:四、调试分析1.实际完成的情况说明:本程序完成的功能是:显示用户从键盘输入的有向图,并计算出其关键路径。

相关文档
最新文档