校园导游程序.docx
《校园导游程序.docx》由会员分享,可在线阅读,更多相关《校园导游程序.docx(27页珍藏版)》请在冰豆网上搜索。
校园导游程序
校园导游程序
洛阳理工学院
课程设计报告
课程名称数据结构课程设计
题目校园导游程序
(15)intAddnewsight(intn);/*添加新的景点和路径*/
(16)intDeletesight(intn);/*删除景点和路径*/
5、数据结构类型定义
typedefstructArcCell{
intadj;/*相邻接的景点之间的路程*/
}ArcCell;/*定义边的类型*/
typedefstructVertexType{
intnumber;/*景点编号*/
charsight[100];/*景点名称*/
chardescription[1000];/*景点描述*/
}VertexType;/*定义顶点的类型*/
typedefstruct{
VertexTypevex[20];/*图中的顶点,即为景点*/
ArcCellarcs[20][20];/*图中的边,即为景点间的距离*/
intvexnum,arcnum;/*顶点数,边数*/
}MGraph;/*定义图的类型*/
6、测试结果
1、查询景点信息
2、
查询两景点间最短路径
3、查询两景点间所有路径
4、添加新的景点和路径
5、删除已有的景点和路径
6、修改删除已有的景点和路径
7、实验心得
经过几天的课程设计,总的来说收获还是很大的!
首先代码能力明显提高,有了想法基本都能顺利表达出来;再者就是数据结构的选择使用能力也有了很大的提高!
虽说平时的实验课我们也有用各种数据做题,但那些都是很明确的知道该做什么操作,存什么,我们的发挥空间不大一般照做就行,然而这次实习我们却在自主的选择判断,这本身就是一个很大的提高!
还有就是算法方面的学习有了初步进阶,如最短路径,这样比较简单的图论算法能比较熟练的写出来。
但是还是有很多的只是不了解!
收获真的很多,但是最大的收获可能就是对编程的兴趣吧,在一次次的改错,一次次的完成想要的效果后,越写越有感觉!
当然还收获了无知,更确切的说是自知,原来我们现在什么也不算,还有很多有用的只是等着我们去学习!
课程设计是把我们所学的理论知识进行系统的总结并应用于实践的良好机会,有利于加强我们用知识理论来分析实际问题的能力,进而加强了我们对知识认识的实践度,巩固了我们的理论知识,深化了对知识的认识,并为走向社会打下一个良好的基础。
8、源程序
#include
#include
#include
#include
#include
#defineMax20000
typedefstructArcCell
{
intadj;/*相邻接的景点之间的路程*/
}ArcCell;/*定义边的类型*/
typedefstructVertexType
{
intnumber;/*景点编号*/
charsight[100];/*景点名称*/
chardescription[1000];/*景点描述*/
}VertexType;/*定义顶点的类型*/
typedefstruct
{
VertexTypevex[20];/*图中的顶点,即为景点*/
ArcCellarcs[20][20];/*图中的边,即为景点间的距离*/
intvexnum,arcnum;/*顶点数,边数*/
}MGraph;/*定义图的类型*/
MGraphG;/*把图定义为全局变量*/
charnameofschool[100];
intNUM=9;
intP[20][20];/**/
intp[20];/*全局数组,用来存放路径上的各顶点*/
intvisited[20];/*全局数组,用来记录各顶点被访问的情况*/
inta=0;/*全局变量,用来记录每对顶点之间的所有路径的条数*/
longintD[20];/*辅助变量存储最短路径长度*/
intx[20]={0};
voidCreateUDN(intv,inta);/*造图函数*/
voidnarrate();/*说明函数*/
voidShortestPath(intnum);/*最短路径函数*/
voidoutput(intsight1,intsight2);/*输出函数*/
charMenu();/*主菜单*/
voidsearch();/*查询景点信息*/
charSearchMenu();/*查询子菜单*/
voidHaMiTonian(int);/*图的遍历*/
voidSearchpath1(MGraphg);/*查询两个景点间的所有路径*/
voiddisppath(MGraphg,inti,intj);
voidpath(MGraphg,inti,intj,intk);/*确定路径上第k+1个顶点的序号*/
voidNextValue(int);
voiddisplay();/*显示遍历结果*/
intAddnewsight(intn);/*添加新的景点和路径*/
intDeletesight(intn);/*删除景点和路径*/
voidChangesight();/*修改景点和路径*/
charChangemenu();/*修改路径或顶点的选择菜单*/
charSightmenu();/*选择需该景点的菜单*/
voidmain()/*主函数*/
{
intv0,v1;
charck;
system("color0");
CreateUDN(NUM,11);
do
{
ck=Menu();
switch(ck)
{
case'1':
search();
break;
case'2':
system("cls");
narrate();
printf("\n\n\t\t\t请选择起点景点(0~%d):
",NUM-1);
scanf("%d",&v0);
printf("\t\t\t请选择终点景点(0~%d):
",NUM-1);
scanf("%d",&v1);
ShortestPath(v0);/*计算两个景点之间的最短路径*/
output(v0,v1);/*输出结果*/
printf("\n\n\t\t\t\t请按任意键继续...\n");
getchar();
getchar();
break;
case'3':
system("cls");
narrate();
x[0]=1;
Searchpath1(G);
printf("\n\n\t\t\t\t请按任意键继续...\n");
getchar();
getchar();
break;
case'4':
system("cls");
narrate();
NUM=Addnewsight(NUM);
system("cls");
narrate();
break;
case'5':
NUM=Deletesight(NUM);
break;
case'6':
Changesight();
break;
};
}
while(ck!
='e');
}
charMenu()/*主菜单*/
{
charc;
intflag;
do{
flag=1;
system("cls");
narrate();
printf("\n\t\t\t┏━━━━━━━━━━━━━━━┑\n");
printf("\t\t\t┃┃\n");
printf("\t\t\t┃1、查询景点信息┃\n");
printf("\t\t\t┃2、查询两景点间最短路径┃\n");
printf("\t\t\t┃3、查询两景点间所有路线┃\n");
printf("\t\t\t┃4、添加新的景点和路径┃\n");
printf("\t\t\t┃5、删除已有景点和路径┃\n");
printf("\t\t\t┃6、修改已有景点和路径┃\n");
printf("\t\t\t┃e、退出┃\n");
printf("\t\t\t┃┃\n");
printf("\t\t\t┗━━━━━━━━━━━━━━━┛\n");
printf("\t\t\t\t请输入您的选择:
");
scanf("%c",&c);
if(c=='1'||c=='2'||c=='3'||c=='4'||c=='5'||c=='6'||c=='e')
flag=0;
}while(flag);
returnc;
}
charSearchMenu()/*查询子菜单*/
{
charc;
intflag;
do{
flag=1;
system("cls");
narrate();
printf("\n\t\t\t┏━━━━━━━━━━━━━━━┑\n");
printf("\t\t\t┃┃\n");
printf("\t\t\t┃1、按照景点编号查询┃\n");
printf("\t\t\t┃2、按照景点名称查询┃\n");
printf("\t\t\t┃e、返回┃\n");
printf("\t\t\t┃┃\n");
printf("\t\t\t┗━━━━━━━━━━━━━━━┛\n");
printf("\t\t\t\t请输入您的选择:
");
scanf("%c",&c);
if(c=='1'||c=='2'||c=='e')
flag=0;
}while(flag);
returnc;
}
voidsearch()/*查询景点信息*/
{
intnum;
inti;
charc;
charname[20];
do
{
system("cls");
c=SearchMenu();
switch(c)
{
case'1':
system("cls");
narrate();
printf("\n\n\t\t请输入您要查找的景点编号:
");
scanf("%d",&num);
for(i=0;i{
if(num==G.vex[i].number)
{
printf("\n\n\t\t\t您要查找景点信息如下:
");
printf("\n\n\t\t\t%-25s\n\n",G.vex[i].description);
printf("\n\t\t\t按任意键返回...");
getchar();
getchar();
break;
}
}
if(i==NUM)
{
printf("\n\n\t\t\t没有找到!
");
printf("\n\n\t\t\t按任意键返回...");
getchar();
getchar();
}
break;
case'2':
system("cls");
narrate();
printf("\n\n\t\t请输入您要查找的景点名称:
");
scanf("%s",name);
for(i=0;i{
if(!
strcmp(name,G.vex[i].sight))
{
printf("\n\n\t\t\t您要查找景点信息如下:
");
printf("\n\n\t\t\t%-25s\n\n",G.vex[i].description);
printf("\n\t\t\t按任意键返回...");
getchar();
getchar();
break;
}
}
if(i==NUM)
{
printf("\n\n\t\t\t没有找到!
");
printf("\n\n\t\t\t按任意键返回...");
getchar();
getchar();
}
break;
}
}while(c!
='e');
}
voidCreateUDN(intv,inta)/*造图函数*/
{
inti,j;
strcpy(nameofschool,"洛阳理工学院");
G.vexnum=v;/*初始化结构中的景点数和边数*/
G.arcnum=a;
for(i=0;i<20;++i)G.vex[i].number=i;/*初始化每一个景点的编号*/
/*初始化每一个景点名及其景点描述*/
strcpy(G.vex[0].sight,"东门");
strcpy(G.vex[0].description,"学校正门,图书馆。
");
strcpy(G.vex[1].sight,"图书馆");
strcpy(G.vex[1].description,"藏书100万册,环境优雅");
strcpy(G.vex[2].sight,"教学楼");
strcpy(G.vex[2].description,"学生上课的地方");
strcpy(G.vex[3].sight,"子衿餐厅");
strcpy(G.vex[3].description,"一餐厅,新装修过的豪华餐厅");
strcpy(G.vex[4].sight,"实验A楼");
strcpy(G.vex[4].description,"办公室");
strcpy(G.vex[5].sight,"B楼");
strcpy(G.vex[5].description,"机房");
strcpy(G.vex[6].sight,"C楼");
strcpy(G.vex[6].description,"电气实验教室");
strcpy(G.vex[7].sight,"璞院餐厅");
strcpy(G.vex[7].description,"二餐厅");
strcpy(G.vex[8].sight,"璞院");
strcpy(G.vex[8].description,"男生的宿舍楼");
/*这里把所有的边假定为20000,含义是这两个景点之间是不可到达*/
for(i=0;i<20;++i)
for(j=0;j<20;++j)
G.arcs[i][j].adj=Max;
/*
下边是可直接到达的景点间的距离,由于两个景点间距离是互相的,
所以要对图中对称的边同时赋值。
*/
G.arcs[0][1].adj=G.arcs[1][0].adj=50;
G.arcs[1][3].adj=G.arcs[3][1].adj=70;
G.arcs[0][6].adj=G.arcs[3][0].adj=250;
G.arcs[1][4].adj=G.arcs[4][1].adj=80;
G.arcs[2][4].adj=G.arcs[4][2].adj=100;
G.arcs[3][5].adj=G.arcs[5][3].adj=90;
G.arcs[5][2].adj=G.arcs[2][5].adj=100;
G.arcs[4][6].adj=G.arcs[6][4].adj=75;
G.arcs[4][7].adj=G.arcs[7][4].adj=300;
G.arcs[2][7].adj=G.arcs[7][2].adj=400;
G.arcs[7][8].adj=G.arcs[8][7].adj=40;
}
voidnarrate()/*说明函数*/
{
inti,k=0;
printf("\n\t***************欢迎使用%s校园导游程序**************\n",nameofschool);
printf("\t__________________________________________________________________\n");
printf("\t\t景点名称\t\t\t\t景点描述\t\t\t\n");
printf("\t________________________________|_________________________________\n");
for(i=0;i{
printf("\t%c(%2d)%-10s\t\t|\t%-25s%c\n",3,i,G.vex[i].sight,G.vex[i].description,3);/*输出景点列表*/
k=k+1;
}
printf("\t________________________________|_________________________________\n");
}
voidShortestPath(intnum)/*迪杰斯特拉算法最短路径函数num为入口点的编号*/
{
intv,w,i,t;/*i、w和v为计数变量*/
intfinal[20];/**/
intmin;
for(v=0;v{
final[v]=0;/*假设从顶点num到顶点v没有最短路径*/
D[v]=G.arcs[num][v].adj;/*将与之相关的权值放入D中存放
*/
for(w=0;wP[v][w]=0;
if(D[v]<20000)/*存在路径*/
{
P[v][num]=1;/*存在标志置为一*/
P[v][v]=1;/*自身到自身*/
}
}
D[num]=0;
final[num]=1;/*初始化num顶点属于S集合*/
/*开始主循环,每一次求得num到某个顶点的最短路径,并将其加入到S集合*/
for(i=0;i{
min=Max;/*当前所知离顶点num的最近距离*/
for(w=0;wif(!
final[w])/*w顶点在v-s中*/
if(D[w]{
v=w;
min=D[w];
}
final[v]=1;/*离num顶点更近的v加入到s集合*/
for(w=0;wif(!
final[w]&&((min+G.arcs[v][w].adj){
D[w]=min+G.arcs[v][w].adj;
for(t=0;tP[w][t]=P[v][t];
P[w][w]=1;
}
}
}
voidoutput(intsight1,intsight2)/*输出函数*/
{
inta,b,c,d,q=0;
a=sight2;/*将景点二赋值给a*/
if(a!
=sight1)/*如果景点二不和景点一输入重合,则进行...*/
{
printf("\n\t从%s到%s的最短路径是",G.vex[sight1].sight,G.vex[sight2].sight);/*输出提示信息*/
printf("\t(最短距离为%dm.)\n\n\t",D[a]);/*输出sight1到sight2的最短路径长度,存放在D[]数组中*/
printf("\t%s",G.vex[sight1].sight);/*输出景点一的名称*/
d=sight1;/*将景点一的编号赋值给d*/
for(c=0;c{
gate:
;/*标号,可以作为goto语句跳转的位置*/
P[a][sight1]=0;
for(b=0;b{
if(G.arcs[d][b].adj<20000&&P[a][b])/*如果景点一和它的一个临界点之间存在路径且最短路径*/
{
printf("-->%s",G.vex[b].sight);/*输出此节点的名称*/
q=q+1;/*计数变量加一,满8控制输出时的换行*/
P[a][b]=0;
d=b;/*将b作为出发点进行下一次循环输出,如此反复*/
if(q%8==0)printf("\n");
gotogate;
}
}
}
}
}
voidSearchpath1(MGraphg)/*查询两个景点间的所有路径*/
{
intl=0;
intk=0;
inti,j;
printf("选择出发景点:
");
scanf("%d",&i);
printf("选择目地景点:
");
scanf("%d",&j);
for(;kif(i==g.vex[k].number)i=k;/*在网中找到其编号与输入的出发景点的编号相同的顶点*/
for(;lif(j==g.vex[l].number)j=l;/*在网中找到其编号与输入的目地景点的编号相同的顶点*/\
printf("\n从%s到%s的所有游览路径有:
\n\n",g.vex[i].sight,g.vex[j].sight);/*输出出发景点和目地景点的名称*/
disppath(g,i,j);/*调用disppath函数,用来输出两个景点间的所有路径*/
}
voiddisppath(MGraphg,inti,intj)
{
intk;
p[0]=i;
for(k=0;kvisited[i]=0;/*初始化各顶点的访问标志位,即都为未访问过的*/
a=0;/*初始化路径的条数*/
path(g,i,j,0);/*通过调用path函数,找到从vi到vj的所有路径并输出*/
}
voidpath(MGraphg,inti,intj,intk)
/*确定路径上第k+1个顶点的序号*/
{