ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:41.04KB ,
资源ID:22224771      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/22224771.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构课程设计关键路径Word文件下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构课程设计关键路径Word文件下载.docx

1、二、 概要设计 为了实现上述函数功能:1、抽象数据类型图的定义如下:ADT Graph 数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。数据关系R: R= VR ; VR=v,w|v,wV,且P(v,w),v,w表示从v到w的弧,谓词P(v,w)定义了弧v,w的意义和信息 基本操作:InitGraph(G);初始条件:图G存在。操作结果:构造一个图的顶点数为MAX,弧的个数也为MAX,其他信息都相应初始化了的图。CreatGraph(& G);已经初始化了的图G。通过输入函数输入图的顶点个数,各顶点信息,弧的条数,以及弧的其他信息,构造图G。2、抽象数据类型栈的定义如下:ADT St

2、ack 数据对象:D=ai | ai ElemSet,i=1,2, ,n,n0数据关系:Rl=ai-1,ai | ai-1,aiD,i=2,n 约定an端为栈顶,ai端为栈底。InitStack(&S)构造一个空栈S。StackEmpty(S)栈S已经存在。若栈S为空栈,则返回TRUE,否则FALSE。Push(&S,e)插入元素e为新的栈顶元素。Pop(&S,&e)栈S已存在且不为空。删除S的栈顶元素,并用e返回其值。三、详细设计1、图的邻接表存储结构如下: #define MAX 20typedef struct ArcNode /表节点 int adjvex; /该弧所指向的顶点的位置

3、struct ArcNode * next; /指向下一条弧的指针 char * info1; /表示活动,如a1、a2、a3等等 int info2; /表示权值ArcNode;typedef struct VNode /头结点 Vertextype data3; /顶点信息,如v1、v2、v3等等。 ArcNode * first; /指向第一条依附该顶点的弧的指针。VNode,AdjListMAX;typedef struct AdjList vertices; int vexnum; /图的顶点数 int arcnum; /图的弧数ALGraph;2、栈的顺序存储结构如下: #defi

4、ne SIZEMAX 20#define ADD 10typedef int Elemtype;typedef struct Elemtype * base; Elemtype * top; int maxsize;Stack;3、图的构建函数设计如下: int IDMAX=0; /存放每个顶点的入度的数组IDint veMAX=0; /用来存放每个顶点的最早发生时间的数组vechar str3MAX10; /存放活动的字符串数组void InitGraph(ALGraph &G) /初始化图时将图的顶点数、弧数都赋为MAX G.vexnum=MAX; G.arcnum=MAX; for(in

5、t i=0;iG.vexnum;i+) /每一个头结点的first指针都指向空 G.verticesi.first=NULL;void CreateGraphic(ALGraph &G) int i,j,s,n; ArcNode *p,*pp; /定义两个指向ArcNode表结点的指针p,pp char str110,str210; /定义两个字符串str1,str2,最大长度为10 scanf(%dn,&G.vexnum); /输入图的顶点数vexnum for(i=0;i+) scanf(%s,G.verticesi.data); /输入各顶点的信息,顶点名称 /第i个头结点的first域

6、指向空 G.arcnum); /输入图的弧数arcnum for(i=0;G.arcnum;%s%s%s%d,str1,str2,str3i,&n); /输入每条弧的其它相关信息,str1是弧的弧尾,str2是弧的弧头,str3指的是活动,n指的是权值 for(j=0;jj+) /根据str1,找对应的弧尾,若找到, if(strcmp(str1,G.verticesj.data)=0) 则停止查找,并保存弧尾 break; 所示的顶点在头结点中的序号j for(s=0;sadjvex=s; /将弧头所指向的顶点的位置下标存放在pp的adjvex域中info1=str3i; /将该弧的活动信息

7、存放在pp的info1域中info2=n; /将该弧的权值大小存放在pp的info2域中next=NULL; /pp的next指向空 IDs+; /s的入度加1 if(G.verticesj.first!=NULL) /如果序号为j的头结点的first所指向的不为 空,则表示该顶点已经连好了一条弧,需要找下一个可存放的位置 p=G.verticesj.first; /用一个临时指针保存该头结点的first指针 if(p-next!=NULL) /如果first所指向的表结点的next指向不为空, /则需要找下一个可存放位置 while(p-next-=NULL) /如果p所指向的表结点的nex

8、t 所指向另一表结点的next不为空,就把p指针往后移一位 p=p-next; p-next=pp; /直到p的next指向为空,再把p的next指向pp else G.verticesj.first=pp; /如果序号为j的头结点的first所指向的为空,直接把它的first指向pp 4、堆栈的功能函数设计如下:Status InitStack(Stack &S) /栈的初始化操作 S.base=(Elemtype *)malloc(SIZEMAX*sizeof(Elemtype); /给栈分配内存空间 if(!S.base) exit (OVERFLOW); /若分配不成功,则返回OVER

9、FLOW; S.top=S.base; /让栈的栈顶指针和栈底指针相等 S.maxsize=SIZEMAX; /栈的当前容量为SIZEMAX return OK;Status Pop(Stack &S,int & if(S.top=S.base) /如果栈的栈顶指针等于栈底指针,则表示当前栈为空 return ERROR; /栈顶元素不存在,所以返回ERROR e=*(-S.top); /如果栈不为空,就取出S的栈顶指针所指向的数据, /并把top指针往下移一个位置Status Push(Stack &S,int e) if(S.top-S.base=S.maxsize) /如果当前栈内存的元

10、素超过了它的最大存放量 /则必须追加空间 S.base=(Elemtype *)realloc(S.base,(S.maxsize+ADD)*sizeof(Elemtype); if(!S.base) exit (OVERFLOW); S.top=S.base+S.maxsize; S.maxsize=S.maxsize+ADD; *(S.top+)=e; /top指针往上移一位后,让top指针指向元素eStatus Empty(Stack S) if(S.top=S.base) return OK; /如果栈的栈顶指针等于栈底指针,则表示当前栈为空,返回OKelse return ERROR

11、; /否则返回ERROR5、求关键路径的函数设计如下:Status Topo(ALGraph G,Stack &T) /拓扑排序函数 int i,j,k; ArcNode *p; /定义一个指向ArcNode表结点的指针p Stack S; /定义一个存放入度为0的顶点所在的下标值的栈 InitStack(S); /初始化栈S for(j=0;j+) /查看各个顶点的入度是否为0, if(IDj=0) /若为0,就让该顶点所在位置的下标值入栈 Push(S,j); int count=0; /记录进入拓扑排序栈T的元素个数 while(!Empty(S) Pop(S,j); /从零入度顶点栈S

12、中取出栈顶元素,存放在j中 Push(T,j); /元素j入栈T,表示序号为j的顶点入栈 count+; for(p=G.verticesj.first;p;p=p-next) /找以第j个顶点为弧尾的弧的弧头 k=p-adjvex; /保存弧头所示的顶点的位置下标 IDk-; /删除该弧后,弧头所示的顶点入度减1 if(IDk=0) Push(S,k); /如果该顶点入度为0,就入栈S if( ( vej + (p-info2) ) vek ) vek=vej+(p-info2);/如果j号顶点的最早发生时间与该弧的权值之和大于k号定点的 /最早发生时间,就改变k号顶点的最早发生时间 if(

13、count /把弧头所示的顶点位置下标值存放在k中 if(vlk-(p-info2) /如果k号顶点的最迟发生时间与该弧的权值之差小于j号定点的最迟发生时间,就改变vlj printf(关键顶点为a:);j+) if(vej=vlj) /如果定点的最早发生时间与最迟发生时间相等,则表示该%s ,G.verticesj.data);/顶点是关键顶点,就输出该关键顶点的名称n关键路径为:j+) for(p=G.verticesj.first; k=p- ee=vej; el=vlk-(p- if(el=ee) printf(,p-info1);四、 调试分析 1、本次课程设计题目思路特别清晰,算法

14、特别简单,但是在编程过程中遇到了一系列的问题都值得思考与分析。 2、首先是在图的创建过程中,用邻接表创建图的时候,指针使用没有正确到位而引发了一系列问题,后来通过与老师同学一起分析才找到了问题的症结所在。之前用临时指针p保存头结点的first指针,然后让p指向已经存好信息的表结点pp,这样操作并没有真正把它连起来,下次循环时,又覆盖了原来的信息。3、在成功创建了图后,把主函数中生成的图作为参数传给Critial()时,又发现原来图中的活动这一信息又改变了,全变成乱码了,原来是由于存放活动的字符串str3,由于不断的输入,导致最后字符串什么也没有了,而图中每个弧的活动指针都指向它,所以就全乱了,

15、后来就把它改为字符串数组,并且把它设为全局变量。4、在调试Critial()这一函数中,也遇到了一些问题,在观察零入度栈S的栈顶元素和拓扑序列栈T的时候,在watch窗口中输入*(S.top-),发现一直乱变,根本不知道它的栈内元素,甚至怀疑栈的初始化函数有没有写对,后来通过查找以前堆栈类型问题以及与同学题目作对比才发现就是由于窗口输入内容写错了,应该改为*(S.top-1)。五、 用户使用说明第一行输入顶点个数vexnum。第二行输入各个顶点的名称。第三行输入弧的边数arcnum。接下来的arcnum行输入每一条弧的弧尾顶点、弧头顶点、活动以及权值大小。六、 测试结果七、 附录以下是该程序设

16、计的完整代码:#includestring.hstdlib.h#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2#define MAX 20#define SIZEMAX 20typedef int Status;typedef int Infotype;typedef char Vertextype;int IDMAX=0;typedef struct ArcNode typedef struct VNode ArcNode * first;void Init(ALGraph &G.arcnu

17、m=MAX; if(strcmp(str1,G.verticesj.data)=0)s+) if(strcmp(str2,G.verticess.data)=0)=NULL) else G.verticesj.first=pp; if(S.top=S.base) return ERROR;=S.maxsize) S.base=(Elemtype *)realloc(S.base,(S.maxsize+add)*sizeof(Elemtype); S.maxsize=S.maxsize+add; /*(S.top)=e,S.top+; if(S.top=S.base) return OK; else return ERROR;T) if(IDj=0) Push(T,j); count+; IDk-; if(IDk=0) Push(S,k); vek ) vek=vej+(p- G.vexnum) return ERROR;Status Critial(ALGraph G)

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1