校园导游咨询系统_第1页
校园导游咨询系统_第2页
校园导游咨询系统_第3页
校园导游咨询系统_第4页
校园导游咨询系统_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上1. 需求分析1.1创建结点(旅游景点)创建该旅游景点是在顺序表中完成的,在顺序表中,首先要创建结点结构体,将该结构体命名为SeqList,成员变量有数组list和size,分别用来表示最大元素个数(即旅游景点的最大个数)和顺序表中当前存储的数据元素个数,顺序表可以完成的功能有求当前数据元素个数,插入数据元素,删除数据元素,取数据元素。1.2创建图在构造图的操作中包括结点的插入(实参包括AdjMGraph *G,DataTyp v,n,RowColWeight E,e)分别表示在该*G的结构体中的SeqlistVertices中插入结点,在*G的结构体中的edgeMa

2、xVerticesMaxVertices的边数组中插入边信息结点分别为行下标、列下标、权值,该*G的结构体中numOfEdges,e表示边的条数,即将e的值给它。结点的顺序表初始化,在该函数中也应包括一个结构体边信息结构体:成员包括行下标、列下标、权值。并将该结构体命名为RowColWeight。1.3图的实现在该函数中要使用SeqList头文件,在该文件中要真正进行插入边和结点。首先在该函数中应该定义一个结构体AdjMGraph,在该结构体的成员变量包括存放结点的顺序表定义为SeqlistVertices、存放边的邻接矩阵用edgeMaxVerticesMaxVertices表示,边的条数n

3、umOfEdges。初始化AdjMGraph中的成员变量线性表和边数及存放边的邻接矩阵。然后在顺序表中插入结点,在邻接矩阵中插入边,删除边,删除结点。取序号为V的结点的第一个邻接结点,取序号为V1的邻接结点V2结点的下一个邻接结点1.4求最短路径在该函数中,应该有四个参数,两个位输入参数,分别为带权图G和源点(景点起点)序号v0,两个为输出参数,分别为distance和path,distance用来存放达到的从源点v0到其余各结点的最短距离,path用来存放最短路径的下标。1、从江西农业大学的平面地图中选取出6个有代表性的景点。2、为来访的客人提供图中任意景点的路径查询,即查询任意两个景点之间

4、的最短简单路径。当用户输入正确时,为用户输出任意两景点的最短路径;当用户输入不合法时,提示用户输入有误并返回让用户重新输入。3、为来访客人推荐参观最短路线。2.概要设计1首先用邻接矩阵存储校园图。2用数据结构知识创建校园图。3手动给校园图赋上相关信息(景点名称、代号、简介),路径及路径长度。4利用C语言知识编写查找景点相关信息的程序。5利用迪杰斯特拉算法计算任意两点之间的最短路径。6最后用一个主函数main输出各项结果。1创建校园图:(1)先定义节点个数N,边的最大值(Maxweight),节点(景点名称、景点信息),邻接点,边,顶点向量,当前顶点数和边数。 (2)先给一个节点赋上其相关信息,

5、然后再用p = (Node)malloc(sizeof(edgenode)语句申请下一结点,再给所申请的节点赋上相关信息,直到节点数为N=6为止。 (3)读入道路的起始点,为邻接矩阵的边赋相应的值。时 (4)节点和边的相关信息都弄好了后,校园图也就创建好了。 2利用函数Name给10个节点赋上相应的名称,利用函数Information给各节点添加相应的介绍信息。 3利用函数travgraph来查找景点信息,要查找景点名称时调用Name函数,要查找景点介绍信息时调用Information函数。 4手动创建一个校园图AdjMGraphgcreat(AdjMGgrph *G),然后为相应的边赋上真正

6、的值。 5用distance数组来存放任意两景点之间的最短路径。 6用main函数来输出结果:用switch语句分别输出,要创建校园图时调用AdjMGraphgraphcreat函数;查找景点相关信息时调用search函数;要查找任意两景点之间的最短路径时,先输入你目前所在的位置,再输入你的目的地,最后调用path函数。3. 详细设计#define N 10#define MAXSize 20 /图中顶点数的最大值#define MAXedg 30 /图中边数的最大值 #include <stdio.h>#include <string.h>#include <s

7、tdlib.h>#include <conio.h>typedef int AdjMGraph MAXSize MAXSize;/存放邻接矩阵的权值信息 typedef structint vexs MAXSize; AdjMGraph s;/Matrix_Graph;/图的邻接矩阵表示法。typedef struct numofedge/int adjvex; /邻接矩阵结点序号int length; /定义道路长度char info10; /定义景点名称char info2100; /定义景点详细信息struct numofedge *next;/定义指向下一个结点的指针

8、 numofedge, *Node ;/将该结构体重新命名为*Node typedef structchar name10; /存储景点的名称数组 char information100; /具体的介绍此景点信息数组 struct numofedge *link; /指向下一个景点的指针 vextices; /创建景点及其信息结构体 typedef struct Edgeint lengh; /边的权值,表示路径长度.int ivex, jvex; /表示两个连接的结点的位置变量 struct Edge *next; /指向下一条边的指针变量 EdgeType; /边及其信息.typedef

9、struct int num; /结点编号。char name10; /结点名称 vertex;/存放结点信息结构体 typedef structvertex vexs MAXSize; /存放结点数组元素信息 int edges MAXSize MAXSize; /存放边的邻接矩阵 adjmax,adj; /表示图的结构体 FILE *fp; /文件的读取void clrscr() /清屏system("cls");void creatgraph(vextices g,int *n, EdgeType e,adjmax *adj) /创建校园图vextices g表示存放

10、景点信息数组 ,n表示下一个景点,EdgeType e表示存放边的信息数组,adjmax *adj表示下一条边的信息数组 int b,i,s,d,len;/b代表结点之间的边数 struct numofedge *p,*q; /定义图的结构体 if(fp = fopen("file.txt","r") = NULL) /打开文件,对文件进行读的操作 printf("文件打开错误!n");getchar();/获取景点信息 exit(0);fscanf(fp,"%d %dn",n,&b); /读入景点个数和边

11、数for(i = 1; i <= *n; i+) fscanf(fp,"%s %sn",&,&rmation);/读入文件中结点(景点)的名字和详细介绍信息 strcpy(adj->,);/将景点的名字赋给图中的结点信息 gi.link = NULL; /初始化节点的下一个结点信息 for(i = 1; i <= b; i+) fscanf(fp,"%d %d %dn",&ei.lengh,&ei.ivex,&ei.jvex); /读入

12、道路长度和边的行下标和列下标 s = ei.ivex; /将边的行号记录给S,将边的列号记录下来。d = ei.jvex;len = ei.lengh;/将各个边的长度值记录下来 adj->edgessd = ei.lengh; /为邻接矩阵中相应的边赋值adj->edgesds = ei.lengh;/该矩阵为对称矩阵故 edgesds=edgessd; p = (Node)malloc(sizeof(numofedge); /为一个新的结点开辟动态空间。p->next = NULL;/初始化开辟空间的下一个结点 q = (Node)malloc(sizeof(numofe

13、dge);/为一个新的结点开辟动态空间q->next = NULL;/初始化开辟空间的下一个结点 p->adjvex = d; / 将边的列号给结点信息的结构体中记录邻接矩阵的序号成员 p->length = len;/将边的长度值给结点信息的结构体中的道路成员 strcpy(p->info,); /为景点赋名称strcpy(p->info2,rmation); /为景点赋介绍信息q->adjvex = s; / 为景点赋序号,道路长度 q->length = len;strcpy(q->info,);

14、/为景点赋名称strcpy(q->info2,rmation); /为景点赋介绍信息p->next = gs.link; /使p指针指向第s行的下一行,头插法建立邻接表gs.link = p;/使p指针指向第s行的下一行的下一行 q->next = gd.link;/使q指针指向第d列的下一列,头插法建立邻接表gd.link = q;/使q指针指向第d列的下一列,头插法建立邻接表printf("校园旅游图已经建立!n");getchar(); void Name(int i)switch(i)/为景点添加具体的名字地点 case 1: pri

15、ntf("1:一教n");break;case 2: printf("2:二教n");break; case 3: printf("3:五教n");break; case 4: printf("4:新图书馆n");break; case 5: printf("5:老图书馆n");break; case 6:printf("6:北区食堂n");break; case 7: printf("7:南区食堂n");break; case 8: printf(&qu

16、ot;8:大学生活动中心n");break; case 9: printf("9:圆形报告厅n");break; case 10: printf("10: 体育馆n");break; default:printf("景点编号输入错误!请输入1->10的数字编号!nn"); break; /*Name*/void Information(int i)/*景点介绍*/ switch(i)/为景点添加介绍信息 case 1: printf("一教:这是一栋比较古老的建筑楼,但是当你路过这里,会听到朗朗的读书声,很励

17、志的地方n");break;case 2: printf("二教: 这栋楼真的很令人不满意,不看平面图很难找到,其次,它就是一个2的形状n");break; case 3: printf("五教: 这栋教学楼应该是新建的,总体看上去还令人比较满意,周边环境也挺好的n");break; case 4: printf("新图书馆:虽然很小,但是还过的去,学习环境很好,还有自修室,阅览室等学习场所 n");break; case 5: printf("老图书馆:很少去,听说藏的书一般是艺术类的书籍,建筑学,美术还有音乐方

18、面等书籍n");break; case 6:printf("北区食堂: 有时候味道太重,太咸,但是平时味道不错,是学生就餐的主要餐厅。nn");break; case 7: printf("南区食堂: 味道偏清淡,三楼的南昌风味的快餐店味道较好n");break; case 8: printf("大学生活动中心:在体育馆旁边,举办活动的主要场所,每次晚上路过那里都会听到在举办活动,很热闹n");break; case 9: printf("圆形报告厅: 太小了,如果要求全院的人都参加专业类的报告,则会有很多晚来的人

19、站在后面,没有足够的座位n");break; case 10: printf("体育馆: 上体育课的主要场地,比较空旷,平时会有很多学生在那里训练,打羽毛球的时候和练轮滑的时候最精彩了n");break; default:printf("景点编号输入错误!请输入1->10的数字编号!nn"); break; /*Information*/void searchgraph(vextices g,int n,adjmax adj) /1查找指定景点信息int i = 1,flag = 1,len; /len存储要查询的景点的序号char ch

20、;printf("请输入您要查询的景点序号:n");/提示用户输入景点序号 scanf("%d",&len);getchar();/获取该序号对应的景点名称和景点信息 printf("此景点的名称是:");Name(len);printf("此景点的介绍是:");Information(len);doprintf("是否继续? Y/N");scanf("%c",&ch);getchar();if(ch = 'Y' | ch = 'y&#

21、39;) /继续flag = 1;i = 1;printf("请输入您要查询的景点序号:n");scanf("%d",&len);getchar();printf("此景点的名称是:");Name(len);printf("此景点的介绍是:");Information(len);continue ;elseflag = 0; /不继续break;while(1);void creat(Matrix_Graph *G)int i,j;for(i=1;i<=N;i+) G->vexsi=i;/初始化

22、,0号位不用。for(i=1;i<=N;i+)for(j=1;j<=N;j+) G->sij=0;/初始值为0。G->s12=2;G->s19=5;/表示景点一到景点二的距离是2。G->s21=2;G->s23=5;G->s24=4;G->s29=6;/将景点间的距离初始化 G->s32=5;G->s34=7;G->s37=5;G->s39=6;G->s310=6;G->s42=4;G->s46=7;G->s410=7;G->s56=4;G->s57=6;G->s58=8;G

23、->s64=7;G->s65=4;G->s67=3;G->s610=7;G->s76=3;G->s78=4;G->s710=6;G->s85=8;G->s87=4;G->s89=9;G->s91=5;G->s92=6;G->s93=6;G->s98=9;G->s103=6;G->s104=7;G->s106=7;G->s107=6;for(i=1;i<=N;i+)for(j=1;j<=N;j+)if(G->sij=0) G->sij= MAXSize;/没有被重新

24、赋值的,表示两景点之间/没有路,用MAX表示无穷大。void Mindistance(Matrix_Graph *G,int s,int e)int i,j,u,c=1,t,v;int rN+1N+1;/用来存放路径上的景点。int TN,flagN,dN;for(i=0;i<=N;i+)for(j=0;j<=N;j+) rij=0;/初始值为0。for(i=1;i<=N;i+)Ti=-1;/初始值为-1。flagi=1;/初始值为1。di= MAXSize;/路径长度初始值为无穷大,用MAX表示。flags=0;/修改标识。while(c<=N)t= MAXSize;

25、for(i=1;i<=N;i+)if(flagi&&G->ssi<t)/求最短路径,求从起点到终点的所有距离加起来的最短路径 t=G->ssi;v=i;rv1=v;for(i=1;i<=c;i+)for(j=1;j<=N;j+)if(flagj&&di+G->sTij<t) t=di+G->sTij;v=j;if(rv0!=-1)u=1;while(rTiu!=0)rvu=rTiu;u+;rvu=v;rv0=-1;Tc=v;flagv=0;dc=t;c+;printf("nThe path is:n

26、(%d)",s);j=1;while(rej!=0)printf("->(%d)",rej);j+;/显示路径。printf("nn");int main()/主函数int i,j;Matrix_Graph G;creat(&G);int n = 0; /景点数目 vextices g MAXSize; /1保存顶点及其信息EdgeType eMAXedg; /保存边及其信息adjmax adj; /保存边和定点char choice = 'x'while(1)clrscr();printf("nnttt

27、*校园导游系统*nn");/提示用户正确根据需要输入数字 printf("ttt1. 文件读入并创建校园图:nn");printf("ttt2. 查询景点详细信息:nn");printf("ttt3. 查找两景点间最短路径:nn");printf("ttt0. 退出nn");printf("Please enter your choice(0-3):n ");choice = getchar();switch(choice)case '1':clrscr();creat

28、graph(g,&n,e,&adj); /创建图(景点,景点数,边,边和景点)printf("n打开文件错误n");getchar();break;case '2':clrscr();searchgraph(g,n,adj);/查询景点信息getchar(); break;case '3':clrscr();printf("2你目前的位置是:n");scanf("%d",&i);getchar();printf("2你的目的地是:n");scanf("

29、;%d",&j);getchar();Mindistance(&G,i,j);/查找最短路径getchar();creat(&G);doprintf("是否继续? Y/N");char ch;int flag=1;scanf("%c",&ch);getchar();if(ch = 'Y' | ch = 'y') /是否继续flag = 1;i = 1;printf("2你目前的位置是:n");scanf("%d",&i);getcha

30、r();/获取输入的数字对应的地点 printf("2你的目的地是:n");scanf("%d",&j);getchar();Mindistance(&G,i,j);/查找最短路径getchar();creat(&G);continue ;elseflag = 0; /不继续break;while(1);break;case '0': clrscr();printf("n*按任意键退出*n");getchar();exit(0);break;default:printf("n输入错误,请重新输入0-3之间的数字:n");getchar(); break; getchar();4. 调试分析4.1测试数据当起点输入11终点输入10时,景点不存在,程序提示重新输入;当起点输入0(教学主楼)终点输入10时,终点景点不存在,程序提示重新输入;当起点输入3(五教)终点输入4(新图书馆)时,景点都存在,屏幕打印出两景点最短路径:五教新图书馆,最短路径约为6。当输入1时,则按景点编号查询,当输入6(北区食堂)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论