广东海洋大学信息学院
课程设计报告
设计题目 | 校园建筑的最短路径的设计方案 |
课程名称 | 数据结构 |
姓名(学号) | 杨俊杰(201311671120) |
联系电话 | 18319533212 |
专业名称 | 信息管理与信息系统 |
所在班级 | 信管1131班 |
指导教师 | 易学明 |
教师职称 |
|
起止时间 | 2014 年12月10日至 2014年1月5日 |
评定成绩 |
|
-
课程设计的主要内容
GDOU是真是一个好地方,校园如一座大花园,美丽而宽广。校园有许多建筑如教学楼、饭堂、宿舍楼、图书馆、体育馆、运动场、商业街、医院等,还有一些著名的风景点。现请根据学校的平面图,找出一些重要的场所,画出学校的平面图(场所可以根据其重要性适当减少),根据实际画出不同点间的路径,并估算每两个场所间的路径长。请设计数据结构并编程,当给出一个出发点和要到达另外一个场所的信息时,请给出最佳路径,并输出路径相关信息。
-
功能和结构设计
大学的建筑群及之间的路径似于无向图的顶点及边,且最优方案要求:既能连通所有建筑群之间的道路又能使每两个场所间的路径最短,因此建筑群之间的路径采用图结构表示,其两个地点的最短路径即为生成图的最小生成树。
逻辑结构设计: 由问题分析知,须采用图结构组织和处理各个建筑及任意两个建筑间距离的数据关系;
存储结构设计: 由于在算法执行过程中需要不断读取任意两个顶点之间的权值,所以图采用邻接矩阵存储.
-
算法设计
3.1算法设计
设G=(V,E)是一个无向连通网,令T=(U,TE)是G的最小生成树。T的初始化状态为U={ v0 }( v0 ∈V),TE={},重复执行以下操作:在所有u∈U,v∈V–U的边中一条代价最小的边(u,v)并入集合TE,同时v并入U,直至U=V为止。此时TE中必有n-1条边,则T就是一棵最小生成树。为了节省时间和空间,在边集中选取最短边时,对于V–U中的每个顶点,只保留从该顶点到U中某顶点的最短边。
伪代码描述如下:
1. 初始化:U={ v0 },TE={};
2. 重复执行以下操作,直至U=V:
2.1 在E中寻找最短边(u,v),且满足u∈U,v∈V–U;
2.2 U=U+{V};
2.3 TE=TE+{(u,v)};
三‘源程序代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define Max 32767
#define NUM 15
typedef structVertexType{
int number;
char *sight;
}VertexType;
typedef struct{
VertexType vex[NUM];
int arcs[NUM][NUM];
int vexnum;
}MGraph;
MGraph G;
int P[NUM][NUM];
long int D[NUM];//
void CreateMGraph(intv)//创建图的函数
{
int i,j;
G.vexnum=v;
for(i=1;i<G.vexnum;++i)
G.vex[i].number=i;
G.vex[0].sight="各个景点名字";
G.vex[1].sight="广东海洋大学大门";
G.vex[2].sight="东区体育场";
G.vex[3].sight="主楼";
G.vex[4].sight="教工饭堂 ";
G.vex[5].sight="体育馆";
G.vex[6].sight="图书馆";
G.vex[7].sight="钟海楼";
G.vex[8].sight="艺术学院";
G.vex[9].sight="游泳池";
G.vex[10].sight="商业中心";
G.vex[11].sight="科技楼";
G.vex[12].sight="第四饭堂";
G.vex[13].sight="西区体育场";
G.vex[14].sight="宿舍楼";
for(i=1;i<G.vexnum;++i)
{
for(j=1;j<G.vexnum;++j)
G.arcs[i][j]=Max;
}
G.arcs[1][2]=G.arcs[2][1]=212;
G.arcs[1][4]=G.arcs[4][1]=501;
G.arcs[2][4]=G.arcs[4][2]=299;
G.arcs[2][5]=G.arcs[5][2]=307;
G.arcs[3][4]=G.arcs[4][3]=601;
G.arcs[3][5]=G.arcs[5][3]=1023;
G.arcs[3][9]=G.arcs[9][3]=1312;
G.arcs[3][12]=G.arcs[12][3]=806;
G.arcs[4][5]=G.arcs[5][4]=355;
G.arcs[4][9]=G.arcs[9][4]=1300;
G.arcs[4][11]=G.arcs[11][4]=1800;
G.arcs[5][6]=G.arcs[6][5]=750;
G.arcs[6][7]=G.arcs[7][6]=180;
G.arcs[6][8]=G.arcs[8][6]=241;
G.arcs[6][10]=G.arcs[10][6]=250;
G.arcs[6][11]=G.arcs[11][6]=720;
G.arcs[7][8]=G.arcs[8][7]=140;
G.arcs[8][10]=G.arcs[10][8]=350;
G.arcs[9][12]=G.arcs[12][9]=650;
G.arcs[9][13]=G.arcs[13][9]=1225;
G.arcs[9][11]=G.arcs[11][9]=700;
G.arcs[10][11]=G.arcs[11][10]=520;
G.arcs[11][12]=G.arcs[12][11]=639;
G.arcs[11][13]=G.arcs[13][11]=405;
G.arcs[12][13]=G.arcs[13][12]=1083;
G.arcs[12][14]=G.arcs[14][12]=1096;
}
void Map()//地图展示函数
{
printf("\t ****************广东海洋大学地图****************** \n");
printf(" \n");
printf(" \n");
printf(" ━━━━━━━━━1广东海洋大学大门━━━━━━━━ \n");
printf(" ┃ ┃ ┃ \n");
printf(" ┃ ┃ ┃ \n");
printf(" 2东区体育场 ━━━━━━━3主楼━━━━━━━ 4教工饭堂 \n");
printf(" ┃ ┃ ┃ \n");
printf(" ┃ ┃ ┃ \n");
printf(" ┃ ┃ ┃ \n");
printf(" 5体育馆━━━━━━6图书馆━━━━━7钟海楼━━━━━━ \n");
printf(" ┃ ┃ ┃ \n");
printf(" ┃ ┃ ┃ \n");
printf(" ┃ ┃ ┃ \n");
printf(" ┃ ┃ 8艺术学院 \n");
printf(" ┃ ┃ ┃ \n");
printf(" ┃ ┃ ┃ \n");
printf(" 9游泳池━━━10商业中心 ━━━━━11科技楼━━━━━━ \n");
printf(" ┃ ┃ ┃ \n");
printf(" ┃ ┃ ┃ \n");
printf(" ┃ ┃ ┃ \n");
printf(" ┃━━━━━━━━━━━ ━━━12第四饭堂 \n");
printf(" ┃ \n");
printf(" ┃━━━13西区体育场 \n");
printf(" ┃ \n");
printf(" ┃ \n");
printf(" 14 宿舍楼 \n");
}
void Dijkstra(intnum)//迪杰斯特拉算法最短路径
{
int v,w,i,t;
int final[NUM];
int min;
for(v=1;v<NUM;v++)
{
final[v]=0;
D[v]=G.arcs[num][v];
for(w=1;w<NUM;w++)
P[v][w]=0;
if(D[v]<Max)
{
P[v][num]=1;
P[v][v]=1;
}
}
D[num]=0;
final[num]=1;
for(i=1;i<NUM;++i)
{
min=Max;
for(w=1;w<NUM;++w)
if(!final[w])
if(D[w]<min)
{
v=w;
min=D[w];
}
final[v]=1;
for(w=1;w<NUM;++w)
if(!final[w]&&((min+G.arcs[v][w])<D[w]))
{
D[w]=min+G.arcs[v][w];
for(t=0;t<NUM;t++)
P[w][t]=P[v][t];
P[w][w]=1;
}
}
}
char Menu()//主菜单
{
char c;
int flag;
do{
system("cls");
flag=1;
Map();
printf("\t\t欢迎使用广东海洋大学导航图\n");
printf("\t\t 1.查询地点之间最短路径 \n");
printf("\t\t e.退出 \n");
printf("\t\t\t请输入您的选择:");
scanf("%c",&c);
if(c=='1'||c=='e')
flag=0;
}while(flag);
return c;
}
void Display(intsight1,int sight2)//输出函数
{
int a,b,c,d,q=0;
a=sight2;
if(a!=sight1)
{
printf("\n\t从%s到%s的最短路径是",G.vex[sight1].sight,G.vex[sight2].sight);
printf("\t(最短距离为 %dm.)\n\n\t",D[a]);
printf("\t%s",G.vex[sight1].sight);
d=sight1;
for(c=0;c<NUM;++c)
{
P[a][sight1]=0;
for(b=0;b<NUM;b++)
{
if(G.arcs[d][b]<Max&&P[a][b])
{
printf("-->%s",G.vex[b].sight);
q=q+1;
P[a][b]=0;
d=b;
if(q%8==0)printf("\n");
}
}
}
}
}
void main()//主函数
{
int v0,v1;
char e;
char ck;
CreateMGraph(NUM);
do
{
system("cls");
ck=Menu();
switch(ck)
{
case '1':
gate:
system("cls");
Map();
do
{
printf("\n\n\t\t\t请选择出发地序号(1~14):");
scanf("%d",&v0);
if(v0<1||v0>14)
printf("\n\n\t\t\t\t输入错误!\n");
}while(v0<1||v0>14);
do
{
printf("\t\t\t请选择目的地序号(1~14):");
scanf("%d",&v1);
if(v1<1||v1>14||v1==v0)
printf("\n\n\t\t\t\t输入错误!\n");
}while(v1<1||v1>14||v1==v0);
Dijkstra(v0);
Display(v0,v1);
printf("\n\n\t\t\t\t按回车键继续,按e退回首页\n");
getchar();
scanf("%c",&e);
if(e=='e')
break;
goto gate;
};
}while(ck!='e');
}
-
运行结果
-
课程设计总结
经过3个星期的努力,数据结构课程设计终于完成。我这次的课程设计的题目是《校园建筑的最短路径的设计方案》,使用迪杰斯特拉算法得到所需要的最小的生成树。在整个设计过程中,自己从刚开始简单的构思算法思路的大致框架,直到最后使得整个算法顺利的得以实现。期间遇到的问题、错误很多,然经过无数次的调试分析,最终一一得以圆满解决。
在这3个星期里,自己可谓是收获很多,可以说得是苦多于甜,但是自己却能够在这短短的3个星期里学到很多很多的的东西,不仅可以巩固了以前所学过的知识,加深了对课本知识点的理解。而且学到了很多在书本上所没有学到过的知识,能够说是收获颇丰。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从实践中验证理论,从而提高自己的实际动手能力和独立思考的能力。当然,在设计的过程中遇到许许多多的问题,可以说得是困难重重,毕竟这是一次课程设计,需要掌握的知识面比较广,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后, 一定把以前所学过的知识重新温故。在设计中,vc ++6.0使用的也更加的牢固,了解的也更加深刻。
这次课程设计已经结束了,对于我自己,对本次课程设计我的感受很深,让自己在本次课程设计中感受了一番大起大落,使自己从中明白了,做成功一件事,是需要付出和汗水的。天下无难事只怕有心人,只要自己坚定信念,成功也只在咫尺之间。当然,我们也不能满足于现有的水准,否则就会停滞不前,要知道学海无涯,仍需我们努力学习。所以,在以后的时间里,我会利用更多时间去上机实验,加强自学的能力,多编写程序,相信不久后我的编程能力会有所提高能设计出更多的更有创新的作品!
-
参考资料
1.胡明 《数据结构》(C++版) 清华大学出版社
2.张勇 《C++语言程序设计教程》(第二版) 清华大学出版社