数据结构课程设计地铁建设问题

上传人:仙*** 文档编号:99430621 上传时间:2022-05-31 格式:DOC 页数:21 大小:126KB
返回 下载 相关 举报
数据结构课程设计地铁建设问题_第1页
第1页 / 共21页
数据结构课程设计地铁建设问题_第2页
第2页 / 共21页
数据结构课程设计地铁建设问题_第3页
第3页 / 共21页
点击查看更多>>
资源描述
-软 件 学 院课程设计报告书课程名称 数据构造课程设计 设计题目 地铁建立问题 专业班级 学 号 姓 名 指导教师 2021 年 1 月目录1 设计时间32 设计目的33设计任务34 设计容34.1需求分析34.2总体设计44.3详细设计44.4测试与分析5测试5分析64.5 附录75 总结与展望11参考文献12成绩评定121 设计时间2021 年1月19日2021年1月23日2 设计目的通过课程设计,加深对?数据构造?这一课程所学容的进一步理解与稳固,加深对构造化设计思想的理解,能对系统功能进展分析,并设计合理的模块化构造。提高程序开发功能,能运用合理的控制流程编写清晰高效的程序。训练C程序调试能力,能将一个中小型各级组织系统联调通过。开发一个中小型系统,掌握系统研发全过程。培养分析问题、解决实际问题的能力。3设计任务*城市要在各个辖区之间修建地铁,由于地铁建立费用昂贵,因此需要合理安排地铁建立线路,使市民可以沿地铁到达各个辖区,并使总费用最小。4 设计容设计思路:(1)输入各个辖区名称和各辖区间直接距离地铁铺设费用与距离成正比。如:到的直接距离是100公里.(2)根据辖区距离信息,计算出应该在哪些辖区建立地铁线路。(3)输出应该建立的地铁线路及所需建立总里程。本程序中用到的所有抽象数据类型的定义;typedef char InfoTypetypedef char Verte*TypeMA*_NAMEtypedef structVRType adj; InfoType *info; 、 ArcCell, AdjMatri*MA*_VERTE*_NUMMA*_VERTE*_NUM;typedef structVerte*Type ve*sMA*_VERTE*_NUM;AdjMatri* arcs;int ve*num,arum; MGraph;typedef structVerte*Type adjve*;VRType lowcost;minsideMA*_VERTE*_NUM;4.1需求分析输出应该建立的地铁线路及所需建立总里程。要求输出建立地铁的最短路线,再利用其最短路线上的权值把总的里程计算出来,已到达最省的费用,实现该地铁的建立。4.2总体设计1.首先要了解此题中的要求,要用已经学的邻接矩阵,根据输入的辖区信息,建立图模型,使用的数据构造是无向图,采用邻接矩阵存储。2. 根据普利姆算法计算最小生成树。假设WN=(V,E) 是一个含有 n 个顶点的连通网,TV 是 WN 上最小生成树中顶点的集合,TE 是最小生成树中边的集合。显然,在算法执行完毕时,TV=V,而 TE 是 E 的一个子集。在算法开场执行时,TE 为空集,TV 中只有一个顶点,因此,按普里姆算法构造最小生成树的过程为:在所有“其一个顶点已经落在生成树上,而另一个顶点尚未落在生成树上的边中取一条权值为最小的边,逐条加在生成树上,直至生成树中含有 n-1条边为止。3.了解了这些就可以实现它的根本操作,然后构建一个邻接矩阵,输入各个辖区构成一个无向连通图,并把直接距离当作权值来标记,之后,进展普里姆的算法,使其生成最小生成树,并带有权值了,把这些辖区输出,并把最小路径和最少的费用输出,这样就完成了操作。此题出现的调用函数是:i=creatgraph(&g);MiniSpanTree_PRIM(g,a);k=locateve*(&g,a);minimun(struct tree *a,Graph g);开场主程序流程图:主函数建立界面普里姆的构建及使用邻接矩阵的建立及存储MiniSpanTree_PRIMcreatgraphminimunlocateve*主函数完毕 图14.3详细设计typedef struct char VM10; int RMM; int ve*num; Graph; int locateve*(Graph *g,char a10) int i; for(i=0;ive*num;i+) if(strcmp(a,g-Vi)=0) return i; if(i=g-ve*num) return -1; int creatgraph(Graph *g) int i=0,j,m,k,p; char a10,b10; printf(所有的辖区,以0为完毕n); scanf(%s,g-Vi); while(strcmp(0,g-Vi)!=0) i+; scanf(%s,g-Vi); g-ve*num=i; for(i=0;ive*num;i+) for(j=0;jve*num;j+) g-Rij=INFINITY; printf(辖区之间的路程,以0 0 0为完毕标志n); scanf(%s%s%d,a,b,&m); while(strcmp(0,a)!=0 | strcmp(0,b)!=0 | m!=0) k=locateve*(g,a); p=locateve*(g,b);if(k=-1) printf(没有%s这个辖区n,a); return 0; if(p=-1) printf(没有%s这个辖区n,b); return 0;g-Rkp=g-Rpk=m;scanf(%s%s%d,a,b,&m); return 1;struct tree int weizhi; int lowcost; ;int minimun(struct tree *a,Graph g) int i,k,m=0;for(i=0;ig.ve*num;i+) if(m=0 & ai.lowcost!=0) m=1; k=i;if(m=1 & ai.lowcost!=0) if(ai.lowcostak.lowcost) k=i; return k;void MiniSpanTree_PRIM(Graph g,char a10) struct tree closedgeM; int i,j,k,money=0; k=locateve*(&g,a); for(i=0;ig.ve*num;i+) if(i!=k) closedgei.lowcost=g.Rki; closedgei.weizhi=k; closedgek.lowcost=0; for(i=1;ig.ve*num;i+) k=minimun(closedge,g); money+=closedgek.lowcost; printf(%d:%s %s %dn,i,g.Vclosedgek.weizhi,g.Vk,closedgek.lowcost); closedgek.lowcost=0; for(j=0;jg.ve*num;j+) if(g.Rkjclosedgej.lowcost) closedgej.weizhi=k; closedgej.lowcost=g.Rkj; printf(总费用为:%dn,money);4.4测试与分析4.4.1测试邻接矩阵的建立及存储:图2普里姆算法: 图34.4.2分析1.调试过程中遇到的问题及其解决方法1问题:在 for 循环语句中,循环变量使用控制错误 解决方法: 在 for 循环语句中,应该意识到:循环变量的执行次数总是比循环体的执行次数多一次;即最后一次的循环体执行完毕之后,循环变量又执行了一次,但是循环体却没有再执行了。2问题:二位数组在使用的时候数组未初始化:导致最后输出的时候的邻接矩阵出现错误;解决方法:根据输出的窗口从代码中分析发现错误,二维数组初始化之后,所得到的邻接矩阵正确输出。2.复杂度分析分析普里姆算法,假设网中有n个定点,则第一个进展初始化的循环语句的频率为n,第二个循环语句的频率为n-1。其中有两个循环:其一是在closedgev.lowcost中求最小值,其频率为n-1;其二是重新选择具有最小代价的变量,其频度为n。由此,普里姆算法的时间复杂度为O(n*n),与网中的遍数无关。利用PRIM算法生成最小生成树时,求第k次的最短边共需比拟2(n-k)-1次,即时间复杂度为O(n-k)。3.思路探索开场分析问题时,我把问题想得过于简单,结合教师讲过得算法和书上得算法设计得,但此题不是这样的,这个实际问题中有权值,而且这还是此题的关键,开场的时候造成了不少的麻烦,然后经过同学间得讨论,才看出来我的错误来,及时改了过来。还有在普里姆的操作上,可谓是麻烦重重,书上的算法根本行不通,因为上面的是C+后来我反复的来看书也整的一知半解的,通过教师的帮助,我又开场重做,在最后才做出来。由于开场时对于问题的错误分析,浪费了不少时间。 其实,由于自己的马虎也浪费了不少的时间在不必要的地方,如:字母的大小写,自负的定义上,但还好最后这些都抑制了,对我来说对数据构造又有了进一步的了解,继续学习,丰富自己!4.5 附录*include *include *include *include *define INFINITY 10000*define M 20 typedef struct char VM10; int RMM; int ve*num; Graph; int locateve*(Graph *g,char a10) int i; for(i=0;ive*num;i+) if(strcmp(a,g-Vi)=0) return i; if(i=g-ve*num) return -1; int creatgraph(Graph *g) int i=0,j,m,k,p; char a10,b10; printf(所有的辖区,以0为完毕n); scanf(%s,g-Vi); while(strcmp(0,g-Vi)!=0) i+; scanf(%s,g-Vi); g-ve*num=i; for(i=0;ive*num;i+) for(j=0;jve*num;j+) g-Rij=INFINITY; printf(辖区之间的路程,以0 0 0为完毕标志n); scanf(%s%s%d,a,b,&m); while(strcmp(0,a)!=0 | strcmp(0,b)!=0 | m!=0) k=locateve*(g,a); p=locateve*(g,b);if(k=-1) printf(没有%s这个辖区n,a); return 0; if(p=-1) printf(没有%s这个辖区n,b); return 0;g-Rkp=g-Rpk=m;scanf(%s%s%d,a,b,&m); return 1;struct tree int weizhi; int lowcost; ;int minimun(struct tree *a,Graph g) int i,k,m=0; for(i=0;ig.ve*num;i+) if(m=0 & ai.lowcost!=0) m=1; k=i;if(m=1 & ai.lowcost!=0) if(ai.lowcostak.lowcost) k=i; return k;void MiniSpanTree_PRIM(Graph g,char a10) struct tree closedgeM; int i,j,k,money=0; k=locateve*(&g,a); for(i=0;ig.ve*num;i+) if(i!=k) closedgei.lowcost=g.Rki; closedgei.weizhi=k; closedgek.lowcost=0; for(i=1;ig.ve*num;i+) k=minimun(closedge,g); money+=closedgek.lowcost; printf(%d:%s %s %dn,i,g.Vclosedgek.weizhi,g.Vk,closedgek.lowcost); closedgek.lowcost=0; for(j=0;jg.ve*num;j+) if(g.Rkjclosedgej.lowcost) closedgej.weizhi=k; closedgej.lowcost=g.Rkj; printf(总费用为:%dn,money);void main() int i; Graph g; char a10; i=creatgraph(&g); if(i) printf(从哪里开场:); scanf(%s,a); MiniSpanTree_PRIM(g,a); 5 总结与展望通过这一周的课程设计,加深了我对?数据构造?这门课程所学容的进一步的理解与掌握;同时,通过对地铁建立问题的开发,使得我将计算机课程所学知识与实际问题很好地相联接在了一起。初步的了解了我们所学的课本知识在实际中的应用。同时业培养了我开发一个中小型程序的能力。在这次对地铁建立问题的开发过程中使我更加体会到细心耐心在程序设计中的重要性,和同学的合作交流业让自己学到了更多,发现自己在实际问题分析中的缺乏。通过本次课程设计,对图的概念有了一个新的认识,在学习离散数学的时候,总觉得图是很抽象的东西,但是在学习了?数据构造与算法?这门课程之后,我慢慢地体会到了其中的微妙,图能够在计算机中存在,首先要捕捉他有哪些具体化、数字化的信息,比方说权值、顶点个数等,这也就说明了想要把生活中的信息转化到计算机中必须用数字来完整的构成一个信息库,而图的存在,又涉及到了顶点之间的联系。图分为有向图和无向图,而无向图又是有向图在权值双向相等下的一种特例,如何能在计算机中表示一个双向权值不同的图,这就是一件很巧妙的事情,经过了思考和教师同学的帮助,我用edgesij=up和edgesji=up就能实现了一个双向图信息的存储。对整个程序而言,Dijkstra算法始终都是核心容,其实这个算法在实际思考中并不难,也许我们谁都知道找一个路径最短的方法,及从顶点一步一步找最近的路线并与其直接距离相比拟,但是,在计算机中实现这么一个很简单的想法就需要涉及到很多专业知识,为了完成设计,在前期工作中,根本都是以学习C语言为主,所以浪费了很多时间,比方说在程序中,删除顶点和增加顶点的模块中都有和建图模块相互重复的函数,但是由于技术的原因,只能做一些很累赘的函数,可见在调用知识点,我没有掌握好。不过,有了这次课程设计的经历和教训,我能够很清楚的对自己定一个适宜的水平,而且在这次课程设计中我学会了运用两个新的函数sprintf()和包涵在*include头文件中的输入函数。因为课程设计的题目是求最短路径,本来是想通过算法的实现把这个程序与交通情况相连,但是因为来不及查找各地的信息,所以,这个方案就没有实现,我相信在以后有更长时间的情况下,我会做出来的。程序设计时,也不要怕遇到错误,在实际操作过程中犯的一些错误还会有意外的收获,感觉课程设计很有意思。在具体操作中这学期所学的数据构造的理论知识得到稳固,到达课程设计的根本目的,也发现自己的缺乏之出,在以后的上机中应更加注意。总之,在这周的课程设计中,我以及我们这组的收获还是挺大的,不仅对于专业课有了更好的认识,而且还培养了我实际操作的能力! 参考文献1.谭浩强.C程序设计教程. :清华大学.2007.072.高维春主编.C语言程序设计工程教程.:人民邮电.2021.053.海新 燕主编. C语言程序设计实用教程.机械工业.2007.094.严蔚敏.数据构造C语言.清华大学.2021.3成绩评定成绩 教师签字. z.
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!