校园导游系统实验报告1Word文档下载推荐.docx
《校园导游系统实验报告1Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《校园导游系统实验报告1Word文档下载推荐.docx(15页珍藏版)》请在冰点文库上搜索。
若G中存在顶点u,则返回该顶点在图中的位置;
否则返回其他信息。
GetVex(G,v);
图G存在,v是G中的某个顶点。
返回v的值。
FirstAdjVex(G,v);
返回v的第一个邻接顶点。
若没有邻接点则返回为空。
NextAdjVex(G,v,w);
返回v的(相对于w的)下一个邻接顶点。
若w是v的最后一个邻接点,则返回空。
本程序用到了8个函数,函数列表如下:
1)主函数main()函数
2)对图中的节点进行初始化的InitGraph()函数
3)显示景点平面图和操作提示的Menu()函数
4)执行选择操作的功能的cmd()函数
5)显示所有景点描述信息的Browser()函数
6)实现迪杰斯特拉算法的ShortestPath_DIJ()函数
7)实现弗洛伊德算法的Floyd()函数
8)显示具体景点信息的Search()函数
各函数之间的调用关系如下:
3、详细设计:
typedefstructArCell{
intadj;
}ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct{//图中顶点表示主要景点,存放景点的编号、名称、简介等信息,
charname[30];
intnum;
charintroduction[100];
}infotype;
typedefstruct{
infotypevexs[MAX_VERTEX_NUM];
AdjMatrixarcs;
intvexnum,arcnum;
}MGraph;
MGraphG;
Creategraph(&
G,V,VR){
Initial(G);
//初始化G
}
GetVex(G,v){
while(flag){
printf("
请输入要查询的景点编号:
"
);
scanf("
%d"
&
k);
while(k<
0||k>
=G->
vexnum){
景点编号不存在!
请重新输入景点编号:
}
if(k>
=0&
&
k<
G->
vexnum)
flag=0;
printf(G->
vexs[k].data)//输出查找的节点的信息
4、源程序代码:
#defineINFINITY10000/*无穷大*/
#defineMAX_VERTEX_NUM40//最大顶点数
#defineMAX40
#include<
stdlib.h>
stdio.h>
conio.h>
string.h>
windows.h>
typedefstructArCell{
typedefstruct{//图中顶点表示主要景点,存放景点的编号、名称、景点描述等信息,
MGraphb;
voidcmd(void);
MGraphInitGraph(void);
voidMenu(void);
voidBrowser(MGraph*G);
voidShortestPath_DIJ(MGraph*G);
voidFloyd(MGraph*G);
voidSearch(MGraph*G);
intLocateVex(MGraph*G,char*v);
voidmain(void){//主函数
system("
colorec"
modecon:
cols=110lines=30"
cmd();
voidcmd(void){
inti;
b=InitGraph();
Menu();
i);
while(i!
=5){
switch(i){
case1:
system("
cls"
Browser(&
b);
Menu();
break;
case2:
ShortestPath_DIJ(&
case3:
Floyd(&
case4:
Search(&
default:
}}
MGraphInitGraph(void){
MGraphG;
inti,j;
G.vexnum=10;
G.arcnum=24;
for(i=0;
i<
G.vexnum;
i++)
G.vexs[i].num=i;
strcpy(G.vexs[0].name,"
综合食堂"
strcpy(G.vexs[0].introduction,"
新建标准化食堂"
strcpy(G.vexs[1].name,"
东西办公楼"
strcpy(G.vexs[1].introduction,"
全体教师办公场所,楼高12层,各种设施齐全"
strcpy(G.vexs[2].name,"
7号学生宿舍楼"
strcpy(G.vexs[2].introduction,"
数理系男生宿舍楼,设备优良,顶层夏热冬冷,时常断水"
strcpy(G.vexs[3].name,"
医院"
strcpy(G.vexs[3].introduction,"
校医院,设施不是很齐全,只能看小病,收费较贵"
strcpy(G.vexs[4].name,"
图书馆"
strcpy(G.vexs[4].introduction,"
藏书60万册,设施良好,2楼为电子阅览室,环境幽雅"
strcpy(G.vexs[5].name,"
足球场"
strcpy(G.vexs[5].introduction,"
现代化塑胶跑道,人造草坪,适宜锻炼身体的场所"
strcpy(G.vexs[6].name,"
沁园"
strcpy(G.vexs[6].introduction,"
绿树成荫,适宜休息和读书"
strcpy(G.vexs[7].name,"
主教学楼"
strcpy(G.vexs[7].introduction,"
学院最大的教学楼,共5层,环形建筑,适宜学习"
strcpy(G.vexs[8].name,"
西教学楼"
strcpy(G.vexs[8].introduction,"
学院第二大教学楼,环境较差"
strcpy(G.vexs[9].name,"
多媒体楼"
strcpy(G.vexs[9].introduction,"
多媒体教学场所,设施先进,环境良好"
for(j=0;
j<
j++)
G.arcs[i][j].adj=INFINITY;
G.arcs[0][1].adj=120;
G.arcs[0][2].adj=150;
G.arcs[0][3].adj=195;
G.arcs[1][6].adj=210;
G.arcs[1][3].adj=100;
G.arcs[1][2].adj=180;
G.arcs[1][7].adj=215;
G.arcs[2][5].adj=350;
G.arcs[3][4].adj=100;
G.arcs[3][6].adj=110;
G.arcs[3][7].adj=175;
G.arcs[4][6].adj=20;
G.arcs[5][6].adj=110;
G.arcs[4][5].adj=100;
G.arcs[4][9].adj=80;
G.arcs[5][9].adj=150;
G.arcs[5][8].adj=200;
G.arcs[6][8].adj=80;
G.arcs[6][7].adj=60;
G.arcs[6][9].adj=70;
G.arcs[7][9].adj=120;
G.arcs[7][8].adj=80;
G.arcs[8][9].adj=150;
G.arcs[j][i].adj=G.arcs[i][j].adj;
returnG;
Sleep(2500);
voidShortestPath_DIJ(MGraph*G){
intv,w,i,min,t=0,x,flag=1,v0;
intfinal[20],D[20],p[20][20];
while(flag){
printf("
请输入一个起始景点编号:
v0);
while(v0<
0||v0>
vexnum){
if(v0>
v0<
for(v=0;
v<
vexnum;
v++){
final[v]=0;
D[v]=G->
arcs[v0][v].adj;
for(w=0;
w<
w++)
p[v][w]=0;
if(D[v]<
INFINITY){
p[v][v0]=1;
p[v][v]=1;
}
D[v0]=0;
final[v0]=1;
for(i=1;
i++){
min=INFINITY;
if(!
final[w])
if(D[w]<
min)
{v=w;
min=D[w];
}
final[v]=1;
w++)
final[w]&
(min+G->
arcs[v][w].adj<
D[w])){
D[w]=min+G->
arcs[v][w].adj;
for(x=0;
x<
x++)
p[w][x]=p[v][x];
p[w][w]=1;
}}
v++)
{if(v0!
=v)
{printf("
%s"
G->
vexs[v0].name);
if(v0<
v){
w++){
if(p[v][w]&
w!
=v0&
v0<
v)
printf("
-->
vexs[w].name);
t++;
}}
else{
for(w=G->
vexnum-1;
w>
=0;
w--){
v0>
v)
t++;
}}
if(t>
vexnum-1&
v0!
总路线长%dm\n\n"
D[v]);
voidFloyd(MGraph*G){
intv,u,i,w,k,j,flag=1,p[10][10][10],D[10][10];
v++)
w++){
D[v][w]=G->
for(u=0;
u<
u++)
p[v][w][u]=0;
if(D[v][w]<
INFINITY){
p[v][w][v]=1;
p[v][w][w]=1;
if(D[v][u]+D[u][w]<
D[v][w]){
D[v][w]=D[v][u]+D[u][w];
i++)
p[v][w][i]=p[v][u][i]||p[u][w][i];
while(flag)
{
请输入出发点和目的地的编号,格式如:
(x->
y):
%d->
k,&
j);
vexnum||j<
0||j>
请重新输入出发点和目的地的编号:
vexnum&
j>
j)
{printf("
所走路径点:
%s-->
G->
vexs[k].name);
for(u=G->
u>
0;
u--)
if(p[k][j][u]&
k!
=u&
j!
k>
vexs[u].name);
vexs[j].name);
总路线长%dm\n"
D[k][j]);
else
if(p[k][j][u]&
voidSearch(MGraph*G)//查找函数。
{
intk,flag=1;
while(flag)
┏━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n"
┃编号┃景点名称┃简介┃\n"
┃%-4d┃%-16s┃%-56s┃\n"
vexs[k].num,G->
vexs[k].name,G->
vexs[k].introduction);
┗━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n"
Sleep(2500);
5、使用说明和功能测试:
程序初始执行的界面如下:
输入操作数1,查看全校景点的文字描述:
输入操作数2,查看从一个景点到其余各景点的路径:
输入操作数3,显示从一个景点到指定景点的最短路径:
输入操作数4,可以查看具体景点的详尽的文字描述:
选择5,退出程序。