数据结构-关键路径实验报告

合集下载

求关键路径设计报告 数据结构课程设计毕业设计(论文)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进行拓扑排序。

数据结构实验报告_实验报告_

数据结构实验报告_实验报告_

数据结构实验报告想必学计算机专业的同学都知道数据结构是一门比较重要的课程,那么,下面是小编给大家整理收集的数据结构实验报告,供大家阅读参考。

数据结构实验报告1一、实验目的及要求1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们。

本实验训练的要点是“栈”和“队列”的观点;二、实验内容1) 利用栈,实现数制转换。

2) 利用栈,实现任一个表达式中的语法检查(选做)。

3) 编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列);三、实验流程、操作步骤或核心代码、算法片段顺序栈:Status InitStack(SqStack &S){S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}Status DestoryStack(SqStack &S){free(S.base);return OK;}Status ClearStack(SqStack &S){S.top=S.base;return OK;}Status StackEmpty(SqStack S){if(S.base==S.top)return OK;return ERROR;}int StackLength(SqStack S){return S.top-S.base;}Status GetTop(SqStack S,ElemType &e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base) return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;Status Push(SqStack &S,ElemType e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;}Status Pop(SqStack &S,ElemType &e){if(S.top==S.base)return ERROR;e=*--S.top;return OK;}Status StackTraverse(SqStack S){ElemType *p;p=(ElemType *)malloc(sizeof(ElemType));if(!p) return ERROR;p=S.top;while(p!=S.base)//S.top上面一个...p--;printf("%d ",*p);}return OK;}Status Compare(SqStack &S){int flag,TURE=OK,FALSE=ERROR; ElemType e,x;InitStack(S);flag=OK;printf("请输入要进栈或出栈的元素:"); while((x= getchar)!='#'&&flag) {switch (x){case '(':case '[':case '{':if(Push(S,x)==OK)printf("括号匹配成功!\n\n"); break;case ')':if(Pop(S,e)==ERROR || e!='('){printf("没有满足条件\n");flag=FALSE;}break;case ']':if ( Pop(S,e)==ERROR || e!='[')flag=FALSE;break;case '}':if ( Pop(S,e)==ERROR || e!='{')flag=FALSE;break;}}if (flag && x=='#' && StackEmpty(S)) return OK;elsereturn ERROR;}链队列:Status InitQueue(LinkQueue &Q) {Q.front =Q.rear=(QueuePtr)malloc(sizeof(QNode));if (!Q.front) return ERROR;Q.front->next = NULL;return OK;}Status DestoryQueue(LinkQueue &Q) {while(Q.front){Q.rear=Q.front->next;free(Q.front);Q.front=Q.rear;}return OK;}Status QueueEmpty(LinkQueue &Q){if(Q.front->next==NULL)return OK;return ERROR;}Status QueueLength(LinkQueue Q){int i=0;QueuePtr p,q;p=Q.front;while(p->next){i++;p=Q.front;q=p->next;p=q;}return i;}Status GetHead(LinkQueue Q,ElemType &e) {QueuePtr p;p=Q.front->next;if(!p)return ERROR;e=p->data;return e;}Status ClearQueue(LinkQueue &Q){QueuePtr p;while(Q.front->next ){p=Q.front->next;free(Q.front);Q.front=p;}Q.front->next=NULL;Q.rear->next=NULL;return OK;}Status EnQueue(LinkQueue &Q,ElemType e) {QueuePtr p;p=(QueuePtr)malloc(sizeof (QNode));if(!p)return ERROR;p->data=e;p->next=NULL;Q.rear->next = p;Q.rear=p; //p->next 为空return OK;}Status DeQueue(LinkQueue &Q,ElemType &e) {QueuePtr p;if (Q.front == Q.rear)return ERROR;p = Q.front->next;e = p->data;Q.front->next = p->next;if (Q.rear == p)Q.rear = Q.front; //只有一个元素时(不存在指向尾指针) free (p);return OK;}Status QueueTraverse(LinkQueue Q){QueuePtr p,q;if( QueueEmpty(Q)==OK){printf("这是一个空队列!\n");return ERROR;}p=Q.front->next;while(p){q=p;printf("%d<-\n",q->data);q=p->next;p=q;}return OK;}循环队列:Status InitQueue(SqQueue &Q){Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType)); if(!Q.base)exit(OWERFLOW);Q.front=Q.rear=0;return OK;}Status EnQueue(SqQueue &Q,QElemType e){if((Q.rear+1)%MAXQSIZE==Q.front)return ERROR;Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXQSIZE;return OK;}Status DeQueue(SqQueue &Q,QElemType &e){if(Q.front==Q.rear)return ERROR;e=Q.base[Q.front];Q.front=(Q.front+1)%MAXQSIZE;return OK;}int QueueLength(SqQueue Q){return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;}Status DestoryQueue(SqQueue &Q){free(Q.base);return OK;}Status QueueEmpty(SqQueue Q) //判空{if(Q.front ==Q.rear)return OK;return ERROR;}Status QueueTraverse(SqQueue Q){if(Q.front==Q.rear)printf("这是一个空队列!");while(Q.front%MAXQSIZE!=Q.rear){printf("%d<- ",Q.base[Q.front]);Q.front++;}return OK;}数据结构实验报告2一.实验内容:实现哈夫曼编码的生成算法。

数据结构课程实验报告

数据结构课程实验报告

数据结构课程实验报告一、实验目的数据结构是计算机科学中一门重要的基础课程,通过本次实验,旨在加深对数据结构基本概念和算法的理解,提高编程能力和解决实际问题的能力。

具体目标包括:1、掌握常见数据结构(如数组、链表、栈、队列、树、图等)的基本操作和实现方法。

2、学会运用数据结构解决实际问题,培养算法设计和分析的能力。

3、提高程序设计的规范性和可读性,培养良好的编程习惯。

二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。

三、实验内容本次实验共包括以下几个部分:(一)线性表的实现与操作1、顺序表的实现定义一个顺序表结构体,包含数据元素数组和表的长度。

实现顺序表的初始化、插入、删除、查找等基本操作。

2、链表的实现定义链表节点结构体,包含数据域和指针域。

实现链表的创建、插入、删除、遍历等操作。

(二)栈和队列的实现与应用1、栈的实现采用顺序存储或链式存储实现栈。

实现栈的入栈、出栈、栈顶元素获取等操作,并应用于表达式求值。

2、队列的实现用循环队列或链式队列实现队列。

实现队列的入队、出队、队头元素获取等操作,应用于模拟排队系统。

(三)树的基本操作与遍历1、二叉树的实现定义二叉树节点结构体,包含数据域、左子树指针和右子树指针。

实现二叉树的创建、插入、删除节点等操作。

2、二叉树的遍历分别实现前序遍历、中序遍历和后序遍历,并输出遍历结果。

(四)图的表示与遍历1、邻接矩阵和邻接表表示图定义图的结构体,使用邻接矩阵和邻接表两种方式存储图的信息。

实现图的创建、添加边等操作。

2、图的遍历分别用深度优先搜索(DFS)和广度优先搜索(BFS)遍历图,并输出遍历序列。

四、实验步骤(一)线性表的实现与操作1、顺序表的实现首先,定义了一个结构体`SeqList` 来表示顺序表,其中包含一个整数数组`data` 用于存储数据元素,以及一个整数`length` 表示表的当前长度。

在初始化函数`InitSeqList` 中,将表的长度初始化为 0,并分配一定的存储空间给数组。

数据结构程序设计实验~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。

关键路径实验报告

关键路径实验报告
}
}
cout<<"关键路径为:"<<endl;
for(j = 0;j<algraph.vexnum;j++)
//求ee el和关键活动(同上)
{
for(p = algraph.vertices[j].firstarc;p;p = p->nextarc)
{
k = p->adjvex;
dut = *(p->info);
2、算法设计
源程序:
template <class T>
bool ALGraph<T>::TopologicalOrder(SeqStack<int> &t)
//求各顶点事件的最早发生时间ve
{
int j,k,count,indegree[MAX_VERTEX_NUM];
SeqStack<int> s;
count = 0;
for(j = 0;j<algraph.vexnum;j++)
{
ve[j] = 0;
}
while(!s.IsEmpty())
//S非空
{
s.Pop(j);
t.Push(j); count++; //j号顶点入T栈并计数
for(p = algraph.vertices[j].firstarc;p;p = p->nextarc)
1)画出运行程序中的图。
aቤተ መጻሕፍቲ ባይዱ
b
c
1 1d
e2
2)分析辅助变量的值。
答:j k dut ee e1 tag

《关键路径》实验报告

《关键路径》实验报告

在的边。

主函数:main()
建图函数:CreateGraph ()

求解关键路径函数:CriticalPath ()


int Criticalpath(ALGraph G){ /* G 为有向网,输出 G 的各项关键活动。*/
InitStack(T); /*建立用于产生拓扑逆序的栈 T*/ if (! TopologicalOrder (G,T) )
中中 T中中中中
j中中中中中中中
从 Vl(n)=Ve(n)开始向后递推
Vl(i) Min{Vl( j) dut( i, j )}, i, j S,1 i n 1 j
中中 S中中中中
i中中中中中中中
程序功能:根据输入的图的信息,能够建立 AOE-网,并能够输出关键路径所
e = ve [j]; l = vl [k] - dut;
tag = (e= =l) ? ‘*’:’’ ;
printf ( j,k,dut,e,l,tag ); /*输出关键活动*/ }
return 1; /*求出关键活动后返回 1*/ } /*Criticalpath*/
测试用例 1:如下图(顶点数和边数:9,11)

关键活动——关键路径上的活动,即 l(i)=e(i)的活动

设活动 ai 用弧<j,k>表示,其持续时间记为:dut(<j,k>)。则有:
e(i)=Ve(j)

l(i)=Vl(k)-dut(<j,k>)
如何求 Ve(j)和 Vl(j)?

从 Ve(1)=0 开始向前递推
Ve( j) Max{Ve(i) dut( i, j )}, i, j T ,2 j n i

数据结构-关键路径和拓扑排序

数据结构-关键路径和拓扑排序

《数据结构》课程设计报告设计题目:关键路径与拓扑排序姓名:_____ __李崇远___ _____学号:________211415059________专业:_____ _物联网工程___ ___院系: 计科学院_________班级:____ __1406___ ____指导教师:_____ _王江涛___ _______2016年 1月 8日摘要关键路径是计划项目活动中用到的一种算数方法。

对于有效的计划管理而言,关键路径是一种十分重要的工具。

关键路径通常是决定项目工期的进度活动序列,很小的浮动也可能影响整个项目。

拓扑排序常用来确定一个依赖关系集中,事物发生的顺序,可用于计算项目的进行顺序,但顺序并不唯一。

关键字:关键路径拓扑排序AbstractCritical Path is an arithmetic method used in project activities.For the purposes of effective program management, critical Path is a very important tool.Critical path schedule activities usually sequence determines the duration of the project, small float can also affect the entire project.Topological Order used to determine a dependency set, the order of things happen, the order can be used to calculate the project, but the order is not unique.Keywords:Critical Path, Topological Order目录目录一、问题描述(内容格式参考下面的描述,以下类似) (4)二、需求分析 (4)三、概要设计 (4)四、数据结构设计 (4)五、算法设计 (5)1、算法分析(必须要用语言进行描述) (5)2、算法实现 (5)六、程序测试与实现 (6)1、函数之间的调用关系 (6)2、主程序 (6)3、测试数据 (6)4、测试结果 (6)七、调试分析 (6)八、遇到的问题及解决办法 (6)九、心得体会 (6)一、问题描述题目内容:通过邻接表完成AOE网的创建,并输出图的拓扑序列和关键路径。

关键路径算法 报告

关键路径算法 报告

数据结构课程设计报告题目:关键路径算法院(系):计算机工程学院专业:计算机科学与技术班级:嵌入式1091学生:吕帅指导教师:寇海洲孙成富邱军林殷路2010年12月目录一、设计目的 (3)二、设计内容 (3)三、程序设计步骤 (4)四、调试分析 (12)五、测试结果 (12)六、课程设计小结 (16)一、设计目的1、能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。

2、提高程序设计和调试能力。

学生通过上机实习,验证自己设计的算法的正确性。

学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。

3、初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。

4、训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

5、培养根据选题需要选择学习书籍,查阅文献资料的自学能力。

二、设计内容1、系统名称:关键路径算法AOE网(即边表示活动的网络),在某些工程估算方面非常有用。

它可以使人们了解:(1)研究某个工程至少需要多少时间?(2)哪些活动是影响工程进度的关键? 在AOE网络中,从源点到汇点的有向路径可能不止一条,但只有各条路径上所有活动都完成了,这个工程才算完成。

因此,完成整个工程所需的时间取决于从源点到汇点的最长路径长度,即在这条路径上所有活动的持续时间之和,这条路径就叫做关键路径(critical path)。

2、要求:1 以某一工程为蓝本,采用图的结构表示实际的工程计划时间。

2 调查并分析和预测这个工程计划每个阶段的时间。

3 用调查的结果建立AOE网,并用图的形式表示。

4 用CreateGraphic ()函数建立图的邻接表存储结构,能够输入图的顶点和边的信息,并存储到相应存储结构中。

5 用SearchMaxPath()函数求出最大路径,并打印出关键路径。

数据结构课程实验报告

数据结构课程实验报告

数据结构课程实验报告目录1. 实验简介1.1 实验背景1.2 实验目的1.3 实验内容2. 实验方法2.1 数据结构选择2.2 算法设计2.3 程序实现3. 实验结果分析3.1 数据结构性能分析3.2 算法效率比较3.3 实验结论4. 实验总结1. 实验简介1.1 实验背景本实验是数据结构课程的一次实践性操作,旨在帮助学生加深对数据结构的理解和运用。

1.2 实验目的通过本实验,学生将学会如何选择合适的数据结构来解决特定问题,了解数据结构与算法设计的关系并能将其应用到实际问题中。

1.3 实验内容本实验将涉及对一些经典数据结构的使用,如链表、栈、队列等,并结合具体问题进行算法设计和实现。

2. 实验方法2.1 数据结构选择在实验过程中,需要根据具体问题选择合适的数据结构,比如针对需要频繁插入删除操作的情况可选择链表。

2.2 算法设计针对每个问题,需要设计相应的算法来实现功能,要考虑算法的效率和实际应用情况。

2.3 程序实现根据算法设计,编写相应的程序来实现功能,并进行调试测试确保程序能够正确运行。

3. 实验结果分析3.1 数据结构性能分析在实验过程中,可以通过对不同数据结构的使用进行性能分析,如时间复杂度和空间复杂度等,以便选择最优的数据结构。

3.2 算法效率比较实验完成后,可以对不同算法在同一数据结构下的效率进行比较分析,找出最优算法。

3.3 实验结论根据实验结果分析,得出结论并总结经验教训,为后续的数据结构和算法设计提供参考。

4. 实验总结通过本次实验,学生将对数据结构与算法设计有更深入的了解,并能将所学知识应用到实际问题中,提高自己的实践能力和解决问题的能力。

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

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

数据结构课程设计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网;关键路径;有向图的关键路径引言工程有很多的阶段,这些阶段之间有一定的先后关系和自己的时间。

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

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

数据结构实验报告

数据结构实验报告

数据结构实验报告一、实验目的数据结构是计算机科学中的重要基础课程,通过实验可以更深入地理解和掌握数据结构的概念、原理和应用。

本次实验的主要目的包括:1、熟悉常见的数据结构,如链表、栈、队列、树和图等。

2、掌握数据结构的基本操作,如创建、插入、删除、遍历等。

3、提高编程能力和解决实际问题的能力,能够运用合适的数据结构解决具体的问题。

二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。

三、实验内容1、链表的实现与操作单向链表的创建、插入和删除节点。

双向链表的实现和基本操作。

循环链表的特点和应用。

2、栈和队列的实现栈的后进先出特性,实现入栈和出栈操作。

队列的先进先出原则,完成入队和出队功能。

3、树的操作二叉树的创建、遍历(前序、中序、后序)。

二叉搜索树的插入、查找和删除操作。

4、图的表示与遍历邻接矩阵和邻接表表示图。

深度优先搜索和广度优先搜索算法的实现。

四、实验步骤及结果1、链表的实现与操作单向链表:首先,定义了链表节点的结构体,包含数据域和指向下一个节点的指针域。

通过创建链表头节点,并使用循环依次插入新节点,实现了链表的创建。

插入节点时,根据指定位置找到插入点的前一个节点,然后修改指针完成插入操作。

删除节点时,同样找到要删除节点的前一个节点,修改指针完成删除。

实验结果:成功创建、插入和删除了单向链表的节点,并正确输出了链表的内容。

双向链表:双向链表节点结构体增加了指向前一个节点的指针。

创建、插入和删除操作需要同时维护前后两个方向的指针。

实验结果:双向链表的各项操作均正常,能够双向遍历链表。

循环链表:使链表的尾节点指向头节点,形成循环。

在操作时需要特别注意循环的边界条件。

实验结果:成功实现了循环链表的创建和遍历。

2、栈和队列的实现栈:使用数组或链表来实现栈。

入栈操作将元素添加到栈顶,出栈操作取出栈顶元素。

实验结果:能够正确进行入栈和出栈操作,验证了栈的后进先出特性。

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

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

青岛理工大学数据结构课程设计报告题目:关键路径的实现院(系):计算机工程学院学生姓名:班级:学号:起迄日期: 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)逻辑结构采用图状的结构。

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

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

关键路径的查找实验报告

关键路径的查找实验报告

中国矿业大学矿业工程学院实验报告课程名称计算机软件设计基础姓名 xxxx 班级采矿10-8班学号 xxxxx 日期 2012年10月成绩教师 xxxx3.2算法步骤:(1)输入e条弧<j,k>,建立AOE网的存储结构。

(2)从源点v1出发,令ve(1)=0,求ve(j),2<=j<=n。

(3)从汇点vn出发,令vl(n)=ve(n),求vl(i) 1<=i<=n-1。

(4)根据各顶点的ve和vl值,求每条弧s(活动)的最早开始时间e(s)和最晚开始时间l(s),其中e(s)=l(s)的为关键活动。

总结首先,关于程序方面,我发现即使对设计思路有了眉目,知道了所要用到的数据结构、用邻接表来存储AOE-网、建立栈来求拓扑序列、输出的拓扑序列的个数少于节点数则有回路等等,要把这些方法写成函数代码,其实还是一件非常不容易的事情。

再加上要完善设计思路,构造整个程序框架在内,都是一件工作量非常大的工作。

在处理程序代码的时候,有两个问题始终解决不了。

一是程序输入时只能输入整形数据,而非整形的输入则会导致程序异常停止,但是因为整形的输入方式已贯穿整个程序,若要修改只能另外重做整个程序,所以暂不考虑修改,而打算做一个判错系统,判断若非整形的输入则报错;二是第一种错误的解决方案未能成功实行,于网路上搜索到了几种判断是否为整形数据的程序代码,但将其修改融合到求关键路径的程序中,虽然没有错误可以运行,但是却不能正确的报错。

于是,在尝试多种方案却仍不成功的前提下,我只好选择加上提示语,即:printf("请输入某项目的信息,并请用整形数字表示(格式:弧头,弧尾,权值):\n");printf("例如:输入1,2,4 即代表结点1与4之间的活动需要4个时间单位。

\n");这是这次课程设计中最大的两个遗憾。

不过在操作界面的人性化上,我倒尽可能的做得很完善,无论从美观角度还是方便清楚操作,都实行了非常人性化的方式。

数据库关键路径实验报告

数据库关键路径实验报告

成都信息工程学院计算机系课程实验报告一【上机实验目的】对有向图的拓扑排序和关键路径更加了解以及更好的应用它二【实验环境】PC机每人1台在Visual C++环境下测试三【上机实验内容】.给定一图,在其拓朴排序的基础上,求关键路径,要求以图形界面呈现关键路径。

四【上机调试程序流程图】(注:可打印)五【上机调试中出现的错误信息、错误原因及解决办法】犯的错误1.在写构建图这个子函数时,初始数据的时候有点问题,本来想用文件的,但是对于文件用的不是很熟悉,然后就利用了二维数组来存放数据。

2.就是在画图形界面的时候,让关键路径以另外的颜色出现时候出现了问题。

解决方法是找到个最早时间和最迟时间相等就把顶点和终点赋值给相应的顶点,再进行颜色的改变。

六【上机调试后的源程序及还存在的问题】(注:源程序可打印)#include <graphics.h>#include<iostream>using namespace std;#define MAX_VEXTEX_NUM 20#define M 20#define MaxLen 1000 //最大长度#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define OK 1#define ERROR 0#define OVERFLOW -1typedef int SElemType;typedef int VertexType;typedef int VRType;typedef int InfoType;typedef struct ArcNode{int adjvex; // 该弧所指向的顶点的位置struct ArcNode *nextarc;// 指向下一条弧的指针InfoType info; // 该弧相关信息的指针}ArcNode;typedef struct VNode{VertexType data;// 顶点信息ArcNode *firstarc;// 指向第一条依附该顶点的弧}VNode,AdjList[MAX_VEXTEX_NUM];typedef struct{AdjList vertices;int vexnum, arcnum;}ALGraph;typedef struct SqStack{SElemType *base;SElemType *top;int stacksize;}SqStack;class point //画界面{public:point(int x,int y):m_x(x),m_y(y){}point(){}int x(){return m_x;}int y(){return m_y;}point operator+(point p){return point(m_x+p.x(),m_y+p.y());}point operator/(int i){return point(m_x/i,m_y/i);}private:int m_x;int m_y;};int g_r=25;int g_height=400;int g_width=500;point g_pos[9];void paintmain(ALGraph &G);void line(point a,point b){line(a.x(),a.y(),b.x(),b.y());}void fillcircle(point p,int r){fillellipse(p.x(),p.y(),r,r);}void outtext(point p,char* str){outtextxy(p.x(),p.y(),str);} //界面void InitStack(SqStack &S)//初始化栈{S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base)exit (OVERFLOW);S.top=S.base;S.stacksize=STACK_INIT_SIZE;}int Pop(SqStack &S,SElemType &e)//出栈操作{if(S.top==S.base)return ERROR;e=*--S.top;return OK;}int Push(SqStack &S,SElemType e)//人栈操作{if(S.top-S.base>=S.stacksize){S.base = (SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));if(!S.base)exit(OVERFLOW);S.top = S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;}int StackEmpty(SqStack S)//判栈是否为空{if(S.top==S.base)return OK;elsereturn ERROR;}int CreatALGraph(ALGraph &G)//构建图{ArcNode *p;int i,j, k,info1;int a[11][3]={{1,2,6},{1,3,4},{1,4,5},{2,5,1},{3,5,1},{4,6,2},{5,7,9},{5,8,7},{6,8,4},{7,9,2},{8,9,4}};G.vexnum=9;G.arcnum=11;for (i=1;i<=G.vexnum;i++){G.vertices[i].data=i;G.vertices[i].firstarc=NULL;}for(k=0;k<G.arcnum;k++){i=a[k][0];j=a[k][1];info1=a[k][2];p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=j;p->info=info1;p->nextarc=G.vertices[i].firstarc;G.vertices[i].firstarc=p;}return OK;}void FindInDegree(ALGraph G,int indegree[])//求入度操作{int i;for(i=1;i<=G.vexnum;i++){indegree[i]=0;}for(i=1;i<=G.vexnum;i++){while(G.vertices[i].firstarc){indegree[G.vertices[i].firstarc->adjvex]++;G.vertices[i].firstarc=G.vertices[i].firstarc->nextarc;}}}int ve[100];int TopologicalSort(ALGraph G,SqStack &T) //进行拓扑排序{int indegree[M];FindInDegree(G, indegree);//求各顶点的入度SqStack S;InitStack(S);ArcNode *p;InitStack(S);for (i=1;i<=G.vexnum;i++){if (!indegree[i])Push(S,i);//入度为0者入栈}InitStack(T);int count=0;for(x=1;x<=G.vexnum;x++)// ve[0..G.vexnum-1]=0; {ve[x]=0;}while(!StackEmpty(S)){Pop(S,i);Push(T,i);++count;//输出i号顶点并计数for (p=G.vertices[i].firstarc;p;p=p->nextarc){k=p->adjvex;if (--indegree[k]==0)//若入度减为0,则入栈{Push(S,k);}if((ve[i]+p->info)>ve[k]){ve[k]= ve[i]+p->info;}}}printf("\n");if (count<G.vexnum)//该图有回路{printf("出现错误\n");}else{printf("排序成功\n");}}int CriticalPath(ALGraph G)//输出G的关键活动{int dut;int j=G.vexnum;int i,k;int ee,el;int vl[100];ArcNode *p;SqStack T;if(!TopologicalSort(G,T)){printf("该图存在环,无法找到关键路径!");return ERROR;}for(i=1;i<=G.vexnum;i++)// vl[0.. G.vexnum-1] =ve[0..G.vexnum-1];//用ve初始化vl {vl[i]=ve[G.vexnum];}while(!StackEmpty(T))for(Pop(T,j),p=G.vertices[j].firstarc;p;p=p->nextarc){k=p->adjvex;dut=p->info;if((vl[k]-dut)<vl[j]){vl[j]=vl[k]-dut;}}//end of forfor(i=1;i<=G.vexnum;++i){for (p=G.vertices[i].firstarc;p;p=p->nextarc){k=p->adjvex;dut=p->info;ee=ve[i];el=vl[k]-dut;if(ve[i]==(vl[k]-dut)){setcolor(BLUE);line(g_pos[i],g_pos[k]);}}//end of for(p)}return 1;}//end of CriticalPathvoid paintmain(ALGraph &G){setbkcolor(WHITE);setcolor(BLACK);setfont(-15,0,"微软雅黑");ArcNode *p;int i,j, k,info1;int a[11][3]={{1,2,6},{1,3,4},{1,4,5},{2,5,1},{3,5,1},{4,6,2}, {5,7,9},{5,8,7},{6,8,4},{7,9,2},{8,9,4}};G.vexnum=9;G.arcnum=11;for(k=0;k<G.arcnum;k++){i=a[k][0];j=a[k][1];info1=a[k][2];char str[10]; //画线point p1=g_pos[i];point p2=g_pos[j];int w=info1;itoa(w,str,10);line(p1,p2);outtext((p1+p2)/2,str);p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=j;p->info=info1;p->nextarc=G.vertices[i].firstarc;G.vertices[i].firstarc=p;}setcolor(RED);for ( i=1; i<=9; ++i) // paint circle{char str[10]="v";itoa(i,str+1,10);fillcircle(g_pos[i],g_r);setbkmode(TRANSPARENT);outtext(g_pos[i]+point(-8,-8),str);}}int main(){ALGraph G;CreatALGraph(G);setinitmode(NULL);initgraph(g_width,g_height);// setcaption("AOE-网演示程序");g_pos[1]=point(35,120);g_pos[2]=point(140,70);g_pos[3]=point(140,180);g_pos[4]=point(140,260);g_pos[5]=point(250,120);g_pos[6]=point(260,260);g_pos[7]=point(360,70);g_pos[8]=point(360,180);g_pos[9]=point(450,120);paintmain(G);setfont(-20,0,"微软雅黑");outtextxy(160,10,"按任意键开始演示...");getch();CriticalPath(G);getch();return 0;}七【上机实验中的其他它问题及心得】经过半学期学习数据结构然后做了这个关键路径的小项目,要写出这个小项目必需要平时努力的学好前面的知识,为后面打下基础才能写好这个程序。

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

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

课程设计报告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’以后,运行后只剩下了第三个错误。

关键路线法实验报告(3篇)

关键路线法实验报告(3篇)

第1篇一、实验目的通过本次实验,掌握关键路线法(Critical Path Method,CPM)的基本原理和操作步骤,学会运用CPM方法进行项目进度计划和控制,提高项目管理水平。

二、实验背景关键路线法是一种用于项目进度计划和控制的方法,通过分析项目网络图中各活动的逻辑关系和持续时间,确定关键路线,从而预测项目工期,并对项目进度进行有效控制。

三、实验内容1. 项目网络图的绘制- 以某建筑工程项目为例,绘制项目网络图,标明各活动之间的逻辑关系和持续时间。

- 确定项目起点和终点,以及各活动的紧前活动和紧后活动。

2. 计算各活动的最早开始时间(ES)和最早结束时间(EF)- 从项目起点开始,按顺序计算各活动的最早开始时间和最早结束时间。

3. 计算各活动的最迟开始时间(LS)和最迟结束时间(LF)- 从项目终点开始,逆序计算各活动的最迟开始时间和最迟结束时间。

4. 计算各活动的总时差(TS)- 总时差 = 最迟开始时间 - 最早开始时间或最迟结束时间 - 最早结束时间。

5. 确定关键路线- 找出总时差为0的活动,这些活动组成关键路线。

6. 绘制关键路线图- 将关键路线在项目网络图中标注出来,以便直观地展示关键路线。

四、实验步骤1. 项目网络图的绘制- 使用Microsoft Visio或其他绘图软件,绘制项目网络图。

- 确定项目起点和终点,以及各活动的紧前活动和紧后活动。

2. 计算各活动的最早开始时间和最早结束时间- 从项目起点开始,按顺序计算各活动的最早开始时间和最早结束时间。

3. 计算各活动的最迟开始时间和最迟结束时间- 从项目终点开始,逆序计算各活动的最迟开始时间和最迟结束时间。

4. 计算各活动的总时差- 计算总时差 = 最迟开始时间 - 最早开始时间或最迟结束时间 - 最早结束时间。

5. 确定关键路线- 找出总时差为0的活动,这些活动组成关键路线。

6. 绘制关键路线图- 将关键路线在项目网络图中标注出来,以便直观地展示关键路线。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、基本操作:
(1)void create_ALgraph(ALgraph g,int e,int n)
建立AOE网的邻接表,e为弧的数目,n为顶点数
(2)void oupe_ALgraph(ALgraph g,int n)
输出AOE网的邻接表
(3)int Criticalpath(ALgraph g,int n)
main()
{
ALgraph g;
int e,n;
int tag;
printf("\n请输入顶点的个数和边的个数,用空格间隔:");
scanf("%d%d",&n,&e);
create_ALgraph(g,e,n); //建立邻接表
printf("\n输出邻接表信息:\n");
oupe_ALgraph(g,n); //建立输出邻接表
main()
create_ALgraph(ALgraph g,int e,int n)
oupe_ALgraph(ALgraph g,int n)
Criticalpath(ALgraph g,int n)
3、完整的程序:
#include"stdio.h"
#include"stdlib.h"
#define VEX_NUM 10//定义最大顶点数
int i,j,k,w;
printf("请输入顶点的信息和入度,用空格间隔:");
for(i=1;i<=n;i++) //结点p;g[i].data,&g[i].id); //输入顶点信息和入度
g[i].firstarc=NULL;
}
for(k=1;k<=e;k++) //建立边表
le[i]=ve[n];
for(i=n-1;i>=1;i--) //按拓扑序列的逆序取顶点
{
j=tpord[i];
p=g[j].firstarc;
while(p!=NULL)
{
k=p->adjvex;
if(le[k]-p->dut<le[j])
le[j]=le[k]-p->dut;
p=p->nextarc;
struct arcnode *p;
for(i=1;i<n;i++)
{
p=g[i].firstarc;
printf("%d,%d->",g[i].data,g[i].id);
while(p!=NULL)
{
printf("%3d%3d",p->adjvex,p->dut);
p=p->nextarc; //找下一个邻接点
{
printf("请输入边的两个顶点以及边上的权值,用空格间隔:");
scanf("%d%d%d",&i,&j,&w); //输入有向边的两个顶点
p=(struct arcnode *)malloc(sizeof(struct arcnode));
p->adjvex=j;
p->dut=w;
p->nextarc=g[i].firstarc; //插入下标为i的边表的第一个结点的位置
while(p!=NULL)
{
printf("%3d%3d",p->adjvex,p->dut);
p=p->nextarc; //找下一个邻接点
}
printf("\n");
}
}
int Criticalpath(ALgraph g,int n)//求AOE网的各个关键活动
{
int i,j,k,count;
{
k=p->adjvex;
g[k].id--;
if(ve[j]+p->dut>ve[k])
ve[k]=ve[j]+p->dut;
if(g[k].id==0)
tpord[++rear]=k;
p=p->nextarc;
}
}
if(count<n) //该AOE网有回路
return 0;
for(i=1;i<=n;i++) //各事件的最迟发生事件赋初值
g[i].firstarc=p;
}
}
void oupe_ALgraph(ALgraph g,int n) //输出AOE网的邻接表
{
int i;
struct arcnode *p;
for(i=1;i<n;i++)
{
p=g[i].firstarc;
printf("%d,%d->",g[i].data,g[i].id);
{
int adjvex;
int dut; //边上的权值
struct arcnode *nextarc;
};
struct node //声明头结点结构
{
int data;
int id; //定点入度
struct arcnode *firstarc;
};
元素类型为整形和指针型。
2、每个模块的分析:
(1)主程序模块:
求AOE网的各个关键活动
2、本程序包含两个模块:
(1)主程序模块;
(2)建立AOE网的邻接表、输出AOE网的邻接表、求AOE网的各个关键活动;
(3)模块调用图:
主程序模块
建立AOE网的邻接表
输出AOE网的邻接表
求AOE网的各个关键活动
3、流程图
六、详细设计
1、存储类型,元素类型,结点类型:
struct arcnode//声明边表中结点结构
{
k=p->adjvex;
e[i]=ve[j];
l[i]=le[k]-p->dut;
if(l[i]==e[i]) //输出关键活动
printf("<v%d,v%d>:%d\n",g[j].data,g[k].data,p->dut);
p=p->nextarc;
i++;
}
}
return 1;
}
3)函数调用关系图
ve[i]=0;
for(i=1;i<=n;i++)
if(g[i].id==0) //入度为0入队列
tpord[++rear]=i;
count=0;
while(front!=rear)
{
front++;
j=tpord[front];
count++;
p=g[j].firstarc;
while(p!=NULL)
if(g[k].id==0)
tpord[++rear]=k;
p=p->nextarc;
}
}
if(count<n) //该AOE网有回路
return 0;
for(i=1;i<=n;i++) //各事件的最迟发生事件赋初值
le[i]=ve[n];
for(i=n-1;i>=1;i--) //按拓扑序列的逆序取顶点
int id; //定点入度
struct arcnode *firstarc;
};
typedef struct node ALgraph[VEX_NUM+1];
void create_ALgraph(ALgraph g,int e,int n)
{ //建立AOE网的邻接表,e为弧的数目,n为顶点数
struct arcnode *p;
g[i].firstarc=NULL;
}
for(k=1;k<=e;k++) //建立边表
{
printf("请输入边的两个顶点以及边上的权值,用空格间隔:");
scanf("%d%d%d",&i,&j,&w); //输入有向边的两个顶点
p=(struct arcnode *)malloc(sizeof(struct arcnode));
int tpord[VEX_NUM+1]; //顺序队列
int ve[VEX_NUM+1],le[VEX_NUM+1];
int e[ARC_NUM+1],l[ARC_NUM+1];
int front=0,rear=0;//顺序队列的首尾指针初值为0
struct arcnode *p;
for(i=1;i<=n;i++) //各事件最早发生事件初值为0
一、实验目的
1、巩固和加深对数据结构课程基本知识的理解,综合数据结构课程里学的理论知识,完成对关键路径程序的设计。
2、理解和掌握图的各种基本数据结构的定义、存储结构和相应的算法,并能够用c语言实现。
3、理解AOE网和拓扑排序、求关键路径的算法。
二、实验内容
对于给定的一个工程施工图,该图以边为单位从键盘输入,编写能够找出该图的关键路径的程序。
p->adjvex=j;
p->dut=w;
p->nextarc=g[i].firstarc; //插入下标为i的边表的第一个结点的位置
g[i].firstarc=p;
}
}
输出AOE网的邻接表函数模块
相关文档
最新文档