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

上传人:b****7 文档编号:9282923 上传时间:2023-02-04 格式:DOCX 页数:16 大小:110.07KB
下载 相关 举报
数据结构课程设计地铁建设问题.docx_第1页
第1页 / 共16页
数据结构课程设计地铁建设问题.docx_第2页
第2页 / 共16页
数据结构课程设计地铁建设问题.docx_第3页
第3页 / 共16页
数据结构课程设计地铁建设问题.docx_第4页
第4页 / 共16页
数据结构课程设计地铁建设问题.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

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

《数据结构课程设计地铁建设问题.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计地铁建设问题.docx(16页珍藏版)》请在冰豆网上搜索。

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

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

软件学院

课程设计报告书

 

课程名称数据构造课程设计

设计题目地铁建立问题

专业班级

学号

姓名

指导教师

 

2021年1月

 

1设计时间

2021年1月19日—2021年1月23日

2设计目的

通过课程设计,加深对?

数据构造?

这一课程所学容的进一步理解与稳固,加深对构造化设计思想的理解,能对系统功能进展分析,并设计合理的模块化构造。

提高程序开发功能,能运用合理的控制流程编写清晰高效的程序。

训练C程序调试能力,能将一个中小型各级组织系统联调通过。

开发一个中小型系统,掌握系统研发全过程。

培养分析问题、解决实际问题的能力。

3设计任务

某城市要在各个辖区之间修建地铁,由于地铁建立费用昂贵,因此需要合理安排地铁建立线路,使市民可以沿地铁到达各个辖区,并使总费用最小。

4设计容

设计思路:

(1)输入各个辖区名称和各辖区间直接距离〔地铁铺设费用与距离成正比〕。

如:

到的直接距离是100公里.

(2)根据辖区距离信息,计算出应该在哪些辖区建立地铁线路。

(3)输出应该建立的地铁线路及所需建立总里程。

本程序中用到的所有抽象数据类型的定义;

typedefcharInfoType

typedefcharVertexType[MAX_NAME]

typedefstruct

{

VRTypeadj;

InfoType*info;、

}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedefstruct

{

VertexTypevexs[MAX_VERTEX_NUM];

AdjMatrixarcs;

intvexnum,

arum;

}MGraph;

typedefstruct

{

VertexTypeadjvex;

VRTypelowcost;

}minside[MAX_VERTEX_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=locatevex(&g,a);

minimun(structtree*a,Graphg);

主程序流程图:

 

图1

4.3详细设计

typedefstruct{

charV[M][10];

intR[M][M];

intvexnum;

}Graph;

intlocatevex(Graph*g,chara[10])

{

inti;

for(i=0;ivexnum;i++)

{

if(strcmp(a,g->V[i])==0)

returni;

}

if(i==g->vexnum)

return-1;

}

intcreatgraph(Graph*g)

{

inti=0,j,m,k,p;

chara[10],b[10];

printf("所有的辖区,以0为完毕\n");

scanf("%s",g->V[i]);

while(strcmp("0",g->V[i])!

=0)

{

i++;

scanf("%s",g->V[i]);

}

g->vexnum=i;

for(i=0;ivexnum;i++)

for(j=0;jvexnum;j++)

g->R[i][j]=INFINITY;

printf("辖区之间的路程,以000为完毕标志\n");

scanf("%s%s%d",a,b,&m);

while(strcmp("0",a)!

=0||strcmp("0",b)!

=0||m!

=0)

{

k=locatevex(g,a);p=locatevex(g,b);

if(k==-1)

{

printf("没有%s这个辖区\n",a);

return0;

}

if(p==-1)

{

printf("没有%s这个辖区\n",b);

return0;

}

g->R[k][p]=g->R[p][k]=m;

scanf("%s%s%d",a,b,&m);

}

return1;

}

structtree{

intweizhi;

intlowcost;

};

intminimun(structtree*a,Graphg)

{

inti,k,m=0;

for(i=0;i

{

if(m==0&&a[i].lowcost!

=0)

{

m=1;

k=i;

}

if(m==1&&a[i].lowcost!

=0)

{

if(a[i].lowcost

k=i;

}

}

returnk;

}

voidMiniSpanTree_PRIM(Graphg,chara[10])

{

structtreeclosedge[M];

inti,j,k,money=0;

k=locatevex(&g,a);

for(i=0;i

{

if(i!

=k)

{

closedge[i].lowcost=g.R[k][i];

closedge[i].weizhi=k;

}

}

closedge[k].lowcost=0;

for(i=1;i

{

k=minimun(closedge,g);

money+=closedge[k].lowcost;

printf("%d:

%s%s%d\n",i,g.V[closedge[k].weizhi],g.V[k],closedge[k].lowcost);

closedge[k].lowcost=0;

for(j=0;j

{

if(g.R[k][j]

{

closedge[j].weizhi=k;

closedge[j].lowcost=g.R[k][j];

}

}

}

printf("总费用为:

%d\n",money);

}

4.4测试与分析

4.4.1测试

邻接矩阵的建立及存储:

 

图2

普里姆算法:

 

图3

4.4.2分析

1.调试过程中遇到的问题及其解决方法

〔1〕问题:

在for循环语句中,循环变量使用控制错误

解决方法:

在for循环语句中,应该意识到:

循环变量的执行次数总是比循环体的执行次数多一次;即最后一次的循环体执行完毕之后,循环变量又执行了一次,但是循环体却没有再执行了。

〔2〕问题:

二位数组在使用的时候数组未初始化:

导致最后输出的时候的邻接矩阵出现错误;

解决方法:

根据输出的窗口从代码中分析发现错误,二维数组初始化之后,所得到的邻接矩阵正确输出。

2.复杂度分析

分析普里姆算法,假设网中有n个定点,那么第一个进展初始化的循环语句的频率为n,第二个循环语句的频率为n-1。

其中有两个循环:

其一是在closedge[v].lowcost中求最小值,,其频率为n-1;其二是重新选择具有最小代价的变量,其频度为n。

由此,普里姆算法的时间复杂度为O(n*n),与网中的遍数无关。

利用PRIM算法生成最小生成树时,求第k次的最短边共需比拟2(n-k)-1次,即时间复杂度为O(n-k)。

3.思路探索

开场分析问题时,我把问题想得过于简单,结合教师讲过得算法和书上得算法设计得,但此题不是这样的,这个实际问题中有权值,而且这还是此题的关键,开场的时候造成了不少的麻烦,然后经过同学间得讨论,才看出来我的错误来,及时改了过来。

还有在普里姆的操作上,可谓是麻烦重重,书上的算法根本行不通,〔因为上面的是C++〕后来我反复的来看书也整的一知半解的,通过教师的帮助,我又开场重做,在最后才做出来。

由于开场时对于问题的错误分析,浪费了不少时间。

其实,由于自己的马虎也浪费了不少的时间在不必要的地方,如:

字母的大小写,自负的定义上,但还好最后这些都抑制了,对我来说对数据构造又有了进一步的了解,继续学习,丰富自己!

4.5附录

#include

#include

#include

#include

#defineINFINITY10000

#defineM20

typedefstruct{

charV[M][10];

intR[M][M];

intvexnum;

}Graph;

intlocatevex(Graph*g,chara[10])

{

inti;

for(i=0;ivexnum;i++)

{

if(strcmp(a,g->V[i])==0)

returni;

}

if(i==g->vexnum)

return-1;

}

intcreatgraph(Graph*g)

{

inti=0,j,m,k,p;

chara[10],b[10];

printf("所有的辖区,以0为完毕\n");

scanf("%s",g->V[i]);

while(strcmp("0",g->V[i])!

=0)

{

i++;

scanf("%s",g->V[i]);

}

g->vexnum=i;

for(i=0;ivexnum;i++)

for(j=0;jvexnum;j++)

g->R[i][j]=INFINITY;

printf("辖区之间的路程,以000为完毕标志\n");

scanf("%s%s%d",a,b,&m);

while(strcmp("0",a)!

=0||strcmp("0",b)!

=0||m!

=0)

{

k=locatevex(g,a);p=locatevex(g,b);

if(k==-1)

{

printf("没有%s这个辖区\n",a);

return0;

}

if(p==-1)

{

printf("没有%s这个辖区\n",b);

return0;

}

g->R[k][p]=g->R[p][k]=m;

scanf("%s%s%d",a,b,&m);

}

return1;

}

structtree{

intweizhi;

intlowcost;

};

intminimun(structtree*a,Graphg)

{

inti,k,m=0;

for(i=0;i

{

if(m==0&&a[i].lowcost!

=0)

{

m=1;

k=i;

}

if(m==1&&a[i].lowcost!

=0)

{

if(a[i].lowcost

k=i;

}

}

returnk;

}

voidMiniSpanTree_PRIM(Graphg,chara[10])

{

structtreeclosedge[M];

inti,j,k,money=0;

k=locatevex(&g,a);

for(i=0;i

{

if(i!

=k)

{

closedge[i].lowcost=g.R[k][i];

closedge[i].weizhi=k;

}

}

closedge[k].lowcost=0;

for(i=1;i

{

k=minimun(closedge,g);

money+=closedge[k].lowcost;

printf("%d:

%s%s%d\n",i,g.V[closedge[k].weizhi],g.V[k],closedge[k].lowcost);

closedge[k].lowcost=0;

for(j=0;j

{

if(g.R[k][j]

{

closedge[j].weizhi=k;

closedge[j].lowcost=g.R[k][j];

}

}

}

printf("总费用为:

%d\n",money);

}

voidmain()

{

inti;

Graphg;

chara[10];

i=creatgraph(&g);

if(i)

{printf("从哪里开场:

");

scanf("%s",a);

MiniSpanTree_PRIM(g,a);

}

}

5总结与展望

通过这一周的课程设计,加深了我对?

数据构造?

这门课程所学容的进一步的理解与掌握;同时,通过对地铁建立问题的开发,使得我将计算机课程所学知识与实际问题很好地相联接在了一起。

初步的了解了我们所学的课本知识在实际中的应用。

同时业培养了我开发一个中小型程序的能力。

在这次对地铁建立问题的开发过程中使我更加体会到细心耐心在程序设计中的重要性,和同学的合作交流业让自己学到了更多,发现自己在实际问题分析中的缺乏。

通过本次课程设计,对图的概念有了一个新的认识,在学习离散数学的时候,总觉得图是很抽象的东西,但是在学习了?

数据构造与算法?

这门课程之后,我慢慢地体会到了其中的微妙,图能够在计算机中存在,首先要捕捉他有哪些具体化、数字化的信息,比方说权值、顶点个数等,这也就说明了想要把生活中的信息转化到计算机中必须用数字来完整的构成一个信息库,而图的存在,又涉及到了顶点之间的联系。

图分为有向图和无向图,而无向图又是有向图在权值双向相等下的一种特例,如何能在计算机中表示一个双向权值不同的图,这就是一件很巧妙的事情,经过了思考和教师同学的帮助,我用edges[i][j]=up和edges[j][i]=up就能实现了一个双向图信息的存储。

     对整个程序而言,Dijkstra算法始终都是核心容,其实这个算法在实际思考中并不难,也许我们谁都知道找一个路径最短的方法,及从顶点一步一步找最近的路线并与其直接距离相比拟,但是,在计算机中实现这么一个很简单的想法就需要涉及到很多专业知识,为了完成设计,在前期工作中,根本都是以学习C语言为主,所以浪费了很多时间,比方说在程序中,删除顶点和增加顶点的模块中都有和建图模块相互重复的函数,但是由于技术的原因,只能做一些很累赘的函数,可见在调用知识点,我没有掌握好。

不过,有了这次课程设计的经历和教训,我能够很清楚的对自己定一个适宜的水平,而且在这次课程设计中我学会了运用两个新的函数sprintf()和包涵在#include 头文件中的输入函数。

   因为课程设计的题目是求最短路径,本来是想通过算法的实现把这个程序与交通情况相连,但是因为来不及查找各地的信息,所以,这个方案就没有实现,我相信在以后有更长时间的情况下,我会做出来的。

程序设计时,也不要怕遇到错误,在实际操作过程中犯的一些错误还会有意外的收获,感觉课程设计很有意思。

在具体操作中这学期所学的数据构造的理论知识得到稳固,到达课程设计的根本目的,也发现自己的缺乏之出,在以后的上机中应更加注意。

总之,在这周的课程设计中,我以及我们这组的收获还是挺大的,不仅对于专业课有了更好的认识,而且还培养了我实际操作的能力!

参考文献

[1].谭浩强.C程序设计教程.:

清华大学.2007.07

[2].高维春主编.C语言程序设计工程教程.:

人民邮电.2021.05

[3].海新燕主编.C语言程序设计实用教程.机械工业.2007.09

[4].严蔚敏.数据构造〔C语言〕.清华大学.2021.3

成绩评定

 

成绩教师签字

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 解决方案

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

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