完整word版数据结构课程设计校园导游图.docx
《完整word版数据结构课程设计校园导游图.docx》由会员分享,可在线阅读,更多相关《完整word版数据结构课程设计校园导游图.docx(19页珍藏版)》请在冰豆网上搜索。
完整word版数据结构课程设计校园导游图
齐齐哈尔大学
计控学院
数据结构课程设计
选题名称:
校园导游图
系(院):
计算机与控制工程学院
专业:
软件工程
班级:
软件121班
姓名:
刘泽强
学号:
2012023019
指导教师:
吴迪
2014年7月1日
数据结构课程设计评分表
班级
软件121
姓名
指导教师
题目:
评分标准
分数权重
评分的依据
得分
A
C
工作态度
10
态度端正,能主动认真完成各项内容,不迟到早退,出勤好。
能够完成各环节基本工作,出勤较好。
程序设计,完成及运行情况
20
功能达到设计要求,程序稳定、界面美观、符合规范、程序易读、完成率100%、程序运行正确。
功能实现了大部分,程序较稳定、界面可用性一般、程序有注释、完成率不足70%。
相关文档
40
格式规范,层次清晰,设计思想明确,解决问题方法合理,文档编写完整规范,编写过程符合软件工程开发设计流程等。
格式较规范,设计思想基本明确,解决问题方法较合理,基本遵循软件工程开发流程。
答辨问题回答
30
能准确回答老师提出的问题,并充分理解数据库开发技术,程序逻辑清晰。
能基本准确回答老师提出的问题
总分
指导教师(签字):
注:
介于A和C之间为B级,低于C为D级和E级。
按各项指标打分后,总分90~100为优,80~89为良,70~79为中,60~69为及格,60分以下不及格
一.问题描述
设计你所在的学校的校园平面图,所含景点不少于10个。
以图中顶点表示校内各景点,存放景点的名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
(2)为来访客人提供图中任意景点相关信息的查询。
(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的最短的简单路径。
二、程序设计
1.用数据结构知识创建校园图。
voidcreatgraph(vexnodeg[],int*n,EdgeTypee[],adjmax*adj)//创建校园图
{
intb,i,s,d,len;
structedgenode*p,*q;//定义图的结构体
2.手动给校园图赋上相关信息(景点名称、代号、简介),路径及路径长度。
得到一个模拟的校园图:
图2.2
3.利用C语言知识编写查找景点相关信息的程序。
手动创建一个校园图creat(Matrix_Graph*G),然后为相应的边赋上真正的值。
主要代码:
do{
printf("是否继续?
Y/N");
scanf("%c",&ch);
getchar();
if(ch=='Y'||ch=='y')//继续
flag=1;
i=1;
printf("请输入您要查询的景点序号:
\n");
scanf("%d",&len);
printf("此景点的名称是:
");
Name(len);
printf("此景点的介绍是:
Information(len);
4.利用迪杰斯特拉算法计算任意两点之间的最短路径。
用path函数来求任意两景点之间的最短路径。
while(c<=N)
t=MAX;
for(i=1;i<=N;i++)
if(flag[i]&&G->arcs[s][i]{t=G->arcs[s][i];v=i;r[v][1]=v;}for(i=1;i<=c;i++)for(j=1;j<=N;j++)if(flag[j]&&d[i]+G->arcs[T[i]][j]{t=d[i]+G->arcs[T[i]][j];v=j;if(r[v][0]!=-1){u=1;while(r[T[i]][u]!=0){r[v][u]=r[T[i]][u];u++;}}r[v][u]=v;}r[v][0]=-1;T[c]=v;flag[v]=0;d[c]=t;c++;}5.最后用一个主函数main输出各项结果。 用switch语句分别输出,要创建校园图时调用creatgraph函数;查找景点相关信息时调用travgraph函数;要查找任意两景点之间的最短路径时,先输入你目前所在的位置,再输入你的目的地,最后调用path函数。 三、运行结果:1.运行结果界面:图-3.12.查找景点相关信息的结果:图3.2 3.查找最短路径的结果:图3.3四、总结1.了解数据结构在编写比较复杂的程序的重要作用;2.对数据结构中定义无向图和创建无向图的理解更加深刻;3.对于函数的原理不太理解,对于其算法的程序编写还是不太明白;4.学会了在编写几百行程序时如何查找错误,如何改错误,不过改错误时有时候是叫同学改的;5.通过本次设计,认识到了自己的很多不足,同时也在其中学到了很多,弥补了自己的不足,今后一定会认真学习知识,多多练习,充实自己在编程方面。 附录:#defineN10#defineMAX20//图中顶点数的最大值#defineMAXedg30//图中边数的最大值#include#include#include#includetypedefintAdjMatrix[MAX][MAX];typedefstruct{intvexs[MAX];AdjMatrixarcs;}Matrix_Graph;//图的矩阵表示法。typedefstructedgenode{intadjvex;//临接点序号intlength;//道路长度charinfo[10];//景点名称charinfo2[100];//景点详细信息structedgenode*next;}edgenode,*Node;typedefstruct{charname[10];//存储景点的名称.charinformation[100];//具体的介绍此景点structedgenode*link;//指向下一个景点}vexnode;//景点及其信息.typedefstructEdge{intlengh;//边的权值,表示路径长度.intivex,jvex;//边的两端顶点号structEdge*next;//指向下一条边}EdgeType;//边及其信息.typedefstruct{intnum;//顶点编号。charname[10];//顶点名称}vertex;typedefstruct{vertexvexs[MAX];//顶点集合intedges[MAX][MAX];//临街矩阵}adjmax;//adjFILE*fp;//文件的读取voidclrscr()//清屏{system("cls");}voidcreatgraph(vexnodeg[],int*n,EdgeTypee[],adjmax*adj)//创建校园图{intb,i,s,d,len;structedgenode*p,*q;//定义图的结构体if((fp=fopen("file.txt","r"))==NULL)//打开文件{printf("文件打开错误!\n");getchar();exit(0);}fscanf(fp,"%d%d\n",n,&b);//读入景点个数和边数for(i=1;i<=*n;i++)//读入景点名称和详细介绍信息{fscanf(fp,"%s%s\n",&g[i].name,&g[i].information);strcpy(adj->vexs[i].name,g[i].name);g[i].link=NULL;//初始化}for(i=1;i<=b;i++){fscanf(fp,"%d%d%d\n",&e[i].lengh,&e[i].ivex,&e[i].jvex);//读入道路长度和起始点s=e[i].ivex;//s是起点,d是终点。d=e[i].jvex;len=e[i].lengh;adj->edges[s][d]=e[i].lengh;//为邻接矩阵中相应的边赋值adj->edges[d][s]=e[i].lengh;p=(Node)malloc(sizeof(edgenode));//申请一个弧节点。p->next=NULL;q=(Node)malloc(sizeof(edgenode));q->next=NULL;p->adjvex=d;//弧p指向的定点p->length=len;strcpy(p->info,g[d].name);//为景点赋名称strcpy(p->info2,g[d].information);//为景点赋介绍信息q->adjvex=s;//弧q指向的定点q->length=len;strcpy(q->info,g[s].name);//为景点赋名称strcpy(q->info2,g[s].information);//为景点赋介绍信息p->next=g[s].link;//头插法建立邻接表g[s].link=p;q->next=g[d].link;g[d].link=q;}printf("校园旅游图已经建立!\n");getchar();}voidName(inti){switch(i){case1:printf("1:学校正门\n\n");break;case2:printf("2:主楼广场\n\n");break;case3:printf("3:图书馆\n\n");break;case4:printf("4:国际交流中心\n\n");break;case5:printf("5:宿舍区\n\n");break;case6:printf("6:二食堂\n\n");break;case7:printf("7:体育馆\n\n");break;case8:printf("8:大操场\n\n");break;case9:printf("9:校医院\n\n");break;case10:printf("10:大学活动中心\n\n");break;default:printf("景点编号输入错误!请输入1->10的数字编号!\n\n");break;}}/*Name*/voidInformation(inti){/*景点介绍*/switch(i){case1:printf("学校正门:正门旁边是一条宽敞的马路,交通方便;进门后直对面就是两栋高大的主楼,气势宏伟。\n\n");break;case2:printf("主楼广场:广场大致圆形,两边是两栋主楼。\n\n");break;case3:printf("图书馆:学校信息资源中心,外表呈'品'字形,两面藏有大量各种书刊,设有电子查阅室和自习室,是学生学习的好地方。\n\n");break;case4:printf("国际交流中心:一楼餐厅(吃饭不贵而且很卫生),楼上是一些留学生和外教的住所。还有一些国际研讨会经常在这里开展。\n\n");break;case5:printf("宿舍区:有一、二、三、四、六、七、九、七个公寓,是大部分学生的住所。\n\n");break;case6:printf("二食堂:坐落在宿舍区,里面有各个地方的小吃,味道不错,是学生就餐的主要餐厅。\n\n");break;case7:printf("体育馆:里面有篮球场,羽毛球场,乒乓球桌,是学校举行各项体育活动的主要场所。\n\n");break;case8:printf("大操场:在体育馆旁边,是学生和老师体育锻炼的主要地方。\n\n");break;case9:printf("校医院:设备不太齐全,只能治疗一些常见的小病,但是价格很便宜。\n\n\n");break;case10:printf("大学活动中心:里面有书店、打印和复印的地方、各种学生组织的办公室。里面还可以举行各项文艺活动。\n\n");break;default:printf("景点编号输入错误!请输入1->10的数字编号!\n\n");break;}}/*Information*/voidtravgraph(vexnodeg[],intn,adjmaxadj)//查找指定景点信息{inti=1,flag=1,len;//len存储要查询的景点的序号charch;printf("请输入您要查询的景点序号:\n");scanf("%d",&len);getchar();printf("此景点的名称是:");Name(len);printf("此景点的介绍是:");Information(len);do{printf("是否继续?Y/N");scanf("%c",&ch);getchar();if(ch=='Y'||ch=='y')//继续{flag=1;i=1;printf("请输入您要查询的景点序号:\n");scanf("%d",&len);getchar();printf("此景点的名称是:");Name(len);printf("此景点的介绍是:");Information(len);continue;}elseflag=0;//不继续break;}while(1);}voidcreat(Matrix_Graph*G){inti,j;for(i=1;i<=N;i++)G->vexs[i]=i;//初始化,0号位不用。for(i=1;i<=N;i++)for(j=1;j<=N;j++)G->arcs[i][j]=0;//初始值为0。G->arcs[1][2]=2;G->arcs[1][9]=5;//表示景点一到景点二的距离是2。G->arcs[2][1]=2;G->arcs[2][3]=5;G->arcs[2][4]=4;G->arcs[2][9]=6;G->arcs[3][2]=5;G->arcs[3][4]=7;G->arcs[3][7]=5;G->arcs[3][9]=6;G->arcs[3][10]=6;G->arcs[4][2]=4;G->arcs[4][6]=7;G->arcs[4][10]=7;G->arcs[5][6]=4;G->arcs[5][7]=6;G->arcs[5][8]=8;G->arcs[6][4]=7;G->arcs[6][5]=4;G->arcs[6][7]=3;G->arcs[6][10]=7;G->arcs[7][6]=3;G->arcs[7][8]=4;G->arcs[7][10]=6;G->arcs[8][5]=8;G->arcs[8][7]=4;G->arcs[8][9]=9;G->arcs[9][1]=5;G->arcs[9][2]=6;G->arcs[9][3]=6;G->arcs[9][8]=9;G->arcs[10][3]=6;G->arcs[10][4]=7;G->arcs[10][6]=7;G->arcs[10][7]=6;for(i=1;i<=N;i++)for(j=1;j<=N;j++)if(G->arcs[i][j]==0)G->arcs[i][j]=MAX;//没有被重新赋值的,表示两景点之间//没有路,用MAX表示无穷大。}voidpath(Matrix_Graph*G,ints,inte){inti,j,u,c=1,t,v;intr[N+1][N+1];//用来存放路径上的景点。intT[N],flag[N],d[N];for(i=0;i<=N;i++)for(j=0;j<=N;j++)r[i][j]=0;//初始值为0。for(i=1;i<=N;i++){T[i]=-1;//初始值为-1。flag[i]=1;//初始值为1。d[i]=MAX;//路径长度初始值为无穷大,用MAX表示。}flag[s]=0;//修改标识。while(c<=N){t=MAX;for(i=1;i<=N;i++)if(flag[i]&&G->arcs[s][i]{t=G->arcs[s][i];v=i;r[v][1]=v;}for(i=1;i<=c;i++)for(j=1;j<=N;j++)if(flag[j]&&d[i]+G->arcs[T[i]][j]{t=d[i]+G->arcs[T[i]][j];v=j;if(r[v][0]!=-1){u=1;while(r[T[i]][u]!=0){r[v][u]=r[T[i]][u];u++;}}r[v][u]=v;}r[v][0]=-1;T[c]=v;flag[v]=0;d[c]=t;c++;}printf("\nThepathis:\n(%d)",s);j=1;while(r[e][j]!=0){printf("-->(%d)",r[e][j]);j++;}//显示路径。printf("\n\n");}intmain()//主函数{inti,j;Matrix_GraphG;creat(&G);intn=0;//景点数目vexnodeg[MAX];//保存顶点及其信息EdgeTypee[MAXedg];//保存边及其信息adjmaxadj;//保存边和定点charchoice='x';while(1){clrscr();printf("\n\n\t\t\t***校园导游系统***");printf("\n\t\t*************************************\n\n");printf("\t\t\t1.文件读入并创建校园图:\n\n");printf("\t\t\t2.查询景点详细信息:\n\n");printf("\t\t\t3.查找两景点间最短路径:\n\n");printf("\t\t\t0.退出\n\n");printf("\t\t\tWriteByEdvis@2009/07/06");printf("\n\t\t************************************\n\n");printf("Pleaseenteryourchoice(0-3):\n");choice=getchar();switch(choice){case'1':clrscr();creatgraph(g,&n,e,&adj);//创建图(景点,景点数,边,边和景点)printf("\n打开文件错误\n");getchar();break;case'2':clrscr();travgraph(g,n,adj);//查询景点信息getchar();break;case'3':clrscr();printf("\2你目前的位置是:\n");scanf("%d",&i);getchar();printf("\2你的目的地是:\n");scanf("%d",&j);getchar();path(&G,i,j);//查找最短路径getchar();creat(&G);do{printf("是否继续?Y/N");charch;intflag=1;scanf("%c",&ch);getchar();if(ch=='Y'||ch=='y')//继续{flag=1;i=1;printf("\2你目前的位置是:\n");scanf("%d",&i);getchar();printf("\2你的目的地是
t=G->arcs[s][i];v=i;r[v][1]=v;}
for(i=1;i<=c;i++)
for(j=1;j<=N;j++)
if(flag[j]&&d[i]+G->arcs[T[i]][j]{t=d[i]+G->arcs[T[i]][j];v=j;if(r[v][0]!=-1){u=1;while(r[T[i]][u]!=0){r[v][u]=r[T[i]][u];u++;}}r[v][u]=v;}r[v][0]=-1;T[c]=v;flag[v]=0;d[c]=t;c++;}5.最后用一个主函数main输出各项结果。 用switch语句分别输出,要创建校园图时调用creatgraph函数;查找景点相关信息时调用travgraph函数;要查找任意两景点之间的最短路径时,先输入你目前所在的位置,再输入你的目的地,最后调用path函数。 三、运行结果:1.运行结果界面:图-3.12.查找景点相关信息的结果:图3.2 3.查找最短路径的结果:图3.3四、总结1.了解数据结构在编写比较复杂的程序的重要作用;2.对数据结构中定义无向图和创建无向图的理解更加深刻;3.对于函数的原理不太理解,对于其算法的程序编写还是不太明白;4.学会了在编写几百行程序时如何查找错误,如何改错误,不过改错误时有时候是叫同学改的;5.通过本次设计,认识到了自己的很多不足,同时也在其中学到了很多,弥补了自己的不足,今后一定会认真学习知识,多多练习,充实自己在编程方面。 附录:#defineN10#defineMAX20//图中顶点数的最大值#defineMAXedg30//图中边数的最大值#include#include#include#includetypedefintAdjMatrix[MAX][MAX];typedefstruct{intvexs[MAX];AdjMatrixarcs;}Matrix_Graph;//图的矩阵表示法。typedefstructedgenode{intadjvex;//临接点序号intlength;//道路长度charinfo[10];//景点名称charinfo2[100];//景点详细信息structedgenode*next;}edgenode,*Node;typedefstruct{charname[10];//存储景点的名称.charinformation[100];//具体的介绍此景点structedgenode*link;//指向下一个景点}vexnode;//景点及其信息.typedefstructEdge{intlengh;//边的权值,表示路径长度.intivex,jvex;//边的两端顶点号structEdge*next;//指向下一条边}EdgeType;//边及其信息.typedefstruct{intnum;//顶点编号。charname[10];//顶点名称}vertex;typedefstruct{vertexvexs[MAX];//顶点集合intedges[MAX][MAX];//临街矩阵}adjmax;//adjFILE*fp;//文件的读取voidclrscr()//清屏{system("cls");}voidcreatgraph(vexnodeg[],int*n,EdgeTypee[],adjmax*adj)//创建校园图{intb,i,s,d,len;structedgenode*p,*q;//定义图的结构体if((fp=fopen("file.txt","r"))==NULL)//打开文件{printf("文件打开错误!\n");getchar();exit(0);}fscanf(fp,"%d%d\n",n,&b);//读入景点个数和边数for(i=1;i<=*n;i++)//读入景点名称和详细介绍信息{fscanf(fp,"%s%s\n",&g[i].name,&g[i].information);strcpy(adj->vexs[i].name,g[i].name);g[i].link=NULL;//初始化}for(i=1;i<=b;i++){fscanf(fp,"%d%d%d\n",&e[i].lengh,&e[i].ivex,&e[i].jvex);//读入道路长度和起始点s=e[i].ivex;//s是起点,d是终点。d=e[i].jvex;len=e[i].lengh;adj->edges[s][d]=e[i].lengh;//为邻接矩阵中相应的边赋值adj->edges[d][s]=e[i].lengh;p=(Node)malloc(sizeof(edgenode));//申请一个弧节点。p->next=NULL;q=(Node)malloc(sizeof(edgenode));q->next=NULL;p->adjvex=d;//弧p指向的定点p->length=len;strcpy(p->info,g[d].name);//为景点赋名称strcpy(p->info2,g[d].information);//为景点赋介绍信息q->adjvex=s;//弧q指向的定点q->length=len;strcpy(q->info,g[s].name);//为景点赋名称strcpy(q->info2,g[s].information);//为景点赋介绍信息p->next=g[s].link;//头插法建立邻接表g[s].link=p;q->next=g[d].link;g[d].link=q;}printf("校园旅游图已经建立!\n");getchar();}voidName(inti){switch(i){case1:printf("1:学校正门\n\n");break;case2:printf("2:主楼广场\n\n");break;case3:printf("3:图书馆\n\n");break;case4:printf("4:国际交流中心\n\n");break;case5:printf("5:宿舍区\n\n");break;case6:printf("6:二食堂\n\n");break;case7:printf("7:体育馆\n\n");break;case8:printf("8:大操场\n\n");break;case9:printf("9:校医院\n\n");break;case10:printf("10:大学活动中心\n\n");break;default:printf("景点编号输入错误!请输入1->10的数字编号!\n\n");break;}}/*Name*/voidInformation(inti){/*景点介绍*/switch(i){case1:printf("学校正门:正门旁边是一条宽敞的马路,交通方便;进门后直对面就是两栋高大的主楼,气势宏伟。\n\n");break;case2:printf("主楼广场:广场大致圆形,两边是两栋主楼。\n\n");break;case3:printf("图书馆:学校信息资源中心,外表呈'品'字形,两面藏有大量各种书刊,设有电子查阅室和自习室,是学生学习的好地方。\n\n");break;case4:printf("国际交流中心:一楼餐厅(吃饭不贵而且很卫生),楼上是一些留学生和外教的住所。还有一些国际研讨会经常在这里开展。\n\n");break;case5:printf("宿舍区:有一、二、三、四、六、七、九、七个公寓,是大部分学生的住所。\n\n");break;case6:printf("二食堂:坐落在宿舍区,里面有各个地方的小吃,味道不错,是学生就餐的主要餐厅。\n\n");break;case7:printf("体育馆:里面有篮球场,羽毛球场,乒乓球桌,是学校举行各项体育活动的主要场所。\n\n");break;case8:printf("大操场:在体育馆旁边,是学生和老师体育锻炼的主要地方。\n\n");break;case9:printf("校医院:设备不太齐全,只能治疗一些常见的小病,但是价格很便宜。\n\n\n");break;case10:printf("大学活动中心:里面有书店、打印和复印的地方、各种学生组织的办公室。里面还可以举行各项文艺活动。\n\n");break;default:printf("景点编号输入错误!请输入1->10的数字编号!\n\n");break;}}/*Information*/voidtravgraph(vexnodeg[],intn,adjmaxadj)//查找指定景点信息{inti=1,flag=1,len;//len存储要查询的景点的序号charch;printf("请输入您要查询的景点序号:\n");scanf("%d",&len);getchar();printf("此景点的名称是:");Name(len);printf("此景点的介绍是:");Information(len);do{printf("是否继续?Y/N");scanf("%c",&ch);getchar();if(ch=='Y'||ch=='y')//继续{flag=1;i=1;printf("请输入您要查询的景点序号:\n");scanf("%d",&len);getchar();printf("此景点的名称是:");Name(len);printf("此景点的介绍是:");Information(len);continue;}elseflag=0;//不继续break;}while(1);}voidcreat(Matrix_Graph*G){inti,j;for(i=1;i<=N;i++)G->vexs[i]=i;//初始化,0号位不用。for(i=1;i<=N;i++)for(j=1;j<=N;j++)G->arcs[i][j]=0;//初始值为0。G->arcs[1][2]=2;G->arcs[1][9]=5;//表示景点一到景点二的距离是2。G->arcs[2][1]=2;G->arcs[2][3]=5;G->arcs[2][4]=4;G->arcs[2][9]=6;G->arcs[3][2]=5;G->arcs[3][4]=7;G->arcs[3][7]=5;G->arcs[3][9]=6;G->arcs[3][10]=6;G->arcs[4][2]=4;G->arcs[4][6]=7;G->arcs[4][10]=7;G->arcs[5][6]=4;G->arcs[5][7]=6;G->arcs[5][8]=8;G->arcs[6][4]=7;G->arcs[6][5]=4;G->arcs[6][7]=3;G->arcs[6][10]=7;G->arcs[7][6]=3;G->arcs[7][8]=4;G->arcs[7][10]=6;G->arcs[8][5]=8;G->arcs[8][7]=4;G->arcs[8][9]=9;G->arcs[9][1]=5;G->arcs[9][2]=6;G->arcs[9][3]=6;G->arcs[9][8]=9;G->arcs[10][3]=6;G->arcs[10][4]=7;G->arcs[10][6]=7;G->arcs[10][7]=6;for(i=1;i<=N;i++)for(j=1;j<=N;j++)if(G->arcs[i][j]==0)G->arcs[i][j]=MAX;//没有被重新赋值的,表示两景点之间//没有路,用MAX表示无穷大。}voidpath(Matrix_Graph*G,ints,inte){inti,j,u,c=1,t,v;intr[N+1][N+1];//用来存放路径上的景点。intT[N],flag[N],d[N];for(i=0;i<=N;i++)for(j=0;j<=N;j++)r[i][j]=0;//初始值为0。for(i=1;i<=N;i++){T[i]=-1;//初始值为-1。flag[i]=1;//初始值为1。d[i]=MAX;//路径长度初始值为无穷大,用MAX表示。}flag[s]=0;//修改标识。while(c<=N){t=MAX;for(i=1;i<=N;i++)if(flag[i]&&G->arcs[s][i]{t=G->arcs[s][i];v=i;r[v][1]=v;}for(i=1;i<=c;i++)for(j=1;j<=N;j++)if(flag[j]&&d[i]+G->arcs[T[i]][j]{t=d[i]+G->arcs[T[i]][j];v=j;if(r[v][0]!=-1){u=1;while(r[T[i]][u]!=0){r[v][u]=r[T[i]][u];u++;}}r[v][u]=v;}r[v][0]=-1;T[c]=v;flag[v]=0;d[c]=t;c++;}printf("\nThepathis:\n(%d)",s);j=1;while(r[e][j]!=0){printf("-->(%d)",r[e][j]);j++;}//显示路径。printf("\n\n");}intmain()//主函数{inti,j;Matrix_GraphG;creat(&G);intn=0;//景点数目vexnodeg[MAX];//保存顶点及其信息EdgeTypee[MAXedg];//保存边及其信息adjmaxadj;//保存边和定点charchoice='x';while(1){clrscr();printf("\n\n\t\t\t***校园导游系统***");printf("\n\t\t*************************************\n\n");printf("\t\t\t1.文件读入并创建校园图:\n\n");printf("\t\t\t2.查询景点详细信息:\n\n");printf("\t\t\t3.查找两景点间最短路径:\n\n");printf("\t\t\t0.退出\n\n");printf("\t\t\tWriteByEdvis@2009/07/06");printf("\n\t\t************************************\n\n");printf("Pleaseenteryourchoice(0-3):\n");choice=getchar();switch(choice){case'1':clrscr();creatgraph(g,&n,e,&adj);//创建图(景点,景点数,边,边和景点)printf("\n打开文件错误\n");getchar();break;case'2':clrscr();travgraph(g,n,adj);//查询景点信息getchar();break;case'3':clrscr();printf("\2你目前的位置是:\n");scanf("%d",&i);getchar();printf("\2你的目的地是:\n");scanf("%d",&j);getchar();path(&G,i,j);//查找最短路径getchar();creat(&G);do{printf("是否继续?Y/N");charch;intflag=1;scanf("%c",&ch);getchar();if(ch=='Y'||ch=='y')//继续{flag=1;i=1;printf("\2你目前的位置是:\n");scanf("%d",&i);getchar();printf("\2你的目的地是
t=d[i]+G->arcs[T[i]][j];v=j;
if(r[v][0]!
=-1)
u=1;
while(r[T[i]][u]!
=0)
r[v][u]=r[T[i]][u];u++;}
}
r[v][u]=v;
r[v][0]=-1;
T[c]=v;
flag[v]=0;
d[c]=t;
c++;
5.最后用一个主函数main输出各项结果。
用switch语句分别输出,要创建校园图时调用creatgraph函数;查找景点相关信息时调用travgraph函数;要查找任意两景点之间的最短路径时,先输入你目前所在的位置,再输入你的目的地,最后调用path函数。
三、运行结果:
1.运行结果界面:
图-3.1
2.查找景点相关信息的结果:
图3.2
3.查找最短路径的结果:
图3.3
四、总结
1.了解数据结构在编写比较复杂的程序的重要作用;
2.对数据结构中定义无向图和创建无向图的理解更加深刻;
3.对于函数的原理不太理解,对于其算法的程序编写还是不太明白;
4.学会了在编写几百行程序时如何查找错误,如何改错误,不过改错误时有时候是叫同学改的;
5.通过本次设计,认识到了自己的很多不足,同时也在其中学到了很多,弥补了自己的不足,今后一定会认真学习知识,多多练习,充实自己在编程方面。
附录:
#defineN10
#defineMAX20//图中顶点数的最大值
#defineMAXedg30//图中边数的最大值
#include
typedefintAdjMatrix[MAX][MAX];
typedefstruct
intvexs[MAX];
AdjMatrixarcs;
}Matrix_Graph;//图的矩阵表示法。
typedefstructedgenode
intadjvex;//临接点序号
intlength;//道路长度
charinfo[10];//景点名称
charinfo2[100];//景点详细信息
structedgenode*next;
}edgenode,*Node;
charname[10];//存储景点的名称.
charinformation[100];//具体的介绍此景点
structedgenode*link;//指向下一个景点
}vexnode;//景点及其信息.
typedefstructEdge
intlengh;//边的权值,表示路径长度.
intivex,jvex;//边的两端顶点号
structEdge*next;//指向下一条边
}EdgeType;
//边及其信息.
intnum;//顶点编号。
charname[10];//顶点名称
}vertex;
vertexvexs[MAX];//顶点集合
intedges[MAX][MAX];//临街矩阵
}adjmax;//adj
FILE*fp;//文件的读取
voidclrscr()//清屏
system("cls");
if((fp=fopen("file.txt","r"))==NULL)//打开文件
printf("文件打开错误!
exit(0);
fscanf(fp,"%d%d\n",n,&b);//读入景点个数和边数
for(i=1;i<=*n;i++)//读入景点名称和详细介绍信息
fscanf(fp,"%s%s\n",&g[i].name,&g[i].information);
strcpy(adj->vexs[i].name,g[i].name);
g[i].link=NULL;//初始化
for(i=1;i<=b;i++)
fscanf(fp,"%d%d%d\n",&e[i].lengh,&e[i].ivex,&e[i].jvex);//读入道路长度和起始点
s=e[i].ivex;//s是起点,d是终点。
d=e[i].jvex;
len=e[i].lengh;
adj->edges[s][d]=e[i].lengh;//为邻接矩阵中相应的边赋值
adj->edges[d][s]=e[i].lengh;
p=(Node)malloc(sizeof(edgenode));//申请一个弧节点。
p->next=NULL;
q=(Node)malloc(sizeof(edgenode));
q->next=NULL;
p->adjvex=d;//弧p指向的定点
p->length=len;
strcpy(p->info,g[d].name);//为景点赋名称
strcpy(p->info2,g[d].information);//为景点赋介绍信息
q->adjvex=s;//弧q指向的定点
q->length=len;
strcpy(q->info,g[s].name);//为景点赋名称
strcpy(q->info2,g[s].information);//为景点赋介绍信息
p->next=g[s].link;//头插法建立邻接表
g[s].link=p;
q->next=g[d].link;
g[d].link=q;
printf("校园旅游图已经建立!
voidName(inti)
switch(i)
case1:
printf("1:
学校正门\n\n");break;
case2:
printf("2:
主楼广场\n\n");break;
case3:
printf("3:
图书馆\n\n");break;
case4:
printf("4:
国际交流中心\n\n");break;
case5:
printf("5:
宿舍区\n\n");break;
case6:
printf("6:
二食堂\n\n");break;
case7:
printf("7:
体育馆\n\n");break;
case8:
printf("8:
大操场\n\n");break;
case9:
printf("9:
校医院\n\n");break;
case10:
printf("10:
大学活动中心\n\n");break;
default:
printf("景点编号输入错误!
请输入1->10的数字编号!
\n\n");break;
}/*Name*/
voidInformation(inti)
{/*景点介绍*/
printf("学校正门:
正门旁边是一条宽敞的马路,交通方便;进门后直对面就是两栋高大的主楼,气势宏伟。
printf("主楼广场:
广场大致圆形,两边是两栋主楼。
printf("图书馆:
学校信息资源中心,外表呈'品'字形,两面藏有大量各种书刊,设有电子查阅室和自习室,是学生学习的好地方。
printf("国际交流中心:
一楼餐厅(吃饭不贵而且很卫生),楼上是一些留学生和外教的住所。
还有一些国际研讨会经常在这里开展。
printf("宿舍区:
有一、二、三、四、六、七、九、七个公寓,是大部分学生的住所。
printf("二食堂:
坐落在宿舍区,里面有各个地方的小吃,味道不错,是学生就餐的主要餐厅。
printf("体育馆:
里面有篮球场,羽毛球场,乒乓球桌,是学校举行各项体育活动的主要场所。
printf("大操场:
在体育馆旁边,是学生和老师体育锻炼的主要地方。
printf("校医院:
设备不太齐全,只能治疗一些常见的小病,但是价格很便宜。
\n\n\n");break;
printf("大学活动中心:
里面有书店、打印和复印的地方、各种学生组织的办公室。
里面还可以举行各项文艺活动。
}/*Information*/
voidtravgraph(vexnodeg[],intn,adjmaxadj)//查找指定景点信息
inti=1,flag=1,len;//len存储要查询的景点的序号
charch;
continue;
else
flag=0;//不继续
break;
}while
(1);
voidcreat(Matrix_Graph*G)
inti,j;
for(i=1;i<=N;i++)G->vexs[i]=i;//初始化,0号位不用。
for(j=1;j<=N;j++)G->arcs[i][j]=0;//初始值为0。
G->arcs[1][2]=2;G->arcs[1][9]=5;//表示景点一到景点二的距离是2。
G->arcs[2][1]=2;G->arcs[2][3]=5;G->arcs[2][4]=4;G->arcs[2][9]=6;
G->arcs[3][2]=5;G->arcs[3][4]=7;G->arcs[3][7]=5;G->arcs[3][9]=6;G->arcs[3][10]=6;
G->arcs[4][2]=4;G->arcs[4][6]=7;G->arcs[4][10]=7;
G->arcs[5][6]=4;G->arcs[5][7]=6;G->arcs[5][8]=8;
G->arcs[6][4]=7;G->arcs[6][5]=4;G->arcs[6][7]=3;G->arcs[6][10]=7;
G->arcs[7][6]=3;G->arcs[7][8]=4;G->arcs[7][10]=6;
G->arcs[8][5]=8;G->arcs[8][7]=4;G->arcs[8][9]=9;
G->arcs[9][1]=5;G->arcs[9][2]=6;G->arcs[9][3]=6;G->arcs[9][8]=9;
G->arcs[10][3]=6;G->arcs[10][4]=7;G->arcs[10][6]=7;G->arcs[10][7]=6;
if(G->arcs[i][j]==0)G->arcs[i][j]=MAX;//没有被重新赋值的,表示两景点之间
//没有路,用MAX表示无穷大。
voidpath(Matrix_Graph*G,ints,inte)
inti,j,u,c=1,t,v;
intr[N+1][N+1];//用来存放路径上的景点。
intT[N],flag[N],d[N];
for(i=0;i<=N;i++)
for(j=0;j<=N;j++)r[i][j]=0;//初始值为0。
T[i]=-1;//初始值为-1。
flag[i]=1;//初始值为1。
d[i]=MAX;//路径长度初始值为无穷大,用MAX表示。
flag[s]=0;//修改标识。
if(flag[i]&&G->arcs[s][i]{t=G->arcs[s][i];v=i;r[v][1]=v;}for(i=1;i<=c;i++)for(j=1;j<=N;j++)if(flag[j]&&d[i]+G->arcs[T[i]][j]{t=d[i]+G->arcs[T[i]][j];v=j;if(r[v][0]!=-1){u=1;while(r[T[i]][u]!=0){r[v][u]=r[T[i]][u];u++;}}r[v][u]=v;}r[v][0]=-1;T[c]=v;flag[v]=0;d[c]=t;c++;}printf("\nThepathis:\n(%d)",s);j=1;while(r[e][j]!=0){printf("-->(%d)",r[e][j]);j++;}//显示路径。printf("\n\n");}intmain()//主函数{inti,j;Matrix_GraphG;creat(&G);intn=0;//景点数目vexnodeg[MAX];//保存顶点及其信息EdgeTypee[MAXedg];//保存边及其信息adjmaxadj;//保存边和定点charchoice='x';while(1){clrscr();printf("\n\n\t\t\t***校园导游系统***");printf("\n\t\t*************************************\n\n");printf("\t\t\t1.文件读入并创建校园图:\n\n");printf("\t\t\t2.查询景点详细信息:\n\n");printf("\t\t\t3.查找两景点间最短路径:\n\n");printf("\t\t\t0.退出\n\n");printf("\t\t\tWriteByEdvis@2009/07/06");printf("\n\t\t************************************\n\n");printf("Pleaseenteryourchoice(0-3):\n");choice=getchar();switch(choice){case'1':clrscr();creatgraph(g,&n,e,&adj);//创建图(景点,景点数,边,边和景点)printf("\n打开文件错误\n");getchar();break;case'2':clrscr();travgraph(g,n,adj);//查询景点信息getchar();break;case'3':clrscr();printf("\2你目前的位置是:\n");scanf("%d",&i);getchar();printf("\2你的目的地是:\n");scanf("%d",&j);getchar();path(&G,i,j);//查找最短路径getchar();creat(&G);do{printf("是否继续?Y/N");charch;intflag=1;scanf("%c",&ch);getchar();if(ch=='Y'||ch=='y')//继续{flag=1;i=1;printf("\2你目前的位置是:\n");scanf("%d",&i);getchar();printf("\2你的目的地是
if(flag[j]&&d[i]+G->arcs[T[i]][j]{t=d[i]+G->arcs[T[i]][j];v=j;if(r[v][0]!=-1){u=1;while(r[T[i]][u]!=0){r[v][u]=r[T[i]][u];u++;}}r[v][u]=v;}r[v][0]=-1;T[c]=v;flag[v]=0;d[c]=t;c++;}printf("\nThepathis:\n(%d)",s);j=1;while(r[e][j]!=0){printf("-->(%d)",r[e][j]);j++;}//显示路径。printf("\n\n");}intmain()//主函数{inti,j;Matrix_GraphG;creat(&G);intn=0;//景点数目vexnodeg[MAX];//保存顶点及其信息EdgeTypee[MAXedg];//保存边及其信息adjmaxadj;//保存边和定点charchoice='x';while(1){clrscr();printf("\n\n\t\t\t***校园导游系统***");printf("\n\t\t*************************************\n\n");printf("\t\t\t1.文件读入并创建校园图:\n\n");printf("\t\t\t2.查询景点详细信息:\n\n");printf("\t\t\t3.查找两景点间最短路径:\n\n");printf("\t\t\t0.退出\n\n");printf("\t\t\tWriteByEdvis@2009/07/06");printf("\n\t\t************************************\n\n");printf("Pleaseenteryourchoice(0-3):\n");choice=getchar();switch(choice){case'1':clrscr();creatgraph(g,&n,e,&adj);//创建图(景点,景点数,边,边和景点)printf("\n打开文件错误\n");getchar();break;case'2':clrscr();travgraph(g,n,adj);//查询景点信息getchar();break;case'3':clrscr();printf("\2你目前的位置是:\n");scanf("%d",&i);getchar();printf("\2你的目的地是:\n");scanf("%d",&j);getchar();path(&G,i,j);//查找最短路径getchar();creat(&G);do{printf("是否继续?Y/N");charch;intflag=1;scanf("%c",&ch);getchar();if(ch=='Y'||ch=='y')//继续{flag=1;i=1;printf("\2你目前的位置是:\n");scanf("%d",&i);getchar();printf("\2你的目的地是
printf("\nThepathis:
\n(%d)",s);
j=1;
while(r[e][j]!
printf("-->(%d)",r[e][j]);j++;}//显示路径。
printf("\n\n");
intmain()//主函数
Matrix_GraphG;
creat(&G);
intn=0;//景点数目
vexnodeg[MAX];//保存顶点及其信息
EdgeTypee[MAXedg];//保存边及其信息
adjmaxadj;//保存边和定点
charchoice='x';
while
(1)
clrscr();
printf("\n\n\t\t\t***校园导游系统***");
printf("\n\t\t*************************************\n\n");
printf("\t\t\t1.文件读入并创建校园图:
\n\n");
printf("\t\t\t2.查询景点详细信息:
printf("\t\t\t3.查找两景点间最短路径:
printf("\t\t\t0.退出\n\n");
printf("\t\t\tWriteByEdvis@2009/07/06");
printf("\n\t\t************************************\n\n");
printf("Pleaseenteryourchoice(0-3):
choice=getchar();
switch(choice)
case'1':
creatgraph(g,&n,e,&adj);//创建图(景点,景点数,边,边和景点)
printf("\n打开文件错误\n");
case'2':
travgraph(g,n,adj);//查询景点信息
case'3':
printf("\2你目前的位置是:
scanf("%d",&i);
printf("\2你的目的地是:
scanf("%d",&j);
path(&G,i,j);//查找最短路径
intflag=1;
printf("\2你的目的地是
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1