当前位置:文档之家› 校园导游咨询系统

校园导游咨询系统

1.需求分析1.1创建结点(旅游景点)创建该旅游景点是在顺序表中完成的,在顺序表中,首先要创建结点结构体,将该结构体命名为SeqList,成员变量有数组list和size,分别用来表示最大元素个数(即旅游景点的最大个数)和顺序表中当前存储的数据元素个数,顺序表可以完成的功能有求当前数据元素个数,插入数据元素,删除数据元素,取数据元素。

1.2创建图在构造图的操作中包括结点的插入(实参包括AdjMGraph *G,DataTyp v[],n,RowColWeight E[],e)分别表示在该*G的结构体中的SeqlistVertices[]中插入结点,在*G的结构体中的edge[MaxVertices][MaxVertices]的边数组中插入边信息结点分别为行下标、列下标、权值,该*G的结构体中numOfEdges,e表示边的条数,即将e的值给它。

结点的顺序表初始化,在该函数中也应包括一个结构体边信息结构体:成员包括行下标、列下标、权值。

并将该结构体命名为RowColWeight。

1.3图的实现在该函数中要使用SeqList头文件,在该文件中要真正进行插入边和结点。

首先在该函数中应该定义一个结构体AdjMGraph,在该结构体的成员变量包括存放结点的顺序表定义为SeqlistVertices[]、存放边的邻接矩阵用edge[MaxVertices][MaxVertices]表示,边的条数numOfEdges。

初始化AdjMGraph 中的成员变量线性表和边数及存放边的邻接矩阵。

然后在顺序表中插入结点,在邻接矩阵中插入边,删除边,删除结点。

取序号为V的结点的第一个邻接结点,取序号为V1的邻接结点V2结点的下一个邻接结点1.4求最短路径在该函数中,应该有四个参数,两个位输入参数,分别为带权图G和源点(景点起点)序号v0,两个为输出参数,分别为distance[]和path[],distance[]用来存放达到的从源点v0到其余各结点的最短距离,path[]用来存放最短路径的下标。

1、从江西农业大学的平面地图中选取出6个有代表性的景点。

2、为来访的客人提供图中任意景点的路径查询,即查询任意两个景点之间的最短简单路径。

当用户输入正确时,为用户输出任意两景点的最短路径;当用户输入不合法时,提示用户输入有误并返回让用户重新输入。

3、为来访客人推荐参观最短路线。

2.概要设计1.首先用邻接矩阵存储校园图。

2.用数据结构知识创建校园图。

3.手动给校园图赋上相关信息(景点名称、代号、简介),路径及路径长度。

4.利用C语言知识编写查找景点相关信息的程序。

5.利用迪杰斯特拉算法计算任意两点之间的最短路径。

6.最后用一个主函数main输出各项结果。

1.创建校园图:(1)先定义节点个数N,边的最大值(Maxweight),节点(景点名称、景点信息),邻接点,边,顶点向量,当前顶点数和边数。

(2)先给一个节点赋上其相关信息,然后再用p = (Node)malloc(sizeof(edgenode))语句申请下一结点,再给所申请的节点赋上相关信息,直到节点数为N=6为止。

(3)读入道路的起始点,为邻接矩阵的边赋相应的值。

时(4)节点和边的相关信息都弄好了后,校园图也就创建好了。

2.利用函数Name给10个节点赋上相应的名称,利用函数Information给各节点添加相应的介绍信息。

3.利用函数travgraph来查找景点信息,要查找景点名称时调用Name函数,要查找景点介绍信息时调用Information函数。

4.手动创建一个校园图AdjMGraphgcreat(AdjMGgrph *G),然后为相应的边赋上真正的值。

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 <stdlib.h>#include <conio.h>typedef int AdjMGraph[ MAXSize][ MAXSize];//存放邻接矩阵的权值信息typedef struct{int vexs[ MAXSize];AdjMGraph s;//}Matrix_Graph;//图的邻接矩阵表示法。

typedef struct numofedge//{int adjvex; //邻接矩阵结点序号int length; //定义道路长度char info[10]; //定义景点名称char info2[100]; //定义景点详细信息struct numofedge *next;//定义指向下一个结点的指针}numofedge, *Node ;//将该结构体重新命名为*Nodetypedef struct{char name[10]; //存储景点的名称数组char information[100]; //具体的介绍此景点信息数组struct numofedge *link; //指向下一个景点的指针}vextices; //创建景点及其信息结构体typedef struct Edge{int lengh; //边的权值,表示路径长度.int ivex, jvex; //表示两个连接的结点的位置变量struct Edge *next; //指向下一条边的指针变量} EdgeType;//边及其信息.typedef struct{int num; //结点编号。

char name[10]; //结点名称} vertex;//存放结点信息结构体typedef struct{vertex 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[]表示存放景点信息数组,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 %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 = e[i].jvex;len = e[i].lengh;//将各个边的长度值记录下来adj->edges[s][d] = e[i].lengh; //为邻接矩阵中相应的边赋值adj->edges[d][s] = e[i].lengh;//该矩阵为对称矩阵故edges[d][s]=edges[s][d];p = (Node)malloc(sizeof(numofedge)); //为一个新的结点开辟动态空间。

p->next = NULL;//初始化开辟空间的下一个结点q = (Node)malloc(sizeof(numofedge));//为一个新的结点开辟动态空间q->next = NULL;//初始化开辟空间的下一个结点p->adjvex = d; // 将边的列号给结点信息的结构体中记录邻接矩阵的序号成员p->length = len;//将边的长度值给结点信息的结构体中的道路成员strcpy(p->info,g[d].name); //为景点赋名称strcpy(p->info2,g[d].information); //为景点赋介绍信息q->adjvex = s; // 为景点赋序号,道路长度q->length = len;strcpy(q->info,g[s].name); //为景点赋名称strcpy(q->info2,g[s].information); //为景点赋介绍信息p->next = g[s].link; //使p指针指向第s行的下一行,头插法建立邻接表g[s].link = p;//使p指针指向第s行的下一行的下一行q->next = g[d].link;//使q指针指向第d列的下一列,头插法建立邻接表g[d].link = q;//使q指针指向第d列的下一列,头插法建立邻接表}printf("校园旅游图已经建立!\n");getchar();}void Name(int i){switch(i)//为景点添加具体的名字地点{case 1:printf("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("8:大学生活动中心\n");break;case 9:printf("9:圆形报告厅\n");break;case 10:printf("10: 体育馆\n");break;default:printf("景点编号输入错误!请输入1->10的数字编号!\n\n"); break;}} /*Name*/void Information(int i){/*景点介绍*/switch(i)//为景点添加介绍信息{case 1:printf("一教:这是一栋比较古老的建筑楼,但是当你路过这里,会听到朗朗的读书声,很励志的地方\n");break;case 2:printf("二教: 这栋楼真的很令人不满意,,不看平面图很难找到,其次,它就是一个2的形状\n");break;case 3:printf("五教: 这栋教学楼应该是新建的,总体看上去还令人比较满意,周边环境也挺好的\n");break;case 4:printf("新图书馆:虽然很小,但是还过的去,学习环境很好,还有自修室,阅览室等学习场所\n");break;case 5:printf("老图书馆:很少去,听说藏的书一般是艺术类的书籍,建筑学,美术还有音乐方面等书籍\n");break;case 6:printf("北区食堂: 有时候味道太重,太咸,但是平时味道不错,是学生就餐的主要餐厅。

相关主题