校园导航系统数据结构.docx
《校园导航系统数据结构.docx》由会员分享,可在线阅读,更多相关《校园导航系统数据结构.docx(21页珍藏版)》请在冰豆网上搜索。
![校园导航系统数据结构.docx](https://file1.bdocx.com/fileroot1/2023-5/18/52fe19d6-6c4e-4065-92c4-c5ba4b797ad1/52fe19d6-6c4e-4065-92c4-c5ba4b797ad11.gif)
校园导航系统数据结构
校园导航系统-数据结构
《数据结构预与算法分析》
课程设计报告
题目:
校园导航系统
班级:
网络工程
姓名:
xxx
学号:
xxxxxxx
指导教师:
xxx
日期:
2016/7/11
1.任务说明(要求、知识点、实现的功能)
1.1题目:
校园导航系统
1.2要求:
用无向网表示你所在学校的校园景点品面图,图中顶点表示主要景点,存放景点的编号,名称,简绍等信息,图中的边表示景点间的道路,存放路径长度等信息。
系统功能:
(1)景点信息简绍
(2)任意两景点间最短距离
(3)任意一点到所有点最短距离
1.3知识点:
图的创建,图的搜素,领接矩阵,迪杰斯特拉算法,结构体,函数的声明与调用等知识点。
2.概要设计(结构体类型及函数声明,功能模块图,流程图)
2.1结构体类型及函数声明
在近一个星期的努力下,我编写的校园导航系统软件终于能够成功完成。
采用工程思想,将系统共分一下几个模块:
导航图建立模块、求最短路径模块、主菜单;
下面是具体各功能简单的实际应用:
Ø导航图建立模块:
采用上述结构体类型对导航图中每个节点进行赋值。
包括:
各定点的名称(地点名),各个节点到其他所有节点的真实路径长度(赋权值)。
Ø求最短路径模块:
本模块的基本思想是采用迪杰斯特拉算法求最短路径。
次模块是本校园导航系统的核心模块,求两点间的最短路径与求一点到其他所有点最短路径两个子功能均是在最短路径算法模块的基础上进行调用,进而实现导航功能。
Ø主菜单:
主菜单中主要是显示导航图中的所有导航节点,能够快速方便的对各个地点进行导航。
以上程序的几个模块,构成了校园导航系统的基本组成部分,程序运行良好,达到了课程设计的基本要求。
由于所学知识有限,功能各个方面还有欠妥之处,希望得到指出与改正。
函数声明:
intCreateUDN(MGraph&G)创建导航图函数
voidShortPath(MGraph&G,intv0,intp[MAX_V][MAX_V],intd[])最短路径导航函数voidmenu()导航菜单声明
2.2功能模块图
总功能模块图
2.3流程图
迪杰斯特拉算法流程图
3.详细设计(数据类型实现、编码)
3.1节点数据结构类型:
#defineMAX_V40//最大顶点个数
typedefstruct
{
char*vexs[MAX_V];//顶点向量
intarcs[MAX_V][MAX_V];//邻接矩阵
intvexnum,arcnum;//图的当前顶点数和弧数
}MGraph;
3.2创建导航图函数:
intCreateUDN(MGraph&G)
函数描述:
主要将每个节点进行命名、每个顶点到其他所有定点的路径值用邻接矩阵进行存储。
例:
G.vexs[0]="校门";G.vexs[2]="校办公室";
作用:
使0号定点命名为“校门”;
G.arcs[0][2]=G.arcs[2][0]=900;
作用:
使0号节点到2号节点的路径赋值为900,因为是无向图,所以2号节点到0号节点的路径长度也应赋值为900;
3.3最短路径导航函数:
voidShortPath(MGraph&G,intv0,intp[MAX_V][MAX_V],intd[])
函数描述:
用Dijkstra算法求无向网G的V0定点到其余定点V的最短路径P[v]及其带权长度D[v]。
若P[v][w]为True,则w是从V0到V当前求得最短路径上的顶点。
Final[v]为True当且仅当V∈S,即已经求得从V0到V的最短路径。
3.4导航菜单函数声明
voidmenu()
函数描述:
输出各个节点的编号,放便导航。
4调试分析(出现哪些问题,如何解决)
问题:
在程序的一开始是准备,将系统共分为:
数据结构定义模块、导航图建立模块、求最短路径模块、主菜单这四个模块的来构成了校园导航系统的基本组成部分,但调试的过程数据结构定义这一模块总是出现调试错误,程序的调试一度进入难题。
改进方法:
由于数据结构定义模块总出错,便不再把数据结构定义设为单独的模块,而是在每一个其他模块中都进行一次编写,这样就避免了数据结构定义模块的调用错误,虽然这样使得程序变得冗余,但好在能调试成功,能使校园导航系统按照预先的设想正常运行。
5.测试结果
系统登陆界面:
导航功能1——景点信息介绍
Ø导航功能2——两点最短距离导航测试结果如下
Ø导航功能3——某点到其他所有点的距离
6.总结
经过一个学期对数据结构课程的学习,我能够掌握数据结构所教会我的对待问题的方法,以及遇到问题时如何抽象出一个合理的数据结构类型。
数据结构教会我的不但是每一个算法,更多的是如何解决问题的方法。
例如,在本次课程设计中我做的是校园导航系统,对于校园导航问题的关键是最短路径的问题,在教材中有算法——迪杰斯特拉求最短路径问题,在花了几天时间后,终于能够将算法的整个流程弄清楚,在对各个定点的存储上采用邻接矩阵的方法,在寻找各个点到其他所有点的关系的时候更为方便直观。
在课程设计中遇到的一系列问题都能够在老师和同学的指导下及时解决。
最后,感谢一年来为我们付出努力的老师们,感谢给过我指导意见的同学们,在这一年对数据结构的学习中,真的收获颇多,为我以后继续学习计算机的基础课程打下了坚实的基础。
7.附录
7.1源代码
Creat.cpp
#include
#defineMAX_V36
#defineINFINITY32767
typedefstruct{
char*vexs[MAX_V];
intarcs[MAX_V][MAX_V];
intvexnum,arcnum;
}MGraph;
intCreateUDN(MGraph&G)
{
inti=0,j=0;
G.vexnum=36;
G.arcnum=49;
G.vexs[0]="校门";G.vexs[1]="工程训练中心";G.vexs[2]="校办公楼";G.vexs[3]="17号教学楼(电控,继教)";G.vexs[4]="16号教学楼(计算机,通信)";G.vexs[5]="2号教学楼(人外)";
G.vexs[6]="1号教学楼(艺术)";G.vexs[7]="15号教学楼(管理,档案室)";G.vexs[8]="14号教学楼(能源)";G.vexs[9]="3号教学楼";G.vexs[10]="实验楼";G.vexs[11]="13号教学楼(建工)";
G.vexs[12]="12号教学楼(化工,材料)";
G.vexs[13]="11号教学楼(地环,测绘)";G.vexs[14]="图书馆";
G.vexs[15]="10号教学楼(机械)";G.vexs[16]="9号教学楼(阶梯教室)";G.vexs[17]="体育馆";G.vexs[18]="第二俱乐部";G.vexs[19]="综合楼,校医院";G.vexs[20]="一,二号学生公寓";
G.vexs[21]="第一学生食堂";G.vexs[22]="教师公寓";G.vexs[23]="三,四,五号学生公寓";G.vexs[24]="水房";G.vexs[25]="超市";G.vexs[26]="田径场";
G.vexs[27]="六,七号学生公寓";G.vexs[28]="体育场";G.vexs[29]="第二学生食堂";G.vexs[30]="浴室";G.vexs[31]="后勤用房";G.vexs[32]="十,十一,十二,十三号学生公寓";
G.vexs[33]="游泳池";G.vexs[34]="十四,十五,十六号学生公寓";G.vexs[35]="八,九号学生公寓";
for(i=0;ifor(j=0;j{
if(i==j)
G.arcs[i][j]=0;
else
G.arcs[i][j]=INFINITY;
}
G.arcs[0][2]=G.arcs[2][0]=900;
G.arcs[1][2]=G.arcs[2][1]=340;
G.arcs[1][3]=G.arcs[3][1]=80;
G.arcs[2][5]=G.arcs[5][2]=240;
G.arcs[2][6]=G.arcs[6][2]=300;
G.arcs[3][4]=G.arcs[4][3]=80;
G.arcs[4][5]=G.arcs[5][4]=340;
G.arcs[4][7]=G.arcs[7][4]=80;
G.arcs[5][6]=G.arcs[6][5]=180;
G.arcs[5][9]=G.arcs[9][5]=180;
G.arcs[6][9]=G.arcs[9][6]=250;
G.arcs[6][10]=G.arcs[10][6]=50;
G.arcs[7][8]=G.arcs[8][7]=80;
G.arcs[8][11]=G.arcs[11][8]=110;
G.arcs[9][10]=G.arcs[10][9]=180;
G.arcs[9][14]=G.arcs[14][9]=220;
G.arcs[10][14]=G.arcs[14][10]=240;
G.arcs[11][12]=G.arcs[12][11]=80;
G.arcs[12][13]=G.arcs[13][12]=80;
G.arcs[13][14]=G.arcs[14][13]=350;
G.arcs[13][15]=G.arcs[15][13]=80;
G.arcs[14][19]=G.arcs[19][14]=70;
G.arcs[14][18]=G.arcs[18][14]=90;
G.arcs[14][20]=G.arcs[20][14]=50;
G.arcs[14][22]=G.arcs[22][14]=45;
G.arcs[15][16]=G.arcs[16][15]=80;
G.arcs[16][18]=G.arcs[18][16]=300;
G.arcs[17][18]=G.arcs[18][17]=20;
G.arcs[18][19]=G.arcs[19][18]=10;
G.arcs[19][20]=G.arcs[20][19]=15;
G.arcs[20][21]=G.arcs[21][20]=10;
G.arcs[21][23]=G.arcs[23][21]=20;
G.arcs[21][22]=G.arcs[22][21]=43;
G.arcs[21][25]=G.arcs[25][21]=26;
G.arcs[23][25]=G.arcs[25][23]=30;
G.arcs[25][30]=G.arcs[30][25]=18;
G.arcs[30][31]=G.arcs[31][30]=20;
G.arcs[26][16]=G.arcs[16][26]=10;
G.arcs[26][27]=G.arcs[27][26]=50;
G.arcs[27][29]=G.arcs[29][27]=30;
G.arcs[27][28]=G.arcs[28][27]=40;
G.arcs[29][30]=G.arcs[30][29]=15;
G.arcs[29][32]=G.arcs[32][29]=70;
G.arcs[28][32]=G.arcs[32][28]=100;
G.arcs[28][35]=G.arcs[35][28]=100;
G.arcs[28][34]=G.arcs[34][28]=160;
G.arcs[33][34]=G.arcs[34][33]=35;
G.arcs[34][35]=G.arcs[35][34]=60;
G.arcs[34][26]=G.arcs[26][34]=100;
return1;
}
Short_path.cpp
#include
#defineMAX_V36
#defineINFINITY32767
typedefstruct
{
char*vexs[MAX_V];
intarcs[MAX_V][MAX_V];
intvexnum,arcnum;
}MGraph;
externhave[36];
voidShortPath(MGraph&G,intv0,intp[MAX_V][MAX_V],intd[])
{
intv,w,i,j,min;
intfinal[MAX_V];
intk=1;
for(v=0;v{//初始化
final[v]=0;
d[v]=G.arcs[v0-1][v];
for(w=0;wp[v][w]=0;
if(d[v]{
p[v][v0-1]=1;
p[v][v]=1;
}
}
d[v0-1]=0;
final[v0-1]=1;
have[0]=v0-1;
for(i=1;i{//其余的vexnum-1个顶点
min=INFINITY;
for(w=0;wif(!
final[w])
if(d[w]{
v=w;
min=d[w];
}
final[v]=1;
have[k]=v;
k++;
for(w=0;wif(!
final[w]&&(min+G.arcs[v][w]{
d[w]=min+G.arcs[v][w];
for(j=0;jp[w][j]=p[v][j];
p[w][w]=1;
}
}
}
Menu.cpp
#include
voidmenu()
{
printf("☆☆☆☆☆☆☆☆☆☆☆☆☆导航主菜单☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf("☆
(1)校门
(2)工程训练中心(3)校办公楼☆\n");
printf("☆(4)17号教学楼(电控,继教)(5)16号教学楼(计算机,通信)(6)2号教学楼(人外)☆\n");
printf("☆(7)1号教学楼(艺术)(8)15号教学楼(管理,档案室)(9)14号教学楼(能源)☆\n");
printf("☆(10)3号教学楼(11)实验楼(12)13号教学楼(建工)☆\n");
printf("☆(13)12号教学楼(化工,材料)(14)11号教学楼(地环,测绘)(15)图书馆☆\n");
printf("☆(16)10号教学楼(机械)(17)9号教学楼(阶梯教室)(18)体育馆☆\n");
printf("☆(19)第二俱乐部(20)综合楼,校医院(21)1,2号学生公寓☆\n");
printf("☆(22)第一学生食堂(23)教师公寓(24)3,4,5号学生公寓☆\n");
printf("☆(25)水房(26)超市(27)田径场☆\n");
printf("☆(28)6,7号学生公寓(29)体育场(30)第二学生食堂☆\n");
printf("☆(31)浴室(32)后勤用房(33)10,11,12,13号学生公寓☆\n");
printf("☆(34)游泳池(35)14,15,16学生公寓(36)8,9号学生公寓☆\n");
printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n\n");
printf("请选择导航功能:
\n");
printf("≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈\n");
printf("≈
(1)景点信息简绍≈\n");
printf("≈
(2)两点最短距离导航≈\n");
printf("≈(3)某点到其他所有点的最短距离≈\n");
printf("≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈\n");
}
Main.cpp
#include
#include
#include
#defineMAX_V36
#defineINFINITY32767
typedefstruct
{
char*vexs[MAX_V];
intarcs[MAX_V][MAX_V];
intvexnum,arcnum;
}MGraph;
inthave[36];
intCreateUDN(MGraph&G);
voidShortPath(MGraph&G,intv0,intp[MAX_V][MAX_V],intd[]);
voidmenu();
voidmain()
{
system("modecon:
cols=140lines=130");
MGraphG;
intv0,i,end,j;
intP[MAX_V][MAX_V];
intD[MAX_V];
intchoice,choice1;
printf("≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈\n");
printf("\n≈≈欢迎光临西安科技大学,祝旅程愉快!
≈≈\n");
printf("\n≈≈西安科技大学校园导游系统为你服务!
≈≈\n");
printf("\n≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈\n\n");CreateUDN(G);
while
(1)
{
menu();
scanf("%d",&choice);
switch(choice)
{
case1:
{
printf("校门:
学校大门\n");
printf("工程训练中心:
工程实验训练中心\n");
printf("校办公楼:
行政办公楼\n");
printf("17号教学楼(电控,继教):
电气控制与自动化学院和继续教育学院合楼\n");
printf("16号教学楼(计算机,通信):
计算机科学与技术学院和通信学院合楼\n");
printf("2号教学楼(人外):
人文外国语\n");
printf("1号教学楼(艺术):
艺术学院\n");
printf("15号教学楼(管理,档案室):
管理学院和档案管理室\n");
printf("14号教学楼(能源):
能源学院\n");
printf("3号教学楼:
教学楼不解释\n");
printf("实验楼:
做实验的教学楼\n");
printf("13号教学楼(建工):
建工学院\n");
printf("12号教学楼(化工,材料):
化工学院与材料学院的合楼\n");
printf("11号教学楼(地环,测绘):
地环学院与测绘学院的合楼\n");
printf("图书馆:
知识的海洋\n");
printf("10号教学楼(机械):
机械学院\n");
printf("9号教学楼:
阶梯教室\n");
printf("体育馆:
体育锻炼的场所\n");
printf("第二俱乐部:
简称二俱\n");
printf("综合楼,校医院:
生病就医的场所\n");
printf("1,2号学生公寓:
学生宿舍没有空调夏天有火炉之称\n");
printf("第一学生食堂:
小食堂饭不好吃\n");
printf("教师公寓:
老师宿舍有空调慢慢的羡慕\n");
printf("3,4,5号学生公寓:
女生宿舍楼不解释\n");
printf("水房:
打水的地方\n");
printf("超市:
买生活用品以及零食的场所\n");
printf("田径场:
体育锻炼\n");
printf("6,7号学生公寓:
男生宿舍楼不解释\n");
printf("体育场:
篮球场网球场集中地\n");
printf("第二学生食堂:
食堂饭不好吃啊\n");
printf("浴室:
洗地方澡的\n");
printf("后勤用房:
食堂工作人员的住处\n");
printf("10,11,12,13号学生公寓:
学生公寓在西科之巅\n");
printf("游泳池:
游泳池的水并不干净啊水面上头发啊树叶啊什么都有\n");
printf("14,15,16学生公寓:
学生宿舍同在西科之巅\n");
printf("8,9号学生公寓:
学生宿舍\n");
}
break;
case2:
{
while
(1)
{
printf("分别输入起点和终点代号以空格分开\n");
scanf("%d%d",&v0,&end);
ShortPath(G,v0,P,D);
printf("最短路径:
\n");
for(i=0;i{
if(P[end-1][have[i]]==1)
printf("-->%s",G.vexs[have[i]]);
}
pr