景区旅游管理系统Word文档下载推荐.docx
《景区旅游管理系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《景区旅游管理系统Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
2设计流程
主程序采用设计主菜单调用若干功能模块,同时在主程序中定义两个邻接链表类型变量G和G1,作为调用子函数的参数.
建图子模块建立无向带权图,输入顶点信息和边的信息,输出邻接链表G。
由于是无向边,输入一条边时构建两条边.
输出图子模块:
从邻接链表g转换成邻接矩阵a,并输出邻接矩阵a。
图中边的权值∞用32767表示.
遍历子模块:
通过遍历图G,只得到遍历的顶点序列。
我们先将顶点序列存在数组vex中,然后再转换成导游线路存入数组vex1中,最后生成导游线路图G1(同样用邻接链表存储,供拓朴排序用)。
将遍历顶点序列转换成导游线路。
图10—43(a)(b)(c)三个无向图的深度优先搜索遍历的结果均为v1→v2→v3→v4.但它们的导游线路图却不同.图(a)的导游线路图为v1→v2→v3→v4,与遍历结果相同.
图(b)的导游线路图为v1→v2→v3→v2→v4,图(c)的导游线路图为v1→v2→v3→v2→v1→v4.
遍历结点序列与导游线路图转换的策略:
设遍历结果为v1→v2→…→vi→vi+1→…→vn
对于结点vi和vi+1,如果vi和vi+1存在边,则直接转换。
否则,加入边vi→vi—1,如果vi—1和vi+1存在边,则加入边vi-1→vi+1。
再否则,加入边vi-1→vi-2,如果vi—2和vi+1存在边,则加入边vi-2→vi+1。
如果vi—2和vi+1还不存在边,继续回溯,一定能找到某个整数k(因为景点分布图是连通图),使得vi-k和vi+1存在边,则加入边vi-k→vi+1。
在本任务中,转换后的线路图存于数组vex1中。
流程图见10—29。
拓朴排序子模块流程图,见图10-39源程序,参见10。
7节的samp10-8。
c。
求最短路径子模块流程图:
见10-34。
源程序,参见10。
6节的samp10-6.c。
求最小生成树子模块流程图:
见19-33。
源程序,参见10.6节的samp10-5。
3数据结构
景点的信息包括景点的名称和近邻景点之间的通路和距离。
用邻接链表存储景点分布图的信息。
(带权无向)图的邻接链表
/***************************************************************/
/*程序功能:
建立一个旅游景区管理系统,实现旅游路线选择 */
/*景区道路优化等功能 */
/***************************************************************/
#include“stdio。
h”
#include“stdlib.h”
#include“string.h”
#defineMAX_EDGE_NUM100/*定义图的最大边数*/
#defineMAX_VERTEX_NUM20
#defineMAXNUM32767
typedefcharVertex_type[10];
typedefstructnode/*边表结点*/
{
intadjvex;
/*邻接点域*/
intweight;
structnode*next;
/*指向下一个邻接点的指针域*/
}Edge_node;
typedefstruct/*顶点表结点*/
{
Vertex_typevertex;
/*顶点域,存放景点名称*/
Edge_node*firstedge;
/*边表头指针*/
}Vertex_node;
typedefstruct
Vertex_nodeadjlist[MAX_VERTEX_NUM];
/*邻接表*/
intn,m;
/*顶点数和边数*/
}Lgraph;
边的类型定义
在求最小生成树时,用到边的定义。
inti;
/*顶点vi的序号*/
intj;
/*顶点vi的序号*/
intweight;
}Edge_type;
1.4程序清单
主程序源程序
/*************************************************************/
/*函数名:
main */
/*入口参数:
无 */
/*返回值:
/*************************************************************/
voidmain()
Lgraph*g,*g1;
intsele;
voidcreate_graph();
voidoutput_graph();
voiddfs_main();
voidtopo_sort_main();
voidmin_distance_main();
voidmin_tree();
g=(Lgraph*)malloc(sizeof(Lgraph));
g—〉m=0;
g1=(Lgraph*)malloc(sizeof(Lgraph));
while
(1)
{
system(”cls"
);
printf(“\n\n******景区旅游管理信息系统******\n”);
printf(“1.输入景点分布图\n”);
printf(“2.输出景点分布图邻接矩阵\n”);
printf(“3.生成导游线路图\n”);
printf(“4。
输出导游线路图中回路\n”);
printf(“5。
求两景点间最短路径和最短距离\n"
printf(“6。
输出景区道路修建规划图\n”);
printf(“0。
退出\n"
);
printf(“请选择功能序号:
”);
scanf(“%d"
,&sele);
printf(”\n\n***************************************************\n\n"
switch(sele)
{
case1:
create_graph(g);
break;
case2:
output_graph(g);
break;
case3:
dfs_main(g,g1);
case4:
topo_sort_main(g1);
case5:
min_distance_main(g);
break;
case6:
min_tree(g);
case0:
exit(0);
}
getchar();
printf(”按回车键继续..。
..。
"
}
}
建图子模块源程序参见10.3节的create_graph()函数。
输出图子模块
/**************************************************************/
/*函数名:
output_graph */
/*函数功能:
输出图G的邻接矩阵 */
/*入口参数:
g-——邻接链表 */
/*返回值:
无 */
/**************************************************************/
voidoutput_graph(Lgraph*g)
inti,j,n;
inta[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
Edge_node*p;
if(g—〉n==0)
{
printf(“景点分布图未输入,无法输出!
\n"
return;
}
for(i=0;
i〈g—>
n;
i++)
for(j=0;
j〈g-〉n;
j++)
if(i==j)
a[i][j]=0;
else
a[i][j]=MAXNUM;
for(i=0;
i<
g—>
p=g—>
adjlist[i].firstedge;
while(p!
=NULL)
j=p->
adjvex;
a[i][j]=p->
weight;
p=p—>
next;
}
printf("
景点分布图邻接矩阵为:
\n\n"
printf(”%8s”,””);
g-〉n;
printf("
%8s"
,g—>
adjlist[i].vertex);
for(i=0;
i〈g-〉n;