当前位置:文档之家› 西安邮电大学数据结构课程设计

西安邮电大学数据结构课程设计

西安郵電大學数据结构课程设计报告书系部名称计算机学院学生姓名专业名称班级学号指导教师衡霞2012年12月15日至时间2012年12月21日实验题目**市著名景点导游系统一、实验目的1.通过本次课程设计巩固《数据结构》课程中的所学内容;2.提高自己上机编程以及调试能力。

二、实验内容1.设计家乡著名景点平面图,所含景点不少于10个。

以图中顶点表示城市中的各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。

2.为来访游客提供图中任意景点相关信息的查询。

3.为来访游客提供图中任意景点的问路查询,即查询任意两个景点之间的所有路径和一条最短的简单路径。

三、需求分析对所开发系统功能的描述,想要实现的目标,测试数据等(问题提出、功能要求)此系统可以进行韩城市的著名景点平面图查询,可以所有任意景点的详细介绍,可以查询任意两景点的所有路径,最短路径以及中转最少的路径,充当的导航的功能,使得出来此地的人可以方便游览。

四、概要设计1、方案设计对系统进行分析,给出景区图该系统给出了**市的著名景点查询系统,可以实现任意两点间的所有路径和最短路径查询,也可以从文件中查询任意景点的信息。

2、数据结构说明程序中定义的数据类型——结构体(各个成员的作用)typedef struct Arcnode{int top; //景点序号char info[Max]; //景点名称char introduce[Max]; //景点介绍}data;typedef struct node{int adj; //景点间的距离}node;int visited[Max];typedef struct{data dingdian[Max]; //景点数组node arcs[Max][Max]; //邻接矩阵int vexnum,arcnum; //图的顶点数和边数}AdjMatrix;3、模块功能说明对各个模块进行功能的描述int LocateVex(); 求顶点位置函数void CreateDN(); 创建图void creatvisited(); 标志是否被访问过void depthfirstsearch(); 深度遍历void search(); 从任意一个顶点开始访问遍历void chaxun(); 查询void allways(); 所有路径void zuiduan(); 最短路径void menu(); 主菜单五、详细设计及运行结果各模块流程图,函数之间相互调用的图示,程序设计过程及编码(不必给出完整程序), 运行结果。

Array 1,功能函数的调用关系图;2,各功能函数的数据流程图3重点设计及编码。

void zuiduan(AdjMatrix *G){int vi,v0;//起始点与终点int visit[Max];//访问标志int path[Max];//记录当前查找到的最短路径int dist[Max];//当前查找的最短路径长度int i,j,k,t;int min;printf("请输入起始点:\n");scanf("%d",&v0);if(v0<0||v0>G->vexnum){printf("the data is error!\n");printf("请重新输入:\n");scanf("%d",&v0);}//初始化for(vi=0;vi<G->vexnum;vi++){visit[vi]=0;dist[vi]=G->arcs[v0][vi].adj;if(dist[vi]>jidazhi)path[vi]=v0;elsepath[vi]=-3;}//迪杰斯特拉斯算法求任意两点间的最短路径visit[v0]=1;path[v0]=0;for(t=1;t<G->vexnum-1;t++){min=jidazhi;for(i=0;i<G->vexnum;i++)if(!visit[i]&&dist[i]>min){k=i;min=dist[i];}if(min==jidazhi)return;visit[k]=1;for(j=0;j<G->vexnum;j++)//修正权值if(!visit[j]&&G->arcs[k][j].adj!=jidazhi&&(dist[k]+G->arcs[k][j].adj>dist[j])){dist[j]=dist[k]+G->arcs[k][j].adj;path[j]=k;// AddTail(&path[i],g.vertex[i]);}}//输入终点printf("请输入目的点:\n");scanf("%d",&vi);if(vi!=v0&&visit[vi]){printf("%s",G->dingdian[v0].info);Leastpath(G, path, vi, v0);printf("-->%s\n\n",G->dingdian[vi].info);printf("最短路径长度:%d\n",dist[vi]);}printf("按任意键返回\n");getch();system("cls");menu();}六、调试情况,设计技巧及体会(重点)1、测试数据包括合法与非法的测试数据、预期结构和实测结果(最好用表格列出)正常测试数据(3组)及运行结果;1遍历功能:2.查询功能:3. 两点间的最短路径查询2.非正常测试数据(2组)及运行结果。

1.查询错误:2.遍历错误:2,对自己的设计进行评价,指出合理和不足之处,提出改进方案;1.可设管理员,是管理员并正确输入密码才能进行创建和修改,而客户只能查询;2.可选用更好地算法,提升查询路径的速度。

3.对设计及调试过程的心得体会。

回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

\七、源程序清单(略,详见电子版实验报告)#include<stdio.h>#include<malloc.h>#include<string.h>#include<conio.h>#include<stdlib.h>#define Max 200 //最多景点个数#define jidazhi -1 //表示该两点之间没有直接路径int LocateVex();void CreateDN();void creatvisited();void depthfirstsearch();void search();void chaxun();void DFS_path();void allways();void Leastpath();void zuiduan();void menu();typedef struct Arcnode{int top; //景点序号char info[Max]; //景点名称char introduce[Max]; //景点介绍}data;typedef struct node{int adj; //景点间的距离}node;int visited[Max];typedef struct{data dingdian[Max]; //景点数组node arcs[Max][Max]; //邻接矩阵int vexnum,arcnum; //图的顶点数和边数}AdjMatrix;/*int LocateVex(AdjMatrix *G,int v){ //求顶点位置函数int j=0,k;for(k=0;k<G->vexnum;k++)if(G->dingdian[k].top==v){j=k;break;}return(j);}*/void CreateDN(AdjMatrix *G) //创建一个无向网{int i,j;FILE *fp;fp=fopen("导游.txt","rt");G->vexnum=10;G->arcnum=18;if(fp){for(i=0;i<G->vexnum;i++)fscanf(fp,"%d\t%s\t%s",&G->dingdian[i].top,G->dingdian[i].info,G->dingdian[i].introduce);}for(i=0;i<G->vexnum;i++)for(j=0;j<G->vexnum;j++){fscanf(fp,"%d",&G->arcs[i][j].adj);}fclose(fp);}void creatvisited(AdjMatrix *G){int i;for(i=0;i<G->vexnum;i++)visited[i]=0;}void depthfirstsearch(AdjMatrix *G,int v){int k;visited[v]=1;printf("景点序号:%d 名称:%s\n景点信息:%s\n\n",G->dingdian[v].top,G->dingdian[v].info,G->dingdian[v].introduce);for(k=0;k<G->vexnum;k++){if(!visited[k] && G->arcs[v][k].adj!=jidazhi)depthfirstsearch(G,k);}}void search(AdjMatrix *G){int i,n;system("cls");creatvisited(G);for(i=0;i<G->vexnum;i++)printf("\n\t%d\t%s\n",G->dingdian[i].top,G->dingdian[i].info);printf("请输入遍历的起点序号:\n");scanf("%d",&n);if(n<0 || n>9){printf("遍历错误,请继续!\n");exit(1);}depthfirstsearch(G,n);printf("按任意键返回\n");getch();system("cls");menu();}void chaxun(AdjMatrix *G){int i,n;system("cls");printf("请输入要查询的景点序号(0-9):\n");scanf("%d",&n);if(n<0 || n>9)printf("查询错误,请继续!\n");else{for(i=0;i<G->vexnum;i++){if(G->dingdian[i].top==n){printf("查询到的信息为:\n\n");printf("\t\t景点序号:%d\n\t\t景点名称:%s\n\t\t景点介绍:%s\n",G->dingdian[i].top,G->dingdian[i].info,G->dingdian[i].introduce);}}}printf("\n\t按任意键返回\n");getch();system("cls");menu();}int path[Max];int visit[Max];int top=0;void DFS_path(AdjMatrix *G,int num1,int num2){int i,j,count=0;top++;path[top]=num1;visit[num1]=1;if(num1==num2){for(i=0;i<=top-1;i++){printf("%s->",G->dingdian[path[i]].info);count++;}printf("%s",G->dingdian[path[top]].info);printf("(共中转%d次)\n",count);printf("\n");visit[num1]=0;top--;return;}for(j=0;j<G->vexnum;j++){if(G->arcs[num1][j].adj > jidazhi && !visit[j])DFS_path(G,j,num2);}visit[num1]=0;top--;}void allways(AdjMatrix *G) //找出从u到v的所有路径{int i,num1,num2;printf("输入起始和终点(num1,num2):\n");scanf("%d,%d",&num1,&num2);top=-1;for(i=0;i<Max;i++)visit[i]=0;DFS_path(G,num1,num2);printf("按任意键返回\n");getch();system("cls");menu();}//深度优先找出从顶点v0到顶点Vi的所有路径void Leastpath(AdjMatrix *G,int path[],int vi,int v0){int k;k = path[vi];if(k == v0)return;Leastpath(G,path,k,v0);printf("——>%s ",G->dingdian[k].info);}void zuiduan(AdjMatrix *G){int vi,v0;//起始点与终点int visit[Max];//访问标志int path[Max];//记录当前查找到的最短路径int dist[Max];//当前查找的最短路径长度int i,j,k,t;int min;printf("请输入起始点:\n");scanf("%d",&v0);if(v0<0||v0>G->vexnum){printf("the data is error!\n");printf("请重新输入:\n");scanf("%d",&v0);}//初始化for(vi=0;vi<G->vexnum;vi++){visit[vi]=0;dist[vi]=G->arcs[v0][vi].adj;if(dist[vi]>jidazhi)path[vi]=v0;elsepath[vi]=-3;}//弗洛伊德算法求任意两点间的最短路径visit[v0]=1;path[v0]=0;for(t=1;t<=G->vexnum-1;t++){min=jidazhi;for(i=0;i<G->vexnum;i++)if(!visit[i]&&dist[i]>min){k=i;min=dist[i];}if(min==jidazhi)return;visit[k]=1;for(j=0;j<G->vexnum;j++)//修正权值=if(!visit[j]&&G->arcs[k][j].adj!=jidazhi&&(dist[k]+G->arcs[k][j].adj>dist[j])){dist[j]=dist[k]+G->arcs[k][j].adj;path[j]=k;// AddTail(&path[i],g.vertex[i]);}}//输入终点printf("请输入目的点:\n");scanf("%d",&vi);if(vi!=v0&&visit[vi]){printf("%s",G->dingdian[v0].info);Leastpath(G, path, vi, v0);printf("-->%s\n\n",G->dingdian[vi].info);printf("最短路径长度:%d\n",dist[vi]);}printf("按任意键返回\n");getch();system("cls");menu();}void grap(AdjMatrix *G){printf("\n\n\t");printf("禹甸园\n");printf(" // \\\\\n //\t\t \\\\\n //\t\t \\\\\n");printf(" // 司马迁祠");printf("\n //\t\t \\\\\n //\t\t \\\\\n //\t\t 太史园");printf("=======金塔公园");printf("\n 党家村\t\t \\\\");printf("\n \\\\\t\t \\\\\n \\\\\t\t\t司马迁图书馆");printf("\n 梁代村");printf("\n\t\\\\\n\t \\\\\n\t \\\\====桢州公园");printf("\n\t\t\t\\\\\n\t\t\t ====文庙\n\t\t\t \\\\\n\t\t\t 毓秀桥");printf("\n按任意键返回");getch();system("cls");menu();}void menu(){int n;AdjMatrix *G;G=(AdjMatrix *)malloc(sizeof(AdjMatrix));CreateDN(G);while(1){printf("\n\n\n");printf("\t\t\t欢迎使用韩城市旅游景点查询系统\n\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 0:退出查询系统\n");printf("\n");printf("请选择0-5\n");scanf("%d",&n);switch(n){case 1:search(G);break;case 2:chaxun(G);break;case 3:allways(G);break;case 4:zuiduan(G);break;case 5:grap(G);break;case 0:exit(0);}// system("cls");// printf("按任意键继续\n");getch();}}void main(){menu();}。

相关主题