数据结构课程设计——校园导游咨询系统

合集下载

基于数据结构的校园导游咨询系统课程设计报告

基于数据结构的校园导游咨询系统课程设计报告

重庆科技学院课程设计报告院(系):_电气与信息工程学院专业班级:计科普0902学生姓名:周杨学号: 2009441622设计地点(单位)____计算机基础自主学习中心I306___设计题目:_________校园导游咨询____________________ 完成日期: 2011 年 1 月 14 日指导教师评语: _______________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________ __________ _成绩(五级记分制):______ __________指导教师(签字):________ ________重庆科技学院课程设计任务书设计题目:校园导游咨询教研室主任:指导教师:向毅、陈刘奎、熊茜2010年 12 月 20日摘要现代快节奏的生活使得都市人越来越渴望亲近自然,因此外出旅游现在被越来越多的都市人所看中,所以如何快速方便的找到我们想要的旅游景点的信息和最短路径就成了一个很重要的问题。

本设计基于图的结构,创建一个无向图,针对游客的实际需求,将重庆科技学院的景点编号、名称、介绍等信息放入到图的顶点当中并保存在景点文本文件当中,将两个景点的编号和它们之间的距离当作权值也保存到权值文本文件当中,利用迪杰斯特拉算法来求从一个景点到另一个景点的最短距离,利用strcmp();函数来查找景点,并显示出它的信息,从而解决了要查找景点信息和景点之间的最短路径的问题,最后按照显示屏上的提示进行相关的操作。

数据结构课程设计报告(校园导游系统)附有源代码

数据结构课程设计报告(校园导游系统)附有源代码

课程论文(设计)2011-2012学年第2学期课程名称:数据结构课程设计课程性质:实践课专业班级:考核方式:考查学生姓名:学号:学时:1周教师姓名:目录1. 作业内容 (1)2. 基本思路 (1)2.1 本校10个景点 (1)2.2 图的初始化 (2)2.3 图的遍历 (2)2.4 求最短路径 (3)3.系统流程 (4)3.1 系统的简单说明 (4)3.2 系统流程图 (5)4. 系统运行效果图 (5)4.1 校园导游界面 (5)4.2 华农校园地图 (6)4.3 景点的相关信息查询 (6)4.4 任意两个景点间的最短路径 (7)4.5 退出校园导游系统 (8)5.总结 (9)6.参考文献 (10)1. 作业内容设计一个校园导游程序,为来访客人提供各种信息查询任务。

基本要求:(1)设计你所在学校的校园平面图,所含景点不少于10个。

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

(2)为来访客人提供图中任意景点相关信息的查询(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。

2. 基本思路要完成对整个导游图系统的功能实现,需要对的每一项功能都有清楚的设想和认识,了解并明确每一项功能的实现需要解决的问题,选择正确并且高效的算法把问题逐个解决,最终实现程序的正确调试运行。

有以下设计思路:(1).结合本校的实际情况,选出10个景点;(2).人为手工为选出的10个景点赋上相关信息(名称、代号、简介信息、以及路权等等);(3).根据选出来的10个景点用邻接矩阵存储校园图。

(4).依照景点的相关信息创建校园图。

(5).把纸质上的内容,利用C++编程语言编写查找景点相关信息的程序。

(6).根据人为赋值的路权,迪杰斯特拉算法计算任意两点之间的最短路径。

(7).综上所诉,用一个主函数把这些板块合成,生产一个菜单界面呈现在用户面前。

为此,可把系统分为以下几个核心:图的初始化、图的遍历、求最佳路线。

西安邮电大学-(数据结构)校园导游系统课程教学设计报告

西安邮电大学-(数据结构)校园导游系统课程教学设计报告

西安郵電大學数据结构课程设计报告书崔斌专业名称 计算机科学与技术专业计科1106系部名称计算机学院 学生姓名04111185指导教师2012年12月15日 至 间2012年12月21日实验题目:校园导游系统一、实验目的① :为了让非本校的同学们,家长们能够充分了解本校 ---西安邮电大学。

② :实践数据结构所学知识。

二、实验内容学校简易的俯视图。

各个景点的简单介绍。

任意两景点之间的所有路径。

任意两景点之间的最少中转景点路径。

任意两景点之间的带权路径长度。

三、需求分析①: ②: ③: ④: ⑤:Init();初始化两个顺序栈Menu();进行选择的模块函数;Intro();景点介绍函数;SearchO;判断是否有此编号的景点;Fin dall path();找路径函数;Fin dallway();找任意两个景点之间的所有路径;(存在栈里面) ShortestwayO;任意两个景点之间中转次数最少的路径;(从栈里面读取出来) NicewayO;任意两个景点之间总权值最小的路径;(从栈里面读取出来) Calculate();(从栈里面读取出来相关数据),进行分析运算;Byebye();你懂得!四、概要设计1、方案设计对系统进行分析,给出景区图+++++++++++牛++++++++¥++++占-I-ILnJ一戸IJ]一(一恃//思想;递归结合循环,然后,找到终点时还要回溯;两点之间的所有路径void findallway(adjlist *G,int m,int n)//int i,t,k;arcnode *p;p a_th rp;p ush(s,m);G->vertex[m-1].flag=1;if(m==n)rp .sumweight=k=calculate(G);rp .sum=s->t op;rp.num=(y+1);p ush1(&z,r p);printf(" 路径%3d 为(途径%2d 个景点,长度为%3d) : ",y+1,s->top,k);for(i=O;iv=s->t op ;i++)p rintf("->%d",s->elem[i]);p rintf("\n");G->vertex[m-1].flag=1;y++;//外部全局变量二for(p=G->vertex[m-1].firstarc ;p!=NULL ;p=p-> nextarc)t=p->num;if(G->vertex[t-1].flag==0)findallway(G,t,n);G->vertex[s->elem[s->to p]-1].flag=0;// pop s(s);}//从文件里读取数据;错误1 ;不知道此节点有几个邻接点,因为%s 的原因,就会只把第一个节点的相关数据读出来,从第二个节点的相关信息处,开始读出错误(即烫烫烫烫烫烫烫烫烫烫烫)不超过m;错误2 ;读文件时,因为有链表的部分,就按照单链表的创建些写,结果总是此节点的 最后一个邻接点没被读到内存里,究其原因,是最后一个 (不仅我把 p2->nextarc=NULL;还把 free(p1);)void readnet(adjlist *G) {int i,count,m;arcnode *head,* p2,* p1; FILE *fp;fp=fo pen(U,"rt"); if(fp==NULL) {printf(-文件打开失败! ! ");exit(0);}for(i=0;i<vnum;i++) {fscanf(fp,"%d %s %s %d %d",&G->vertex[i].num,G->vertex[i].name,G->vertex[i].introduce,&G->vertex[ i].sum,&G->vertex[i].flag);//fprintf()的''后面不加第一个空格也可以。

数据结构课程设计--校园导游咨询【范本模板】

数据结构课程设计--校园导游咨询【范本模板】

琼州学院电子信息工程学院课程设计报告课程名称: 《数据结构》课程设计设计题目:校园导游咨询专业:软件工程班级:2010软件工程学生姓名:学号:起止日期:指导教师:琼州学院本科生课程设计注意事项注意事项一、设计目的《数据结构》是一门实践性较强的软件基础课,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。

本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。

二、设计要求1.通过这次课程设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深课程基本内容的理解。

同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

2.学生必须仔细研读《数据结构》课程设计要求,以学生自学为主、指导教师指导为辅,独立完成课程设计的任务,有问题及时主动与指导教师沟通。

3.本次课程设计按照教学要求需要在本学期15周前完成,学生要发挥自主学习的能力,充分利用时间,安排好课程设计的时间计划,并在课程设计过程中不断检测自己的计划完成情况,及时向指导教师汇报。

4.编程语言:C 语言。

三、课程设计说明书的格式要求设计文档的撰写必须提前进行,以保证使文档与程序同步提交。

1.设计题目2.运行环境(软、硬件环境)3.算法的需求分析4.算法概要设计5.算法详细设计6.算法的测试7.运行结果分析8.收获及体会四、问题分析、设计和测试过程要规范化1.需求分析:将题目中要求的功能进行叙述分析。

2.概要设计:算法的设计说明,描述解决此问题的数据存储结构,(有些题目已经指定了数据存储的,按照指定的设计),描述算法建议使用流程图,进行算法分析指明关键语句的时间复杂度。

3.详细设计:即各个算法的具体实现步骤,每个题目要有相应的源程序,其中每个功能模块采用不同的函数实现。

数据结构校园导游咨询系统课程设计报告及课程总结.doc

数据结构校园导游咨询系统课程设计报告及课程总结.doc

姓名:班级:学号:指导教师:2012年12月目录1、需求分析 (1)1.1 系统简介 (1)1.2 系统功能模块介绍 (1)2、概要设计 (1)2.1 系统功能结构图 (1)2.2 系统流程图 (2)2.3 主要函数概要设计 (3)2.3.1 主函数概要设计 (3)2.3.2 初始化图函数InitGraph() (3)2.3.4 查询景点信息函数设计SearchGraph() (4)2.3.5 显示图中信息函数设计ShowGraph() (4)2.3.6 弗洛伊德算法函数设计Floyd() (4)3、详细设计 (4)3.1 主函数详细设计 (4)3.2初始化图函数详细设计InitGraph() (5)3.3查询景点信息函数详细设计SearchGraph() (6)3.4 弗洛伊德算法函数详细设计Floyd() (7)4、调试分析 (8)4.1 显示主界面函数测试 (8)4.2 查找两景点间最短路径测试 (9)4.3 查看景点信息测试 (10)5.课程设计总结 (11)6、附录 (12)1、需求分析1.1 系统简介随着现代社会生活节奏的加快,人们外出旅行以寻求放松的时间越来越多。

考虑到游客不可能对所有景点都有所了解,因此可能无法找到游玩景点最省时,最高效的路径,而人工导游成本又过高,故使用C语言,基于《数据结构》中图的相关算法开发了“江西农业大学校园咨询系统”。

开发本系统目的在于为来访我校的游客提供一条最短游览路径,本系统从实际出发,通过对校园平面图的分析,将其转化为数据并保存在系统中,因此系统提供的路径具有较大的可信性。

本系统界面友好,提示信息充分,在实际使用过程中运行良好。

1.2 系统功能模块介绍本系统主要分为以下三大功能模块:1、查询两景点最短路径:用户在选择此功能模块后,按照屏幕上方提示的景点名称及其对应的编号,要求用户输入起点和终点的编号,系统将在已存储的景点中进行匹配,若未找到所需查询的景点编号,系统将提示错误并要求用户再次输入。

校园导游咨询系统-中南大学数据结构课程设计

校园导游咨询系统-中南大学数据结构课程设计

程序实现过程中的主要难点和解决方法
程序设计的主要难点就是在对结构体的设计和弗洛伊德算法的具体实 现上,通过查询数据结构的书及相关算法书,我了解到弗洛伊德算法主要运 用了动态规划的相关思想, 通过一个图的权值矩阵求出它的每两点间的最短 路径矩阵。 从图的带权邻接矩阵 A=[a(i,j)] n×n 开始, 递归地进行 n 次更新, 即由矩阵 D(0)=A,按一个公式,构造出矩阵 D(1);又用同样地公式由 D(1)
主要数据结构
链接矩阵,相关代码 typedef struct arc { int adj; }arc,adjmatrix[40][40];
//路径长度 //建一个结构体数组保存路径长度
typedef struct scenery //存储景点信息 { int num;//景点编号 char name[20];//景点名称 char introduction[200];//景点介绍 }scenery;
主要流程: int main() { b=initgraph(); while(1) { Menu(); int choice; cin>>choice; switch(choice)
//初始化
//界面 //选择功能
4
{ case 1: 查看校园景点 showall(&b); system("pause"); system("cls"); break; case 2: 查看景点信息 showselect(&b); system("pause"); system("cls"); break; case 3: 查找最短旅游路线 floyd(&b); system("pause"); system("cls"); break; case 4: 退出系统 exit(1); break; default: cout<<"请在 1-4 中选择操作!"<<endl; system("pause"); system("cls"); break; } } return 0; }

数据结构校园导游咨询系统课程设计报告及课程总结解读

数据结构校园导游咨询系统课程设计报告及课程总结解读

姓名:班级:学号:指导教师:2012年12月目录1、需求分析 (1)1.1 系统简介 (1)1.2 系统功能模块介绍 (1)2、概要设计 (2)2.1 系统功能结构图 (2)2.2 系统流程图 (2)2.3 主要函数概要设计 (3)2.3.1 主函数概要设计 (3)2.3.2 初始化图函数InitGraph() (4)2.3.4 查询景点信息函数设计SearchGraph() (4)2.3.5 显示图中信息函数设计ShowGraph() (4)2.3.6 弗洛伊德算法函数设计Floyd() (5)3、详细设计 (5)3.1 主函数详细设计 (5)3.2初始化图函数详细设计InitGraph() (6)3.3查询景点信息函数详细设计SearchGraph() (7)3.4 弗洛伊德算法函数详细设计Floyd() (8)4、调试分析 (9)4.1 显示主界面函数测试 (9)4.2 查找两景点间最短路径测试 (10)4.3 查看景点信息测试 (11)5.课程设计总结 (12)6、附录 (13)1、需求分析1.1 系统简介随着现代社会生活节奏的加快,人们外出旅行以寻求放松的时间越来越多。

考虑到游客不可能对所有景点都有所了解,因此可能无法找到游玩景点最省时,最高效的路径,而人工导游成本又过高,故使用C语言,基于《数据结构》中图的相关算法开发了“江西农业大学校园咨询系统”。

开发本系统目的在于为来访我校的游客提供一条最短游览路径,本系统从实际出发,通过对校园平面图的分析,将其转化为数据并保存在系统中,因此系统提供的路径具有较大的可信性。

本系统界面友好,提示信息充分,在实际使用过程中运行良好。

1.2 系统功能模块介绍本系统主要分为以下三大功能模块:1、查询两景点最短路径:用户在选择此功能模块后,按照屏幕上方提示的景点名称及其对应的编号,要求用户输入起点和终点的编号,系统将在已存储的景点中进行匹配,若未找到所需查询的景点编号,系统将提示错误并要求用户再次输入。

数据结构课程设计实验报告《校园导游咨询系统》内含程

数据结构课程设计实验报告《校园导游咨询系统》内含程

上海电力学院数据结构C++课程设计题目: 校园导游咨询学生姓名:学号:院系:专业年级:2011年7月1日一、设计题目校园导游咨询;1、实验目的(1)熟练掌握图的创建及遍历基本操作算法。

(2)熟练掌握最短路径算法。

(3)利用图的遍历和最短路径求解技术,设计一个校园导游程序,为来访的客人提供各种信息查询服务。

2、实验内容【问题描述】设计一个校园导游程序,为来访的客人提供各种信息查询服务。

【基本要求】(1)设计你所在学校的校园平面图,所含景点不少于10个。

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

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

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

【测试数据】由读者根据实际情况指定。

【实现提示】一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网。

顶点和边均含有相关信息。

【选作内容】(6)扩充每个景点的邻接景点的方向等信息,使得路径查询结果能提供详尽的导向信息。

二、小组成员分工说明略三、需求分析1)运行环境(软、硬件环境)硬件环境:windows2000、windows XP、windows7 皆可;软件环境:Microsoft (R) Developer Studio (2)2)输入的形式和输入值的范围输入形式:整形数据(景点代号、路径长度、地图上的方位信息),字符串(景点名称及简介);输入值范围:景点代号为:整形0~17(共18个景点)路径长度为:整形1~10(两景点间距离,以近似1::100m比例换算,最远1km)景点名称字符串长度:整形1~15(景点名称)字符串长度为:字符数组1~50(对景点进行简要介绍)景点在地图方位图上的位置:整形0~103)输出的形式描述景点代号、景点名称、信息的关联以cout形式输出,告知来访客人,以便查询;景点信息查询结果的输出形式为cout字符串;两景点间最短路径输出形式为cout字符串符号、以及嵌套的printroad()函数以显示路径信息及方位信息,方便客人获取最佳路线;4)功能描述(1)设计学校的校园平面图,所含景点18个。

(完整word版)数据结构课程设计校园导游咨询

(完整word版)数据结构课程设计校园导游咨询

9、校园导游咨询问题描述:设计一个校园导游程序,为来访的客人提供各种信息查询服务。

基本要求:⑴设计华东交通大学的校园平面图,所含景点不少于10个。

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

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

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

#include <stdio.h>#define MAXV 100 //最大顶点个数#define INF 32767 //用32767表示∞#include <stdlib.h> //调用函数system改变字体颜色的头文件typedef int InfoType;#define MAXV 100 //最大顶点个数//以下定义邻接矩阵类型typedef struct{ int no; //顶点编号InfoType info; //顶点其他信息} VertexType; //顶点类型typedef struct //图的定义{ int edges[MAXV][MAXV]; //邻接矩阵int vexnum,arcnum; //顶点数,弧数VertexType vexs[MAXV]; //存放顶点信息} MGraph;void ecjtumap()//建立华东交通大学地图{ printf("\t|-------------------------------------------------------------|\n");printf("\t| |\n");printf("\t| |\n");printf("\t| ---------- |\n");printf("\t| ==============================| 国防生宿舍| |\n");printf("\t| 。

校园导游咨询系统数据结构课程设计c语言

校园导游咨询系统数据结构课程设计c语言

校园导游咨询系统数据结构课程设计c语言校园导游咨询系统数据结构课程设计c语言一、课程设计的目的本次课程设计旨在通过C语言程序设计实现校园导游咨询系统,学生能够了解并掌握数据结构的基本概念、算法和编程技术,培养学生的编程能力和解决实际问题的能力。

二、系统需求分析(1)用户管理系统需要实现学生、教师、管理员三种用户的管理,分别具有不同的权限等级。

要实现用户注册、登录、退出等基本功能。

(2)地图导航系统需要实现校内地图的导航功能,包括校门、教学楼、图书馆、宿舍等位置的标注,提供校园内部的导航和查找服务。

(3)建筑信息系统需要提供校内建筑的信息查询功能,包括建筑名称、位置、使用情况等,方便师生查询。

(4)在线咨询系统需要提供在线咨询功能,方便学生、教师等用户在线咨询学校相关事宜,并实现客服人员的消息处理。

三、数据结构设计(1)用户信息表采用哈希表作为用户信息表的数据结构,将用户信息存储在表中,方便用户登录和信息的管理。

哈希表的键值是用户名,值是用户信息(包括用户名、密码、权限等级等)。

(2)建筑信息采用结构体数组作为建筑信息的数据结构,将建筑信息存储在数组中,方便查询和展示。

结构体包含建筑名称、位置、使用情况等信息。

(3)校内地图为方便地图导航,采用邻接矩阵作为校内地图的数据结构,将校内各个建筑之间的距离存储在矩阵中。

矩阵的行和列分别表示建筑的编号,矩阵元素表示建筑之间的距离。

(4)消息队列为实现在线咨询功能,采用队列作为消息队列的数据结构,将用户发送的消息存储在队列中。

消息队列的队首指针和队尾指针分别表示最早和最晚的消息,方便客服人员的处理。

四、代码实现(1)用户管理用户管理实现了注册、登录和退出等功能。

用户密码使用MD5加密,保证用户信息的安全性。

管理员可以添加、删除学生和教师用户。

(2)地图导航地图导航实现了最短路径算法和深度优先搜索算法,方便用户查询和展示校内地图。

用户可以查找建筑的详细信息,包括位置、使用情况等。

数据结构课程设计——校园导游咨询系统

数据结构课程设计——校园导游咨询系统

数据结构课程设计——校园导游咨询系统在当今数字化的时代,信息的高效获取和处理变得至关重要。

对于一个大型校园来说,拥有一个便捷的导游咨询系统能够极大地提升访客和新生的体验。

本次数据结构课程设计的目标就是创建一个实用的校园导游咨询系统。

一、系统需求分析首先,我们需要明确这个校园导游咨询系统的主要功能和用户需求。

对于访客和新生来说,他们可能希望了解校园内各个景点的位置、简介,以及如何从当前位置到达目标景点的最优路径。

系统应该能够提供清晰准确的地图信息、景点介绍和导航指引。

从学校管理的角度出发,系统需要易于更新和维护,能够及时添加新的景点或者修改已有景点的信息。

同时,为了保证系统的稳定性和安全性,需要有一定的权限管理机制,防止未经授权的修改和访问。

二、数据结构选择为了实现上述功能,我们需要选择合适的数据结构来存储和管理校园的相关信息。

对于校园地图的表示,可以使用图(Graph)这种数据结构。

将校园中的各个景点看作图中的节点,景点之间的道路看作边,边的权重可以表示道路的长度或者行走所需的时间。

为了存储景点的详细信息,如名称、简介等,可以使用结构体或者类。

每个景点的结构体或类成员包含景点的标识符、名称、简介等属性。

对于路径搜索和导航,我们可以选择迪杰斯特拉(Dijkstra)算法或者 A算法来计算最短路径。

三、系统功能模块设计1、地图显示模块能够以直观的方式展示校园的地图,包括各个景点的位置和连接关系。

支持缩放、平移等操作,方便用户查看不同区域的细节。

2、景点信息查询模块用户可以输入景点名称或关键词,系统能够快速检索并显示相应景点的详细信息。

3、路径规划模块根据用户输入的起始景点和目标景点,计算并显示最优的行走路径。

能够提供多种路径选择,如最短路径、最少转弯路径等。

4、周边设施查询模块用户可以查询某个景点周边的餐厅、商店、卫生间等设施的位置。

5、用户管理模块只有授权的管理员能够对校园景点信息和地图进行修改和更新。

数据结构课程设计——校园导游咨询系统

数据结构课程设计——校园导游咨询系统

数据结构课程设计——校园导游咨询系统1:需求分析:(1)任务:编制一个为来访客人进行最短路径导游的程序(2)要求:从学校的平面上选取n个有代表性的景点,根据用户指定的起点和终点输出相应路径。

2:概要设计:(1)1)a)AdjMGraph.h图操作的函数所放的头文件b) AdjMGraphCreate.h图的创建函数所放的头文件c) Dijkstra.h狄克斯特拉函数设计所放的头文件d) SeqList.h存放顺序表的头文件2)SchoolGuide.c文件包括以下三个函数void SgPrint(AdjMGraph g,int n,int distance[],int path[],int j)函数,其功能是将源点到各个结点的最短距离和最短路径的结果输出;void Sgblueprint()函数,其功能是将校园平面图输出;void main(void)函数,主函数,功能是调用测试数据值,显示主菜单,根据用户输入的i进行不同功能操作,随后根据用户输入的ch值进行不同功能操作。

(2)该程序所使用的存储结构是顺序存储;(3)流程图:图1-1主函数main()流程图图1-2 SgPrint函数流程图3:详细设计:(1)/*顺序表头文件SeqList.h*/typedef struct{DataType list[MaxSize];int size;}SeqList;void ListInitiate(SeqList *L) /*初始化顺序表L*/ {L->size=0; /*定义初始化数据元素个数*/}int ListLength(SeqList L) /*返回顺序表L的当前数据元素个数*/{return L.size;}int ListInsert(SeqList *L,int i,DataType x)/*在顺序表L的第i(0≤i≤size)个位置前插入数据元素值x*//*插入成功返回1,插入失败返回0*/{int j;if(L->size>=MaxSize){printf("顺序表已满无法插入!\n");return 0;}else if(i<0||i>L->size){printf("参数i不合法!\n");return 0;}else{/*为插入做准备*/for(j=L->size;j>i;j--)L->list[j]=L->list[j-1];L->list[i]=x;/*插入x*/L->size++;/*元素个数加1*/return 1;}}int ListDelete(SeqList *L,int i,DataType *x){/*删除顺序表L中位置为i(0≤i≤size-1)的数据元素并存放到x中*/ /*删除成功返回1,删除失败返回0*/int j;if(L->size<=0){printf("顺序表已空无数据元素可删!\n");return 0;}else if(i<0||i>L->size-1){printf("参数i不合法");return 0;}else{*x=L->list[i]; /*保存删除的元素到x中*//*依次前移*/for(j=i+1;j<=L->size-1;j++)L->list[j-1]=L->list[j];L->size--;return 1;}}int ListGet(SeqList L,int i,DataType *x)/*取顺序表L中第i个数据元素存于x中,成功返回1.失败返回0*/ {if(i<0||i>L.size-1){printf("参数i不合法!\n");return 0;}else{*x=L.list[i];return 1;}}(2)/*AdjMGraph.h图操作的函数所放的头文件*/#include"Seqlist.h"/*包含顺序表头文件*/typedef struct{SeqList Vertices;/*存放结点的顺序表*/int edge[MaxVertices][MaxVertices];/*存放边的邻接矩阵*/ int numOfEdges;/*边的条数*/}AdjMGraph;/*图的结构体定义*/void Initiate(AdjMGraph *G,int n)/*初始化*/{int i,j;for(i=0;i<n;i++)for(j=0;j<n;j++){if(i==j) G->edge[i][j]=0;else G->edge[i][j]=MaxWeight;}G->numOfEdges=0;/*边的条数置为0*/ListInitiate(&G->Vertices);/*顺序表初始化*/}void InsertVertex(AdjMGraph *G,DataType vertex)/*在图G中插入结点vertex*/{ListInsert(&G->Vertices,G->Vertices.size,vertex);/*顺序表尾插入*/}void InsertEdge(AdjMGraph *G,int v1,int v2,int weight)/*在图G中插入边<v1,v2>,边<v1,v2>的权为weight*/if(v1<0||v1>G->Vertices.size||v2<0||v2>G->Vertices.size){printf("参数v1或v2越界出错!\n");exit(1);}G->edge[v1][v2]=weight;G->numOfEdges++;}void DeleteEdge(AdjMGraph *G,int v1,int v2)/*在图G中删除边<v1,v2>*/{if(v1<0||v1>G->Vertices.size||v2<0||v2>G->Vertices.size){printf("参数v1或v2越界出错!\n");exit(1);}G->edge[v1][v2]=MaxWeight;G->numOfEdges--;}void DeleteVerten(AdjMGraph *G,int v)/*删除结点V*/{int n=ListLength(G->Vertices),i,j;DataType x;for(i=0;i<n;i++)/*计算删除后的边数*/for(j=0;j<n;j++)if((i==v||j==v)&&G->edge[i][j]>0&&G->edge[i][j]<MaxWeight) G->numOfEdges--;/*计算被删除边*/for(i=v;i<n;i++) /*删除第v行*/for(j=0;j<n;j++)G->edge[i][j]=G->edge[i+1][j];for(i=0;i<n;i++) /*删除第v列*/for(j=v;j<n;j++)G->edge[i][j]=G->edge[i][j+1];ListDelete(&G->Vertices,v,&x);/*删除结点v*/}int GetFirstVex(AdjMGraph G,int v)/*在图G中寻找序号为v的结点的第一个邻接结点*//*如果这样的邻接结点存在,返回该邻接结点的序号;否则,返回-1*/int col;if(v<0||v>G.Vertices.size){printf("参数v越界出错\n");exit(1);}for(col=0;col<G.Vertices.size;col++)if(G.edge[v][col]>0&&G.edge[v][col]<MaxWeight)return col;return -1;}int GetNextVex(AdjMGraph G,int v1,int v2)/*在图G中寻找v1结点的邻接结点v2的下一个邻接结点*//*如果这样的邻接结点存在,返回该邻接结点的序号;否则,返回-1*//*v1和v2都是相应结点的序号*/{int col;if(v1<0||v1>G.Vertices.size||v2<0||v2>G.Vertices.size){printf("参数v1或v2越界出错!\n");exit(1);}for(col=v2+1;col<G.Vertices.size;col++)if(G.edge[v1][col]>0&&G.edge[v1][col]<MaxWeight) return col;return -1;}(3)/*AdjMGraphCreate.h图的创建函数所放的头文件*/typedef struct{int row;/*行下标*/int col;/*列下标*/int weight;/*权值*/}RowColWeight;/*边信息结构体定义*/void CreatGraph(AdjMGraph *G,DataType V[],int n,RowColWeight E[],int e) /*在图G中插入n个结点信息V和e条边信息E*/{int i,k;Initiate(G,n);/*结点顺序表初始化*/for(i=0;i<n;i++)InsertVertex(G,V[i]);/*结点插入*/for(k=0;k<e;k++)InsertEdge(G,E[k].row,E[k].col,E[k].weight);/*边插入*/}(4)/* Dijkstra.h狄克斯特拉函数设计所放的头文件*/void Dijkstra(AdjMGraph G,int v0,int distance[],int path[])/*带权图G从下标v0结点到其他结点的最短距离distance*//*和最短路径下标path*/{int n=G.Vertices.size;int *s=(int *)malloc(sizeof(int)*n);int minDis,i,j,u;/*初始化*/for(i=0;i<n;i++){distance[i]=G.edge[v0][i];s[i]=0;if(i!=v0&&distance[i]<MaxWeight) path[i]=v0;else path[i]=-1;}s[v0]=1;/*标记结点v0已从集合T加入到集合S中*//*在当前还未到最短路径的结点集中选取具有最短距离的结点u*/for(i=1;i<n;i++){minDis=MaxWeight;for(j=0;j<n;j++)if(s[j]==0&&distance[j]<minDis){u=j;minDis=distance[j];}/*当已不再存在最短路径时算法结束;此语句对非连通图是必须的*/if(minDis==MaxWeight)return;s[u]=1;/*标记结点u已从集合T加入到集合S中*//*修改从v0到其他结点的最短距离和最短路径*/for(j=0;j<n;j++)if(s[j]==0&&G.edge[u][j]<MaxWeight&&distance[u]+G.edge[u][j]<distance[j]) {/*结点v0经结点u到其他结点的最短距离和最短路径*/distance[j]=distance[u]+G.edge[u][j];path[j]=u;}}}(5)/*SchoolGuide.c文件*/#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef char DataType;#define MaxSize 100#define MaxVertices 10#define MaxWeight 10000#include"AdjMGraph.h"#include"AdjMGraphCreate.h"#include"Dijkstra.h"void SgPrint(AdjMGraph g,int n,int distance[],int path[],int j){ /*输出源点到其他各结点的最短距离和最短路径*/int i;/*从源结点到其他各结点的最短路径及其距离分别为:*/printf("从该结点%c到其他各结点的最短路径及其距离分别为:\n",g.Vertices.list[j]);printf("\n");//输出换行符for(i=0;i<n;i++){ /*从源结点到当前结点的最短路径为*/printf("从结点%c到结点%c的最短路径为:",g.Vertices.list[j],g.Vertices.list[i]);printf("(");//输出左括号if(path[i]!=-1)//源点到其他结点的最短路径的前一结点判断{ if(path[path[i]]!=-1)//该前一结点的前一结点进行判断{if(path[path[path[i]]]!=-1)//该前一结点的前一结点的前一结点进行判断{printf("%c,",g.Vertices.list[path[path[path[i]]]]);//输出相应存在的前一结点}printf("%c,",g.Vertices.list[path[path[i]]]);//输出应存在的前一结点}printf("%c,",g.Vertices.list[path[i]]);//输出应存在的前一结点}printf("%c",g.Vertices.list[i]);//输出当前结点printf(")");//输出换行符右括号printf(",其最短距离为%d;\n",distance[i]);//输出源点到其他结点的最短距离printf("\n");//输出换行符}}void Sgblueprint(){/*显示校园平面图*/printf(" ——————校园平面图——————\n");printf(" B(学生宿舍)———————————————————E(商业街)\n");printf(" / \\ / | \n");printf(" / \\ / | \n");printf(" / \\(B到D) /| \n");printf(" / \\ / | \n");printf(" / \\ / | \n");printf("A(校门口) ———————————————————D(学校食堂和 | \n");printf("| 学校田径场(学校田径场在学校食堂后面)) \\ | \n");printf("| \\(D到F)| \n");printf("| \\| \n");printf("C(第一、第二教学楼和校办) ———————————————————F(第三教学楼和实验楼)\n");}void main(void){AdjMGraph g;char a[]={'A','B','C','D','E','F'};RowColWeightrcw[]={{0,2,5},{0,3,30},{1,0,2},{1,4,8},{2,1,15},{2,5,7},{4,3,4},{5,3,10},{5,4,18}};int i,j,n=6,e=9;//i为控制控制菜单项的数值,j为选取源点的数值char ch;int distance[6],path[6];printf(" 校园导游咨询系统------您身边的导游 \n");printf("\n");printf("\n");printf("\n");/*菜单选项*/printf(" 1:请求校园导游帮组(即咨询校园各景点最短路径)\n");printf(" 2:显示校园平面图\n");printf(" 3:退出校园导游咨询系统\n");printf("请输入你所想进行的功能选项:\n");scanf("%d",&i); //输入控制控制菜单项的数值i的值CreatGraph(&g,a,n,rcw,e);//创建图switch(i){ //选择菜单项的操作case 1:system("cls");/*调用输出校园平面图函数并输出校园平面图*/Sgblueprint();/*提示用户输入起点的序列号*/printf("请输入你所在地或起点的序列号(A-F的序列号为依次0,1,2,3,4,5):\n");scanf("%d",&j);//用户输入起点的序列号i的值/*调用狄克斯特拉函数计算源点的其他各结点的最短路径及其距离*/Dijkstra(g,j,distance,path);/*提示用户参照校园平面图以了解各景点的代号的含义*/printf("提示:下列A、B、C等均是各景点的代号,如有问题,请参考上面的校园平面图\n");/*调用输出源点到其他各结点的最短距离和最短路径函数并输出相应的最短路径和最短距离*/SgPrint(g,n,distance,path,j);break;case 2:system("cls");Sgblueprint();//调用输出校园平面图函数并输出校园平面图break;case 3:exit(1);break;//退出程序}while(3)//判断程序是否继续运行{printf("\n您是否还想进行其他操作(y/n):\n");//提示用户是否还需继续进行其他操作scanf("%s",&ch);//用户输入y/n以选择是否仍需进行其他操作if(ch=='Y'||ch=='y')//判断用户所输入的ch值是否为y/Y,以判断用户是否进行其他操作{system("cls");printf(" 校园导游咨询系统------您身边的导游 \n");printf("\n");printf("\n");printf("\n");/*菜单选项*/printf(" 1:请求校园导游帮组(即咨询校园各景点最短路径)\n");printf(" 2:显示校园平面图\n");printf(" 3:退出校园导游咨询系统\n");printf("请输入你所想进行的功能选项:\n");scanf("%d",&i);switch(i){ //选择菜单项的操作case 1:system("cls");/*调用输出校园平面图函数并输出校园平面图*/Sgblueprint();/*提示用户输入起点的序列号*/printf("请输入你所在地或起点的序列号(A-F的序列号为依次0,1,2,3,4,5):\n");scanf("%d",&j);//用户输入起点的序列号i的值/*调用狄克斯特拉函数计算源点的其他各结点的最短路径及其距离*/Dijkstra(g,j,distance,path);/*提示用户参照校园平面图以了解各景点的代号的含义*/printf("提示:下列A、B、C等均是各景点的代号,如有问题,请参考上面的校园平面图\n");/*调用输出源点到其他各结点的最短距离和最短路径函数并输出相应的最短路径和最短距离*/SgPrint(g,n,distance,path,j);break;case 2:system("cls");Sgblueprint();//调用输出校园平面图函数并输出校园平面图break;case 3:exit(1);break;//退出程序}}else return;//退出程序}}4:调试分析:(1)a)测试数据:char a[]={'A','B','C','D','E','F'};RowColWeightrcw[]={{0,2,5},{0,3,30},{1,0,2},{1,4,8},{2,1,15},{2,5,7},{4,3,4},{5,3,10},{5,4,18}}; int n=6,e=9;b)测试结果:(2)所遇到的问题:1)SgPrint函数中的形参如何设置,通过仔细分析图的操作等头文件和主函数,最终分析函数SgPrint中应加入形参AdjMGraph g,int n,int distance[],int path[],int j;2)Sgblueprint函数中输出语句中想输出’\’,直接键入’\’发现不能输出’\’,最终查看消息窗口的提示信息和联系C语言中有关转义字符的相关知识,知道了如果相输出转义字符’\’本身就必须书写成’\\这样的格式;3)在进行菜单项操作时,如何做到清除原有屏幕的操作,通过上网查资料了解到,只需加入“system(“cls”);”该语句即可;4)SgPrint函数中如何实现输出如“从结点A到结点B的最短路径为:(A,C,B),其最短距离为20;”格式,通过分析Dijkstra.h和主函数,最终想到只需添加“if(path[i]!=-1){ if(path[path[i]]!=-1){if(path[path[path[i]]]!=-1){printf("%c,",g.Vertices.list[path[path[path[i]]]]);}printf("%c,",g.Vertices.list[path[path[i]]]);}printf("%c,",g.Vertices.list[path[i]]);}”这些代码,对源点到其他结点的最短路径的前一结点以及该前一结点的前一结点进行判断,并将这些结点输出,就能够解决上述问题。

校园导游咨询系统---数据结构课程设计.

校园导游咨询系统---数据结构课程设计.

图1
当输入1时进入一个选择子菜单(输入错误时,保持原有状态),正确输入
图2
图3
按100推出此环节,当在选择主菜单选择2时,出现如下图4所示子菜单:
图4
当输入1时,则按景点编号查询,当输入6(地球科学博物馆)时,屏幕上打印出此景点信息:里面有著名的不寻常恐龙化石;当输入4(实验楼)时,屏
图5
当输入2时,则按景点名称查询,当输入“图书馆”时,屏幕上打印出此景点信息:图书馆是莘莘学子学习的园地,里面有各科资料,每人可以任借五本书;当输入“计算机实验室”时,屏幕上打印出此景点信息:计算机专业实验实习场所;当输入“教学三号楼”时,此景点不存在,屏幕上显示:!!!没*有*找*到!!!;如下图6所示:
图6
图7
在选择主菜单输入错误时,程序不作反应,当输入e时,则退出,如下图8所示
图8。

数据结构-校园导游系统

数据结构-校园导游系统

课程设计论文(附有代码!)题目:校园导游咨询学院:计算机科学与工程学院专业:计算机科学与技术姓名:学号:指导教师:2014年9月22日摘要桂林众山环绕,风景优美,加之近年来校园环境也得到不断地改善,来访校园的游客逐渐增加,为了方便众多游客对校园景点的参观,需要给来访人士提供校园导游咨询服务,利用计算机建立一个便利的咨询系统可以很好地解决这个问题。

在本设计实验中,我所采用的是邻接矩阵作为数据的存储结构,用不同的功能模块对两地距离和校园道路信息进行编辑。

当游客来访时,系统能根据用户输入的景点代号查询景点信息,提供任意两个景点间的最短路径查询,并能查询校园内的交通信息,方便游客访问。

工作人员还可以为校园更新景点以及路径信息。

本文将简单介绍该系统的开发背景,详细介绍系统的主要设计思路,函数的建立和使用过程,该系统功能的实现方式和实现结果,以及对所遇到问题的分析解决,最后对该系统进行总结描述。

关键词:校园导游咨询;C++;数据结构;最短路径;查询;目录引言 (1)1系统概述 (1)2需求分析 (1)2.1 系统需求 (1)2.2 开发环境 (2)3详细设计 (3)3.1 系统结构 (3)3.2 数据结构设计以及数据的初始化 (4)3.2.1 图结构设计 (4)3.2.2 数据的初始化 (4)3.3 查询模块的详细设计 (5)3.3.1 查询模块功能子函数设计 (5)3.4 更新功能模块详细设计 (7)3.4.1 更新模块功能子函数设计 (8)4所遇到的问题和分析解决 (10)5系统特色及关键 (11)6结论 (12)参考文献 (13)引言随着计算机科学技术的不断提高,计算机依靠其强大的功能已经成为人们生活中不可缺少的一部分,计算机能解决人类生活中的大部分问题,为人类文明和社会进步做出了巨大贡献。

桂林是一个全世界著名的旅游城市,近几年来旅游业得到了飞速的发展,来自各个国家各个城市的游客给城市带来了巨大的经济效益。

C++数据结构课程设计-校园导游咨询系统

C++数据结构课程设计-校园导游咨询系统

数据结构(C++)课程设计题目: 校园导游咨询*姓名:学号:院系:专业年级:2014年7月8日目录一、设计题目 (2)二、需求分析 (2)三、概要设计 (6)四、详细设计 (11)五、调试分析 (14)六、测试结果 (14)七、附录:程序设计源代码 (21)一、设计题目校园导游咨询*二、需求分析1)运行环境(软、硬件环境)电脑型号X64 兼容台式电脑处理器英特尔第二代酷睿***************四核主板华硕P8H61-M LX (英特尔H61 芯片组)内存8 GB ( 威刚DDR3 1333MHz )主硬盘西数WDC WD10EALX-009BA0 ( 1 TB / 7200 转/分)显卡ATI Radeon HD 6700 Series ( 512 MB / ATI )显示器SGW5600 PL2208HD ( 21.7 英寸)光驱华硕DRW-24D1ST a DVD刻录机声卡瑞昱ALC887 @ 英特尔 6 Series Chipset 高保真音频网卡瑞昱RTL8168E PCI-E Gigabit Ethernet NIC / 华硕操作系统:Windows 7 Ultimate (x86) sp1编程环境:Microsoft Visual Studio 20122)输入的形式和输入值的范围内容形式范围景点代号int 自然数景点名称string 所有字符景点简介string 所有字符X坐标int 正整数Y坐标int 正整数3)输出的形式描述内容形式范围景点代号int 自然数景点名称string 所有字符景点简介string 所有字符X坐标int 正整数Y坐标int 正整数最短路径图像jpg4)功能描述以我校南汇校区部分景点、进行抽象化,生成了具有15个顶点、18条边的图,以邻接表与邻接矩阵复合形式储存在内存中,主要有以下功能:a.查询景点的信息,包括基本信息和拓展的周围节点信息;b.景点导航,给出起点、终点,规划出最短路径和风景最佳路径;c.修改景点,道路信息,包括添加景点、添加道路、修改景点功能;d.开发人员工具,包括邻接表、邻接矩阵的查看DFS深度优先遍历、BFS广度优先遍历e.显示地图,打开预制的地图文件查看5)测试数据初始地图信息:景点景点名称景点介绍X坐标Y坐标编号0 北校门学校的北入口 2 141 北图书馆学校北侧图书馆12 142 崇德楼经管学院楼26 143 奋进楼公共机房12 2826 284 北运动场具有足球场、篮球场、健身房等12 325 行政楼计算机学院楼及其他行政办公12 396 教师活动中心又称H楼,具有桌球、乒乓球、会议室、舞厅等7 雕塑校园雕塑26 398 南校门学校南入口 2 509 至诚楼办理学生事务处12 5026 5010 大礼堂学校大型文艺演出、讲座场所11 南图书馆学校南侧的图书馆12 52团委、学生会、社联所在处12 1212 大学生文化活动中心13 风帆广场绿地广场,景色优美26 5812 7014 南运动场具有足球场、篮球场、羽毛球场等距离邻接矩阵:三、概要设计1)抽象数据类型定义描述(对各类的成员及成员函数进行抽象描述,参见书或ppt及实验)Site类Data:编号Code景点名称SiteName景点介绍Introduction景点X坐标景点Y坐标Operation:构造函数输入:编号,名称,介绍,X坐标,Y坐标前置条件:无动作:初始化Site类元素输出:无后置条件:无SetSite输入:编号,名称,介绍,X坐标,Y坐标前置条件:无动作:赋值Site类元素输出:无后置条件:无ArcNode类Data :邻接点下标值Adjvx指向下一个边结点的指针*nextarc;风景等级sceneLevel;距离distance;Operation:构造函数输入:Adjvx, *nextarc, sceneLevel;前置条件:无动作:初始化ArcNode类输出:无后置条件:无VertexNode类Data :节点内容vex节点首指针*firstarcOperation:无Road类Data :Site型节点1,节点2距离Distance风景等级Bool型是否是机动车道carAviliable;Operation:SetRoad构造函数输入:节点1,节点2,风景等级前置条件:存在Site对象动作:初始化Road类输出:无后置条件:无BGraph 类Data :邻接表adjlist[]Int 距离矩阵Int 风景值矩阵Operation:构造函数输入:前置条件:动作:输出:后置条件:无addSite函数输入:景点名称,景点信息,景点X坐标,景点Y坐标前置条件:顶点表已建立动作:添加邻接表顶点、修改邻接矩阵输出:无后置条件:无addRoad函数输入:景点1名称,景点2名称,风景等级前置条件:顶点表已建立动作:添加邻接表的边表,修改邻接矩阵输出:无后置条件:无ShowInfo函数输入:无前置条件:函数已初始化动作:输出当前图信息输出:顶点数、边数后置条件:无pGraph函数输入:无前置条件:函数已初始化动作:输出邻接表输出:邻接表后置条件:无pMatrix输入:无前置条件:函数已初始化动作:输出邻接矩阵输出:邻接矩阵后置条件:无searchByName输入:景点名称前置条件:图已初始化动作:搜索符合名称的节点输出:节点site型后置条件:无DFSTraverse函数输入:无前置条件:图已初始化动作:深度优先遍历输出:遍历路径后置条件:无BFSTraverse函数输入:无前置条件:图已初始化动作:广度优先遍历输出:遍历路径后置条件:无FindPath函数输入:节点1,节点2前置条件:图已初始化动作:计算最短路径输出:路径经过点、路径产长度、每一步的方向后置条件:无2)功能模块设计(如主程序模块设计)1.主程序模块:连接各种功能子模块,使用循环等待用户操作,完成程序的基本操作实现功能。

校园导游系统课程设计报告

校园导游系统课程设计报告

南京航空航天大学《数据结构》课程设计报告校园导游系统目录一、需求分析 (2)二、程序的主要功能 (2)三、程序运行平台 (2)四、数据结构 (2)五、算法设计思想及时间复杂度 (2)六、测试用例及结果 (5)七、存在的不足与对策及编程体会 (6)八、程序源代码 (6)一、需求分析南航学生家长及入学新生很需要一个导游程序,来引领他们参观和了解南航。

二、程序的主要功能1、查询各景点的相关信息2、查询任意两景点间的所有路径3、查询任意两景点间的最短路径 1、增加景点4、推荐参观路线 2、删除景点5、更新导游信息(操作需管理员密码) 3、更新道路信息6、对景点联通性的浏览(2阶矩阵表示)4、更新景点信息7、学校全景一览 5、修改管理员密码三、程序运行平台Microsoft Visual C++ 6.0四、数据结构图的邻接矩阵存储表示,栈的顺序存储表示五、算法设计思想及时间复杂度主要函数介绍:1、求两点间的所有路径:a)相关函数:void dfs(MGraph G,SqStack path,int *used,int u,int w);//深度优先遍历b)主要算法思想:栈的相关操作+深度优先搜索创建一个空栈保存路径,一个空数组保存已标记节点,首先让起点进栈,并标记为已访问,然后调用深度优先搜索,如果该顶点的相邻顶点(即与其有直接通路的顶点)未被访问过就标记为已访问,进栈,然后对它调用深度优先搜索,依次类推,直到获得所有到指定终点的路径。

c)时间复杂度:O(VE),其中V为图的顶点数目,E为图中边的数目。

2、求两点间的最短路径:a)相关函数:void ShortestPath(MGraph G,int v0,int P[][Nmax],int *D);//查询任意两景点间的最短路径void PrintShortest(MGraph G,int v1,int v2,int P[][Nmax],int *D); //输出最短路径b)主要算法思想:迪杰斯特拉算法假设起点为v0,S为已找到的从v0出发的最短路径的终点的集合,其初始状态为空集。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计——校园导游咨询系统1:需求分析:(1)任务:编制一个为来访客人进行最短路径导游的程序(2)要求:从学校的平面上选取n个有代表性的景点,根据用户指定的起点和终点输出相应路径。

2:概要设计:(1)1)a)AdjMGraph.h图操作的函数所放的头文件b) AdjMGraphCreate.h图的创建函数所放的头文件c) Dijkstra.h狄克斯特拉函数设计所放的头文件d) SeqList.h存放顺序表的头文件2)SchoolGuide.c文件包括以下三个函数void SgPrint(AdjMGraph g,int n,int distance[],int path[],int j)函数,其功能是将源点到各个结点的最短距离和最短路径的结果输出;void Sgblueprint()函数,其功能是将校园平面图输出;void main(void)函数,主函数,功能是调用测试数据值,显示主菜单,根据用户输入的i进行不同功能操作,随后根据用户输入的ch值进行不同功能操作。

(2)该程序所使用的存储结构是顺序存储;(3)流程图:图1-1主函数main()流程图图1-2 SgPrint函数流程图3:详细设计:(1)/*顺序表头文件SeqList.h*/typedef struct{DataType list[MaxSize];int size;}SeqList;void ListInitiate(SeqList *L) /*初始化顺序表L*/{L->size=0; /*定义初始化数据元素个数*/}int ListLength(SeqList L) /*返回顺序表L的当前数据元素个数*/ {return L.size;}int ListInsert(SeqList *L,int i,DataType x)/*在顺序表L的第i(0≤i≤size)个位置前插入数据元素值x*//*插入成功返回1,插入失败返回0*/{int j;if(L->size>=MaxSize){printf("顺序表已满无法插入!\n");return 0;}else if(i<0||i>L->size){printf("参数i不合法!\n");return 0;}else{/*为插入做准备*/for(j=L->size;j>i;j--)L->list[j]=L->list[j-1];L->list[i]=x;/*插入x*/L->size++;/*元素个数加1*/return 1;}}int ListDelete(SeqList *L,int i,DataType *x){/*删除顺序表L中位置为i(0≤i≤size-1)的数据元素并存放到x中*/ /*删除成功返回1,删除失败返回0*/int j;if(L->size<=0){printf("顺序表已空无数据元素可删!\n");return 0;}else if(i<0||i>L->size-1){printf("参数i不合法");return 0;}else{*x=L->list[i]; /*保存删除的元素到x中*//*依次前移*/for(j=i+1;j<=L->size-1;j++)L->list[j-1]=L->list[j];L->size--;return 1;}}int ListGet(SeqList L,int i,DataType *x)/*取顺序表L中第i个数据元素存于x中,成功返回1.失败返回0*/{if(i<0||i>L.size-1){printf("参数i不合法!\n");return 0;}else{*x=L.list[i];return 1;}}(2)/*AdjMGraph.h图操作的函数所放的头文件*/#include"Seqlist.h"/*包含顺序表头文件*/typedef struct{SeqList Vertices;/*存放结点的顺序表*/int edge[MaxVertices][MaxVertices];/*存放边的邻接矩阵*/ int numOfEdges;/*边的条数*/}AdjMGraph;/*图的结构体定义*/void Initiate(AdjMGraph *G,int n)/*初始化*/{int i,j;for(i=0;i<n;i++)for(j=0;j<n;j++){if(i==j) G->edge[i][j]=0;else G->edge[i][j]=MaxWeight;}G->numOfEdges=0;/*边的条数置为0*/ListInitiate(&G->Vertices);/*顺序表初始化*/}void InsertVertex(AdjMGraph *G,DataType vertex)/*在图G中插入结点vertex*/{ListInsert(&G->Vertices,G->Vertices.size,vertex);/*顺序表尾插入*/}void InsertEdge(AdjMGraph *G,int v1,int v2,int weight)/*在图G中插入边<v1,v2>,边<v1,v2>的权为weight*/{if(v1<0||v1>G->Vertices.size||v2<0||v2>G->Vertices.size) {printf("参数v1或v2越界出错!\n");exit(1);}G->edge[v1][v2]=weight;G->numOfEdges++;}void DeleteEdge(AdjMGraph *G,int v1,int v2)/*在图G中删除边<v1,v2>*/{if(v1<0||v1>G->Vertices.size||v2<0||v2>G->Vertices.size){printf("参数v1或v2越界出错!\n");exit(1);}G->edge[v1][v2]=MaxWeight;G->numOfEdges--;}void DeleteVerten(AdjMGraph *G,int v)/*删除结点V*/{int n=ListLength(G->Vertices),i,j;DataType x;for(i=0;i<n;i++)/*计算删除后的边数*/for(j=0;j<n;j++)if((i==v||j==v)&&G->edge[i][j]>0&&G->edge[i][j]<MaxWeight) G->numOfEdges--;/*计算被删除边*/for(i=v;i<n;i++) /*删除第v行*/for(j=0;j<n;j++)G->edge[i][j]=G->edge[i+1][j];for(i=0;i<n;i++) /*删除第v列*/for(j=v;j<n;j++)G->edge[i][j]=G->edge[i][j+1];ListDelete(&G->Vertices,v,&x);/*删除结点v*/}int GetFirstVex(AdjMGraph G,int v)/*在图G中寻找序号为v的结点的第一个邻接结点*//*如果这样的邻接结点存在,返回该邻接结点的序号;否则,返回-1*/{int col;if(v<0||v>G.Vertices.size){printf("参数v越界出错\n");exit(1);}for(col=0;col<G.Vertices.size;col++)if(G.edge[v][col]>0&&G.edge[v][col]<MaxWeight)return col;return -1;}int GetNextVex(AdjMGraph G,int v1,int v2)/*在图G中寻找v1结点的邻接结点v2的下一个邻接结点*//*如果这样的邻接结点存在,返回该邻接结点的序号;否则,返回-1*//*v1和v2都是相应结点的序号*/{int col;if(v1<0||v1>G.Vertices.size||v2<0||v2>G.Vertices.size){printf("参数v1或v2越界出错!\n");exit(1);}for(col=v2+1;col<G.Vertices.size;col++)if(G.edge[v1][col]>0&&G.edge[v1][col]<MaxWeight) return col;return -1;}(3)/*AdjMGraphCreate.h图的创建函数所放的头文件*/typedef struct{int row;/*行下标*/int col;/*列下标*/int weight;/*权值*/}RowColWeight;/*边信息结构体定义*/void CreatGraph(AdjMGraph *G,DataType V[],int n,RowColWeight E[],int e) /*在图G中插入n个结点信息V和e条边信息E*/{int i,k;Initiate(G,n);/*结点顺序表初始化*/for(i=0;i<n;i++)InsertVertex(G,V[i]);/*结点插入*/for(k=0;k<e;k++)InsertEdge(G,E[k].row,E[k].col,E[k].weight);/*边插入*/}(4)/* Dijkstra.h狄克斯特拉函数设计所放的头文件*/void Dijkstra(AdjMGraph G,int v0,int distance[],int path[])/*带权图G从下标v0结点到其他结点的最短距离distance*//*和最短路径下标path*/{int n=G.Vertices.size;int *s=(int *)malloc(sizeof(int)*n);int minDis,i,j,u;/*初始化*/for(i=0;i<n;i++){distance[i]=G.edge[v0][i];s[i]=0;if(i!=v0&&distance[i]<MaxWeight) path[i]=v0;else path[i]=-1;}s[v0]=1;/*标记结点v0已从集合T加入到集合S中*//*在当前还未到最短路径的结点集中选取具有最短距离的结点u*/for(i=1;i<n;i++){minDis=MaxWeight;for(j=0;j<n;j++)if(s[j]==0&&distance[j]<minDis){u=j;minDis=distance[j];}/*当已不再存在最短路径时算法结束;此语句对非连通图是必须的*/if(minDis==MaxWeight)return;s[u]=1;/*标记结点u已从集合T加入到集合S中*//*修改从v0到其他结点的最短距离和最短路径*/for(j=0;j<n;j++)if(s[j]==0&&G.edge[u][j]<MaxWeight&&distance[u]+G.edge[u][j]<distance[j]) {/*结点v0经结点u到其他结点的最短距离和最短路径*/distance[j]=distance[u]+G.edge[u][j];path[j]=u;}}}(5)/*SchoolGuide.c文件*/#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef char DataType;#define MaxSize 100#define MaxVertices 10#define MaxWeight 10000#include"AdjMGraph.h"#include"AdjMGraphCreate.h"#include"Dijkstra.h"void SgPrint(AdjMGraph g,int n,int distance[],int path[],int j){ /*输出源点到其他各结点的最短距离和最短路径*/int i;/*从源结点到其他各结点的最短路径及其距离分别为:*/printf("从该结点%c到其他各结点的最短路径及其距离分别为:\n",g.Vertices.list[j]);printf("\n");//输出换行符for(i=0;i<n;i++){ /*从源结点到当前结点的最短路径为*/printf("从结点%c到结点%c的最短路径为:",g.Vertices.list[j],g.Vertices.list[i]);printf("(");//输出左括号if(path[i]!=-1)//源点到其他结点的最短路径的前一结点判断{ if(path[path[i]]!=-1)//该前一结点的前一结点进行判断{if(path[path[path[i]]]!=-1)//该前一结点的前一结点的前一结点进行判断{printf("%c,",g.Vertices.list[path[path[path[i]]]]);//输出相应存在的前一结点}printf("%c,",g.Vertices.list[path[path[i]]]);//输出应存在的前一结点}printf("%c,",g.Vertices.list[path[i]]);//输出应存在的前一结点}printf("%c",g.Vertices.list[i]);//输出当前结点printf(")");//输出换行符右括号printf(",其最短距离为%d;\n",distance[i]);//输出源点到其他结点的最短距离printf("\n");//输出换行符}}void Sgblueprint(){/*显示校园平面图*/printf(" ——————校园平面图——————\n");printf(" B(学生宿舍)———————————————————E(商业街)\n");printf(" / \\ / | \n");printf(" / \\ / | \n");printf(" / \\(B到D) /| \n");printf(" / \\ / | \n");printf(" / \\ / | \n");printf("A(校门口) ———————————————————D(学校食堂和 | \n");printf("| 学校田径场(学校田径场在学校食堂后面)) \\ | \n");printf("| \\(D到F)| \n");printf("| \\| \n");printf("C(第一、第二教学楼和校办) ———————————————————F(第三教学楼和实验楼)\n");}void main(void){AdjMGraph g;char a[]={'A','B','C','D','E','F'};RowColWeightrcw[]={{0,2,5},{0,3,30},{1,0,2},{1,4,8},{2,1,15},{2,5,7},{4,3,4},{5,3,10},{5,4,18}};int i,j,n=6,e=9;//i为控制控制菜单项的数值,j为选取源点的数值char ch;int distance[6],path[6];printf(" 校园导游咨询系统------您身边的导游 \n");printf("\n");printf("\n");printf("\n");/*菜单选项*/printf(" 1:请求校园导游帮组(即咨询校园各景点最短路径)\n");printf(" 2:显示校园平面图\n");printf(" 3:退出校园导游咨询系统\n");printf("请输入你所想进行的功能选项:\n");scanf("%d",&i); //输入控制控制菜单项的数值i的值CreatGraph(&g,a,n,rcw,e);//创建图switch(i){ //选择菜单项的操作case 1:system("cls");/*调用输出校园平面图函数并输出校园平面图*/Sgblueprint();/*提示用户输入起点的序列号*/printf("请输入你所在地或起点的序列号(A-F的序列号为依次0,1,2,3,4,5):\n");scanf("%d",&j);//用户输入起点的序列号i的值/*调用狄克斯特拉函数计算源点的其他各结点的最短路径及其距离*/Dijkstra(g,j,distance,path);/*提示用户参照校园平面图以了解各景点的代号的含义*/printf("提示:下列A、B、C等均是各景点的代号,如有问题,请参考上面的校园平面图\n");/*调用输出源点到其他各结点的最短距离和最短路径函数并输出相应的最短路径和最短距离*/SgPrint(g,n,distance,path,j);break;case 2:system("cls");Sgblueprint();//调用输出校园平面图函数并输出校园平面图break;case 3:exit(1);break;//退出程序}while(3)//判断程序是否继续运行{printf("\n您是否还想进行其他操作(y/n):\n");//提示用户是否还需继续进行其他操作scanf("%s",&ch);//用户输入y/n以选择是否仍需进行其他操作if(ch=='Y'||ch=='y')//判断用户所输入的ch值是否为y/Y,以判断用户是否进行其他操作{system("cls");printf(" 校园导游咨询系统------您身边的导游 \n");printf("\n");printf("\n");printf("\n");/*菜单选项*/printf(" 1:请求校园导游帮组(即咨询校园各景点最短路径)\n");printf(" 2:显示校园平面图\n");printf(" 3:退出校园导游咨询系统\n");printf("请输入你所想进行的功能选项:\n");scanf("%d",&i);switch(i){ //选择菜单项的操作case 1:system("cls");/*调用输出校园平面图函数并输出校园平面图*/Sgblueprint();/*提示用户输入起点的序列号*/printf("请输入你所在地或起点的序列号(A-F的序列号为依次0,1,2,3,4,5):\n");scanf("%d",&j);//用户输入起点的序列号i的值/*调用狄克斯特拉函数计算源点的其他各结点的最短路径及其距离*/Dijkstra(g,j,distance,path);/*提示用户参照校园平面图以了解各景点的代号的含义*/printf("提示:下列A、B、C等均是各景点的代号,如有问题,请参考上面的校园平面图\n");/*调用输出源点到其他各结点的最短距离和最短路径函数并输出相应的最短路径和最短距离*/SgPrint(g,n,distance,path,j);break;case 2:system("cls");Sgblueprint();//调用输出校园平面图函数并输出校园平面图break;case 3:exit(1);break;//退出程序}}else return;//退出程序}}4:调试分析:(1)a)测试数据:char a[]={'A','B','C','D','E','F'};RowColWeightrcw[]={{0,2,5},{0,3,30},{1,0,2},{1,4,8},{2,1,15},{2,5,7},{4,3,4},{5,3,10},{5,4,18}};int n=6,e=9;b)测试结果:(2)所遇到的问题:1)SgPrint函数中的形参如何设置,通过仔细分析图的操作等头文件和主函数,最终分析函数SgPrint中应加入形参AdjMGraph g,int n,int distance[],int path[],int j;2)Sgblueprint函数中输出语句中想输出’\’,直接键入’\’发现不能输出’\’,最终查看消息窗口的提示信息和联系C语言中有关转义字符的相关知识,知道了如果相输出转义字符’\’本身就必须书写成’\\这样的格式;3)在进行菜单项操作时,如何做到清除原有屏幕的操作,通过上网查资料了解到,只需加入“system(“cls”);”该语句即可;4)SgPrint函数中如何实现输出如“从结点A到结点B的最短路径为:(A,C,B),其最短距离为20;”格式,通过分析Dijkstra.h和主函数,最终想到只需添加“if(path[i]!=-1){ if(path[path[i]]!=-1){if(path[path[path[i]]]!=-1){printf("%c,",g.Vertices.list[path[path[path[i]]]]);}printf("%c,",g.Vertices.list[path[path[i]]]);}printf("%c,",g.Vertices.list[path[i]]);}”这些代码,对源点到其他结点的最短路径的前一结点以及该前一结点的前一结点进行判断,并将这些结点输出,就能够解决上述问题。

相关文档
最新文档