数据结构课程设计-旅游景点咨询系统的设计与实现
数据结构课程设计-旅游景点咨询系统的设计与实现
旅游景点咨询系统的设计与实现一、需求分析1、问题描述创建一个至少有15个点的无向网表示的某个旅游景点的导游图。
顶点代表景点,类型为字符串(例如,泰山导游图:“天地广场门”,“十八盘”,“冯玉祥墓",“桃花峪门",“中天门”,“南天门”,“玉皇顶”等),弧表示两个景点之间可以直达,弧上的权值表示两个景点之间的路程(公里数),弧上还有到达方法的信息(有步行和索道两种)。
建立一个游客咨询系统。
2、基本要求a.创建图的存储结构。
b。
输入两个景点名,就可以得到从一个景点到达另一个景点的所有简单路径、相应路径的路程公里数、行走的方法(每一段是步行,还是坐索道).c.输入两个景点名,就可以得到其最短路径,即:路程最短的行进方法;如果两者无路径可通,就得出“两景点不可达的信息"。
二、概要设计1。
数据结构本程序需要用到两个结构体,分别为ArcCell和MGraph.2.程序模块本程序包含两个模块,一个是实现功能的函数的模块,另一个是主函数模块.系统子程序及功能设计本系统共有七个子程序,分别是:int LocateVex(MGraph G,VertexType u)//得到顶点u的序号void CreateDN(MGraph *G)//建立景点间的无向网VertexType*GetVex(MGraph G,int v)//根据顶点序号返回顶点值int FirstAdjVex(MGraph G,VertexType v)//返回v的第一个邻接顶点的序号int NextAdjVex(MGraph G,VertexType v,VertexType w)//返回v的(相对于w的)下一个邻接顶点的序号void Simpleway(MGraph&m,char *str,char *buf)//求任意两个景点之间的所有简单路径int Minway(MGraph&m,char *str,char *buf)//求两顶点间的最短路径3.各模块之间的调用关系以及算法设计函数CreateDN调用函数LocateVex函数Simpleway调用函数LocateVex函数Minway调用函数LocateVex,GetVex,FirstAdjVex,NextAdjVex 主函数调用函数CreateDN,Simpleway,Minway.三、详细设计1。
基于数据结构的校园导游咨询系统课程设计报告
重庆科技学院课程设计报告院(系):_电气与信息工程学院专业班级:计科普0902学生姓名:周杨学号: 2009441622设计地点(单位)____计算机基础自主学习中心I306___设计题目:_________校园导游咨询____________________ 完成日期: 2011 年 1 月 14 日指导教师评语: _______________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________ __________ _成绩(五级记分制):______ __________指导教师(签字):________ ________重庆科技学院课程设计任务书设计题目:校园导游咨询教研室主任:指导教师:向毅、陈刘奎、熊茜2010年 12 月 20日摘要现代快节奏的生活使得都市人越来越渴望亲近自然,因此外出旅游现在被越来越多的都市人所看中,所以如何快速方便的找到我们想要的旅游景点的信息和最短路径就成了一个很重要的问题。
本设计基于图的结构,创建一个无向图,针对游客的实际需求,将重庆科技学院的景点编号、名称、介绍等信息放入到图的顶点当中并保存在景点文本文件当中,将两个景点的编号和它们之间的距离当作权值也保存到权值文本文件当中,利用迪杰斯特拉算法来求从一个景点到另一个景点的最短距离,利用strcmp();函数来查找景点,并显示出它的信息,从而解决了要查找景点信息和景点之间的最短路径的问题,最后按照显示屏上的提示进行相关的操作。
数据结构课程设计实验报告《校园导游咨询系统》内含程序源代码 运行截图[方案]
数据结构课程设计实验报告《校园导游咨询系统》内含程序源代码运行截图[方案]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个。
数据结构课程设计报告-全国著名景点导游咨询01
数据结构课程设计报告-全国著名景点导游咨询01淮海工学院计算机工程学院课程设计报告设计名称:数据结构课程设计选题名称:全国著名景点导游咨询姓名: *** 学号: 201*******专业班级:软件工程软件1** 系(院):计算机工程学院设计时间: 201*.12.24~201*.1.4设计地点:软件工程实验室、教室9. 函数主要调用关系图四设计与调试分析1.进入测试界面,输入1即可查询旅游景点相关信息,再选择2北京,即显示出“中国首都,它荟萃了元、明、清以来的中华文化,是世界上拥有世界文化遗产最多的城市。
”2.输入2即可查询两景点间的最短路径,如输入1 3,即从哈尔滨到苏州,显示出哈尔滨到苏州的最短路径为2475公里。
3.输入3即可查询两景点间的最经济路径,如输入2 5,即从北京到广州,显示出从北京到广州的最经济路径为253元。
五用户手册运行环境:win XP/Vista/7, Microsoft Visual C++ 6.01. 用户进入全国著名景点导游咨询界面。
2. 用户输入1即可查询旅游景点相关信息。
3. 用户输入2即可查询两景点间的最短路径。
4. 用户输入3即可查询两景点间的最经济路径。
5. 用户输入4即可退出本界面。
六测试成果1.系统主菜单:2.查询各大城市的简介:3.查询两个景点间的最短路线:4.查询两景点间最经济的路线:5.退出系统七附录(源程序清单)#include<iostream.h>#include<string.h>#include<stdlib.h>#define MAXV 9#define MAXSIZE 20#define MAXLEN 500#define INF 32767//定义全局变量int costdistance[MAXV][MAXV]; int shortest[MAXV][MAXV];int costmoney[MAXV][MAXV]; int cheapest[MAXV][MAXV];int path[MAXV][MAXV]; typedef struct{int num;char name[MAXSIZE];char introduction[MAXLEN];int printpath[MAXLEN]; }VertexType;typedef struct UDN用心整理的精品word文档,下载即可编辑!!精心整理,用心做精品18。
c语言课程设计之旅游景点信息管理系统
c语言课程设计之旅游景点信息管理系统C语言课程设计是程序设计类专业的一门重要课程,它能够帮助我们深入了解计算机语言的基础知识和程序设计的基本原理,从而培养我们解决实际问题的能力和应用技巧。
在这个过程中,我们需要通过不断的实践来掌握C语言的语法和程序设计方法,例如,设计一个旅游景点信息管理系统,以此来展示我们对C语言知识的掌握和技能应用。
下面就来详细阐述实现这个系统的步骤。
一、项目设计思路旅游景点信息管理系统主要是为了方便用户查询和浏览景点信息的一个应用程序,其中包括景点的名称、地址、开放时间、门票价格等具体内容。
设计思路为:用户通过菜单选择功能,可以实现查询、添加、修改以及删除景点信息等操作。
通过文件读写实现数据的存储和读取。
二、程序设计流程1.界面设计界面设计是程序的“外观”,直接影响用户体验。
我们可以采用基于字符界面的设计方法,将菜单项、输入提示和数据展示等功能结构化放置于固定位置,以突出人机交互的用户友好性、操作统一性和易用性。
2.数据结构设计数据结构是程序的“内部”,直接影响程序执行效率和复杂度等因素。
我们可以采用链表存储景点数据,设定数据结构体,包含景点名称、地址、开放时间、门票价格等具体信息,方便进行相关操作。
3.功能模块设计对于这个系统,主要实现的功能模块包括:菜单界面、添加信息、查询信息、修改信息、删除信息、退出。
其中,通过switch-case语句来实现功能的选择。
通过do-while语句来保证用户一直在访问系统,直到选择退出操作。
4.数据文件处理数据文件处理是一个非常关键的过程,可以通过文件读写实现数据的存储和读取。
在实践中,我们可以采用fopen、fprintf、fscanf、fclose等文件读写函数来处理景点数据文件的存储和读取过程,保证数据的正确性和完整性。
5.代码实现和调试在进行代码实现前,需要先将流程、功能、结构都设计好。
通过调式工具来检测程序执行中的错误和异常情况,从而保证程序的正确性和规范性,并对程序进行优化。
数据结构实验报告-景点导游系统
南阳理工学院数据结构大作业实践报告课题名称:景点导游系统专业:班级:姓名:学号:完成日期:目录1.问题描述 (3)1.1 进度安排 (3)1.2 基本要求 (4)摘要 (5)2.问题分析 (5)2 . 1图的存储结构 (5)2.1.1图的邻接矩阵表示法 (6)2.1. 2 图的邻接矩阵(Adacency Matrix) (6)2 . 2求最短路径 (6)2.2.1单源最短路径问题 (6)2.3求最小生成树 (6)3.设计 (7)3 . 1系统流程 (7)3. 2系统相关抽象数据类型 (8)3.2. 1图的邻接矩阵存储结构形式说明 (8)3. 2. 2建立无向网络的算法 (8)3.3系统功能 (9)3.4主要函数说明 (9)4. 测试 (9)4.1 用户界面(包含路径图) (9)4.2 用户输入想去的地点 (10)4.3 人性化设置: (11)5.总结与心得体会 (12)6.主要算法 (13)6.1主要算法说明 (13)6.1. 1无向网的建立 (13)6.1. 2数组表示法 (13)6.1. 3Floyd算法 (14)参考文献: (14)附录:源代码 (15)1.问题描述景点(园林)导游系统设计一个景点的导游图,可以得到两个景点之间的所有简单路径、相应路径的路程公里数。
选择苏州的某个园林,创建一个至少有15个旅游景点的导游图。
顶点代表景点,边表示两个景点之间可以直达,权值表示两个景点之间的路程(公里数),还可以表示景点之间的到达方法(步行和乘车或船....)。
建立一个游客咨询系统。
基本功能:创建景点景区分布图;输出景区景点分布图:选择一个景点后,可以显示景点的相关信息;可以查询两个景点之间的所有简单路径;可以查询两个景点之间的最短路径:可以查询两个景点之间的行走方法:可以从公园大门进入,选一条最佳路线,可以不重复地游览各景点,最后回到出口(出口就在入口旁边)。
设计一实用的查询界面和功能菜单。
1.1 进度安排1.初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;2.完成最低要求:建立一个文件,包括5个景点情况,能完成遍历功能;3.进一步要求:进一步扩充景点数目,画出景点图,有兴趣的同学可以自己扩充系统功能。
校园导游咨询系统-中南大学数据结构课程设计
程序实现过程中的主要难点和解决方法
程序设计的主要难点就是在对结构体的设计和弗洛伊德算法的具体实 现上,通过查询数据结构的书及相关算法书,我了解到弗洛伊德算法主要运 用了动态规划的相关思想, 通过一个图的权值矩阵求出它的每两点间的最短 路径矩阵。 从图的带权邻接矩阵 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、查询两景点最短路径:用户在选择此功能模块后,按照屏幕上方提示的景点名称及其对应的编号,要求用户输入起点和终点的编号,系统将在已存储的景点中进行匹配,若未找到所需查询的景点编号,系统将提示错误并要求用户再次输入。
数据结构课程设计报告(城市导游咨询)
目录第一部分引言 (2)第二部分课程设计报告 (2)第一章课程设计目的 (2)第二章课程设计内容和要求 (2)问题描述 (2)设计要求 (2)第三章课程设计总体方案及分析 (3)问题分析 (3)概要设计 (3)详细设计 (4)调试分析 (8)测试结果 (9)参考文献 (11)第三部分课程设计总结 (11)附录(源代码) (12)第一部分引言数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁。
该课程的先行课程是计算机基础、程序设计语言、离散数学等,后续课程有操作系统、编译原理、数据库原理、软件工程等。
通过本门课程的学习,我们应该能透彻地理解各种数据对象的特点,学会数据的组织方法和实现方法,并进一步培养良好的程序设计能力和解决实际问题的能力,而且该课程的研究方法对我们学生在校和离校后的学习和工作,也有着重要的意义。
数据结构是电子信息科学与技术专业的一门核心专业基础课程,在该专业的课程体系中起着承上启下的作用,学好数据结构对于提高理论认知水平和实践能力有着极为重要的作用。
学习数据结构的最终目的是为了获得求解问题的能力。
对于现实世界中的问题,应该能从中抽象出一个适当的数学模型,该数学模型在计算机内部用相应的数据结构来表示,然后设计一个解此数学模型的算法,再进行编程调试,最后获得问题的解答。
因此,我们在课程设计下了一定的功夫,希望通过自己的动手加深对数据结构的了解,掌握一些经典数据结构类型,同时,在这次设计当中,我也学会了许多在课堂中接触较少的内容,查阅了不少的课外资料,总之,在这次设计当中使我学到了不少,不仅在数据结构方面,在编程的了解上也更进了一步。
第二部分课程设计报告第一章课程设计目的利用对图的认识和最短路径的了解设计一个简单的导游咨询系统,为来访的人提供各种信息查询服务,同时加深对图的了解及对求最短路径的经典算法的掌握。
第二章课程设计内容和要求问题描述设计一个城市导游程序,为来访的客人提供各种信息查询服务。
校园导游咨询系统数据结构课程设计c语言
校园导游咨询系统数据结构课程设计c语言校园导游咨询系统数据结构课程设计c语言一、课程设计的目的本次课程设计旨在通过C语言程序设计实现校园导游咨询系统,学生能够了解并掌握数据结构的基本概念、算法和编程技术,培养学生的编程能力和解决实际问题的能力。
二、系统需求分析(1)用户管理系统需要实现学生、教师、管理员三种用户的管理,分别具有不同的权限等级。
要实现用户注册、登录、退出等基本功能。
(2)地图导航系统需要实现校内地图的导航功能,包括校门、教学楼、图书馆、宿舍等位置的标注,提供校园内部的导航和查找服务。
(3)建筑信息系统需要提供校内建筑的信息查询功能,包括建筑名称、位置、使用情况等,方便师生查询。
(4)在线咨询系统需要提供在线咨询功能,方便学生、教师等用户在线咨询学校相关事宜,并实现客服人员的消息处理。
三、数据结构设计(1)用户信息表采用哈希表作为用户信息表的数据结构,将用户信息存储在表中,方便用户登录和信息的管理。
哈希表的键值是用户名,值是用户信息(包括用户名、密码、权限等级等)。
(2)建筑信息采用结构体数组作为建筑信息的数据结构,将建筑信息存储在数组中,方便查询和展示。
结构体包含建筑名称、位置、使用情况等信息。
(3)校内地图为方便地图导航,采用邻接矩阵作为校内地图的数据结构,将校内各个建筑之间的距离存储在矩阵中。
矩阵的行和列分别表示建筑的编号,矩阵元素表示建筑之间的距离。
(4)消息队列为实现在线咨询功能,采用队列作为消息队列的数据结构,将用户发送的消息存储在队列中。
消息队列的队首指针和队尾指针分别表示最早和最晚的消息,方便客服人员的处理。
四、代码实现(1)用户管理用户管理实现了注册、登录和退出等功能。
用户密码使用MD5加密,保证用户信息的安全性。
管理员可以添加、删除学生和教师用户。
(2)地图导航地图导航实现了最短路径算法和深度优先搜索算法,方便用户查询和展示校内地图。
用户可以查找建筑的详细信息,包括位置、使用情况等。
数据结构课程设计——校园导游咨询系统
数据结构课程设计——校园导游咨询系统在当今数字化的时代,信息的高效获取和处理变得至关重要。
对于一个大型校园来说,拥有一个便捷的导游咨询系统能够极大地提升访客和新生的体验。
本次数据结构课程设计的目标就是创建一个实用的校园导游咨询系统。
一、系统需求分析首先,我们需要明确这个校园导游咨询系统的主要功能和用户需求。
对于访客和新生来说,他们可能希望了解校园内各个景点的位置、简介,以及如何从当前位置到达目标景点的最优路径。
系统应该能够提供清晰准确的地图信息、景点介绍和导航指引。
从学校管理的角度出发,系统需要易于更新和维护,能够及时添加新的景点或者修改已有景点的信息。
同时,为了保证系统的稳定性和安全性,需要有一定的权限管理机制,防止未经授权的修改和访问。
二、数据结构选择为了实现上述功能,我们需要选择合适的数据结构来存储和管理校园的相关信息。
对于校园地图的表示,可以使用图(Graph)这种数据结构。
将校园中的各个景点看作图中的节点,景点之间的道路看作边,边的权重可以表示道路的长度或者行走所需的时间。
为了存储景点的详细信息,如名称、简介等,可以使用结构体或者类。
每个景点的结构体或类成员包含景点的标识符、名称、简介等属性。
对于路径搜索和导航,我们可以选择迪杰斯特拉(Dijkstra)算法或者 A算法来计算最短路径。
三、系统功能模块设计1、地图显示模块能够以直观的方式展示校园的地图,包括各个景点的位置和连接关系。
支持缩放、平移等操作,方便用户查看不同区域的细节。
2、景点信息查询模块用户可以输入景点名称或关键词,系统能够快速检索并显示相应景点的详细信息。
3、路径规划模块根据用户输入的起始景点和目标景点,计算并显示最优的行走路径。
能够提供多种路径选择,如最短路径、最少转弯路径等。
4、周边设施查询模块用户可以查询某个景点周边的餐厅、商店、卫生间等设施的位置。
5、用户管理模块只有授权的管理员能够对校园景点信息和地图进行修改和更新。
数据结构旅游区导航图课程设计
《数据结构课程设计》报告题目旅游区导游图专业计算机科学与技术班级(2)班学生###13 旅游区导游图题目内容问题描述:设某个旅游区共有n个旅游景点(n≥10),每个旅游景点都和相邻的m个旅游景点(m≥2,m<n)有直接的道路(有对应的距离)相通,请设计一个简易的旅游区导游系统。
以(V i,V j,d)的形式从键盘输入建立该旅游区的旅游景点图,其中:V i和V j 表示两个不同的旅游景点,d表示这两个景点之间的道路距离;该旅游景点图采用邻接矩阵存储结构(数组)。
实现要求:⑴旅游景点图的输出:分别以邻接矩阵、邻接链表的方式输出该旅游景点图。
⑵相邻景点查询:假设对于每个景点,设置有简易的信息查询,要求能给出与该景点相邻的所有景点(有直接的道路相通)及对应的距离。
⑶景点路线查询:假设对于每个景点,设置有景点路线查询,要求能给出从该景点出发到任一其它景点的最短简单路径及距离。
⑷景点路线综合查询:对于该旅游区的任意两个景点,找出它们之间的最短简单路径及距离。
⑸最佳旅游路线确定:假设该旅游区的入口也是出口,请确定一条最佳的旅游线路,该线路必须经过所有的旅游景点(有些景点可以重复经过)且走的路最短。
⑹设计一个菜单,上述操作要求都作为菜单中的主要菜单项。
⒈本人完成的工作完成的工作:首先是用邻接矩阵的存储形式建立无向带权图,然后将邻接矩阵转换为邻接链表,最后用狄克斯特拉函数求出后面的三道有关最短路径的小题,设计主函数。
⒉所采用的数据结构邻接矩阵的数据结构,包括(弧/边的结构定义、图的结构定义)邻接链表的数据结构,包括(弧/边的结点定义、邻接表头结点定义、图的结构定义)数据结构的定义//邻接矩阵结构体typedef struct{ char vex1, vex2 ; /* 弧或边所依附的两个顶点 */int ArcVal ; /* 弧或边的权值 */}ArcType ; /* 弧或边的结构定义 */typedef struct{int vexnum, arcnum ; /* 图的当前顶点数和弧数 */char vexs[MAXVEX] ; /* 顶点向量 */int adj[MAXVEX][MAXVEX];}MGraph ; /* 图的结构定义 *///邻接链表结构体typedef struct ANode //弧的结点结构类型{ int adjvex; //该弧的终点位置int info; //该弧的相关信息,这里用于存放权值struct ANode *nextarc; //指向下一条弧的指针} ArcNode;typedef struct Vnode //邻接表头结点的类型{char data; //顶点信息ArcNode *firstarc; //指向第一条弧} VNode;typedef struct{VNode AdjList[MAXVEX];int vexnum,arcnum; //图中顶点数n和边数e} ALGraph; //图的邻接表类型⒊所设计的函数对于每个主要函数必须给出所采用的算法思想和程序框图;邻接矩阵和邻接链表初始化函数MGraph *Init_MGraph()/* 图的初始化 */{MGraph *G;G=(MGraph *)malloc(sizeof(MGraph)) ;G->vexnum=0 ; G->arcnum=0 ; /* 初始化顶点数、边数 */ return(G) ;}ALGraph *Init_ALGraph()/* 图的初始化 */{ALGraph *G;G=(ALGraph *)malloc(sizeof(ALGraph)) ;G->vexnum=0 ;G->arcnum=0; /* 初始化顶点数 */return(G) ;}图中顶点定位的函数,判断顶点是否重复输入了int LocateVex(MGraph *G, char vp)/* 图中顶点的定位,若图中有顶点vp,返回其在顶点数组的下标值 */ {int k ;for (k=0; k<=G->vexnum; k++)if (G->vexs[k]==vp) return(k) ;}{int k, j ;if (G->vexnum>=MAXVEX)printf("图中顶点数已达到最多 !\n");else{if (LocateVex(G, vp)==-1){k=G->vexnum ; G->vexs[G->vexnum++]=vp ;for (j=0 ; j<G->vexnum ; j++){G->adj[j][k]=INFINITY ;G->adj[k][j]=INFINITY ;/* 是带权的有向图或无向图 */}}}往图的邻接矩阵中添加边(弧)void AddArc(MGraph *G , ArcType *arc)/* 往图的邻接矩阵中添加边(弧) */{int k=0, j=0;k=LocateVex(G, arc->vex1) ;j=LocateVex(G, arc->vex2) ;if (k==-1||j==-1)printf("边或弧的顶点不存在,错误 !\n") ;else{G->arcnum++ ;G->adj[k][j]=arc->ArcVal ;G->adj[j][k]=arc->ArcVal ;/* 是无向图或带权的无向图,需对称赋值 */}输出图的顶点矩阵和邻接矩阵void output_graphic(MGraph *G)/* 输出图的顶点矩阵和邻接矩阵 */ {int k, j ;printf("图的顶点如下:\n") ;for (k=0; k<G->vexnum; k++)printf("%4c",G->vexs[k]) ;printf("\n\n") ;printf("图的邻接矩阵如下:\n") ; for (k=0; k<G->vexnum; k++){for (j=0; j<G->vexnum; j++)}}Y以邻接矩阵作为图的存储结构建立图MGraph *create_graph()/* 以邻接矩阵作为图的存储结构建立图 */{char inchar[100], enchar[100],fvex,lvex ;int count=0;int weight ;MGraph *G;ArcType *arc ;printf("首先进行图的初始化!!\n\n") ;G=(MGraph *)malloc(sizeof(MGraph)) ;G=Init_MGraph() ;arc=(ArcType *)malloc(sizeof(ArcType)) ;printf("\n请以(顶点,顶点,权值)的形式输入图的边(或弧),第一个顶点是?表示结束:\n") ;while(1){scanf("%s",inchar) ;fvex=inchar[0] ; /* 输入第一个顶点,?结束 */if (fvex=='?') break ;else{AddVertex(G, fvex) ;scanf("%s",enchar) ;lvex=enchar[0] ;AddVertex(G, lvex) ;scanf("%d",&weight) ; /* 输入第二个顶点和权值 */arc->vex1=fvex ; arc->vex2=lvex ;arc->ArcVal=weight ; AddArc(G, arc) ;printf("\n请继续输入下一条边(或弧)!!\n") ;}}return(G) ;}将邻接矩阵g转换成邻接表GALGraph *MGraphToALGraph(MGraph *g,ALGraph *G){int i,j,n=g->vexnum; //n为顶点数ArcNode *p;G=(ALGraph *)malloc(sizeof(ALGraph));G->arcnum = g->arcnum;G->vexnum = g->vexnum;for(i=0;i<G->vexnum;i++)G->AdjList[i].firstarc = NULL;for (i=0;i<n;i++) //检查邻接矩阵中每个元素{for (j=n-1;j>=0;j--)if (g->adj[i][j]!=INFINITY) //邻接矩阵的当前元素不为{p=(ArcNode *)malloc(sizeof(ArcNode)); //创建一个结点*pG->AdjList[j].data=g->vexs[j];p->adjvex = g->vexs[j];p->info=g->adj[i][j];p->nextarc=G->AdjList[i].firstarc; //将*p链到链表后G->AdjList[i].firstarc=p;}}return G;}邻接链表的输出void output_graphic_c(MGraph *g,ALGraph *G) {int i;ArcNode *p;for (i=0;i<g->vexnum;i++){printf("%c",G->AdjList[i].data) ;p=G->AdjList[i].firstarc;while(p!=NULL){printf("%s","->") ;printf("(%c,%d)",p->adjvex,p->info) ;p=p->nextarc ;}printf("\n\n");}}相邻景点查询并输出void output_Find_ALGraph(ALGraph *G){ /* 相邻景点查询并输出 */int j;ArcNode *p;printf("请输入你要查询的景点(下标值):\n");scanf("%d",&j);p=G->AdjList[j].firstarc;while(p){printf("景点%c到景点%c的距离是%d (该两个景点之间有直接的道路相通)\n",G->AdjList[j].data,p->adjvex,p->info);p=p->nextarc;}}景点路线查询:假设对于每个景点,设置有景点路线查询,要求能给出从该景点出发到任一其它景点的最短简单路径及距离。
数据结构课程设计——校园导游咨询系统
数据结构课程设计——校园导游咨询系统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。
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.主程序模块:连接各种功能子模块,使用循环等待用户操作,完成程序的基本操作实现功能。
景点导游数据结构实验报告
景点导游数据结构实验报告景点导游数据结构实验报告⒈实验目的本次实验的目的是设计并实现一个景点导游系统,通过合理的数据结构和算法来提供给用户导游的功能。
⒉实验背景景点导游系统是一种提供导游服务的软件系统,通过该系统,用户可以浏览、查询和导航到各个景点,同时还可以获取有关景点的详细信息。
⒊实验流程⑴数据需求分析在这一部分,我们需要确定系统所需的数据结构和算法。
a) 景点数据:每个景点需要包含名称、介绍、图片等信息。
可以使用一个景点类来表示每个景点,并使用一个链表或数组来存储所有的景点。
b) 用户数据:我们可以使用一个用户类来表示每个用户,并使用一个链表或数组来存储所有的用户。
c) 导游功能:可以使用图的数据结构来表示不同景点之间的关系。
通过深度优先搜索或广度优先搜索算法,我们可以提供从一个景点到另一个景点的导航功能。
⑵系统设计与实现在这一部分,我们需要根据上一步的分析结果,进行系统的设计和实现。
a) 景点类的设计:定义景点类,并在类中实现必要的函数,如获取景点信息等。
b) 用户类的设计:定义用户类,并在类中实现必要的函数,如获取用户信息、导航功能等。
c) 地图类的设计:定义地图类,使用图的数据结构来表示各个景点之间的关系,并实现导航功能。
⑶系统测试与优化在这一部分,我们需要对系统进行测试,并根据测试结果对系统进行优化。
a) 功能测试:针对不同的用户和景点进行测试,检查导游功能是否正常运行。
b) 性能优化:对系统的性能进行评估,并采取一些优化措施,如优化数据结构和算法的实现,提高系统的响应速度。
⒋实验结果分析在这一部分,我们需要对实验结果进行分析,并进行总结。
通过我们的实验,我们成功设计并实现了一个景点导游系统,用户可以通过该系统来浏览、查询和导航到各个景点,并获取有关景点的详细信息。
系统的导游功能经过测试,能够正常运行并满足用户需求。
⒌实验总结与展望在这一部分,我们对整个实验进行总结,并对未来的工作进行展望。
C语言旅游管理系统课程设计
C语言旅游管理系统课程设计一、教学目标本课程的目标是让学生掌握C语言的基本语法,具备运用C语言进行程序设计的能力,通过实现一个旅游管理系统,培养学生解决实际问题的能力。
具体目标如下:1.知识目标:•掌握C语言的基本语法和数据结构。
•理解旅游管理系统的业务流程。
2.技能目标:•能够使用C语言编写简单的程序。
•能够运用C语言实现旅游管理系统的各个功能模块。
3.情感态度价值观目标:•培养学生的团队合作意识和解决问题的能力。
•培养学生对计算机科学的兴趣和热情。
二、教学内容本课程的教学内容主要包括C语言的基本语法、数据结构以及旅游管理系统的实现。
具体安排如下:1.C语言的基本语法:包括变量、数据类型、运算符、控制结构等。
2.数据结构:包括数组、链表、栈、队列等。
3.旅游管理系统的实现:包括用户登录、景点管理、酒店管理、订单管理等功能模块。
三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用多种教学方法,包括讲授法、讨论法、案例分析法、实验法等。
1.讲授法:用于讲解C语言的基本语法和数据结构。
2.讨论法:用于讨论旅游管理系统的实现方案。
3.案例分析法:通过分析实际案例,让学生更好地理解旅游管理系统的实现。
4.实验法:让学生动手编写程序,实现旅游管理系统的各个功能模块。
四、教学资源为了支持教学内容和教学方法的实施,本课程将准备以下教学资源:1.教材:《C语言程序设计》。
2.参考书:《C语言编程实践》、《数据结构与算法》。
3.多媒体资料:包括教学PPT、视频教程等。
4.实验设备:计算机、网络等。
五、教学评估为了全面、客观地评估学生的学习成果,本课程将采取以下评估方式:1.平时表现:包括课堂参与度、小组讨论、提问等,占总评的30%。
2.作业:包括编程练习、实验报告等,占总评的40%。
3.考试:包括期中和期末考试,占总评的30%。
六、教学安排本课程的教学安排如下:1.教学进度:按照教材的章节顺序进行教学,确保每个章节都有足够的教学时间。
数据结构课程设计报告 (附有完整可运行出来的代码)
课程设计报告设计题目:公园导游图一、流程图二、程序代码#include<iostream>using namespace std;#include<stdio.h>typedef struct //定义图结构{int n; /* 图的顶点个数*/char v[100]; /* 顶点信息*/int e[100][100]; /* 边信息*/int shor; /* 最短路径信息*/}park;park *luru(park *x){int j,k;cout<<"请输入公园景点个数"<<endl;cin>>x->n;if(x->n<=0){cout<<"个数输入错误,请重新输入"<<endl;cin>>x->n;}cout<<"请输入景点名称,每个名称只允许一个字符代替"<<endl;for(j=0;j<x->n;j++)cin>>x->v[j];cout<<"请输入景点之间的路径长度,只允许整数型数值,无路径长度的输入0"<<endl;for(j=0;j<x->n;j++)for(k=0;k<x->n;k++){cout<<"请输入第"<<j+1<<"行"<<"第"<<k+1<<"列的路径长度"<<endl;cin>>x->e[j][k];}return x;}int search(park *x){char start,end,temp;int i=0,j=0,temp_1,temp1=10000;cout<<"请输入要查找的起始景点名称"<<endl;cin>>start;while(i<x->n && start!=x->v[i])i++;if(i==x->n){cout<<"没有找到该景点,按任意键返回"<<endl;return 0;}}cout<<"请输入要查找的终点景点名称"<<endl;cin>>end;while(j<x->n && end!=x->v[j]){j++;if(j==x->n){cout<<"没有找到该景点,按任意键返回"<<endl;return 0;}}x->shor=x->e[i][j];temp_1=x->e[i][j];for (int k=0;k<x->n;k++)//两个顶点最小权值判断{if (x->e[i][k]==0||x->e[k][j]==0 )continue;if(x->shor > x->e[i][k] + x->e[k][j]){x->shor = x->e[i][k] + x->e[k][j];temp=x->v[k];}}if(x->shor==0){cout<<"这两个节点中没有连通路,按任意键返回"<<endl;return 0;}if(x->shor==temp_1){cout<<"最短路径信息: "<<start<<"->"<<end<<endl<<"最小路径长度:"<<x->shor<<endl;x->shor=10000;getchar();return 1;if(x->shor<temp_1 && x->shor<=temp1){cout<<"最短路径信息: "<<start<<"->"<<temp<<"->"<<end<<endl<<"最小路径长度:"<<x->shor<<endl;x->shor=10000;getchar();return 1;}cout<<"查找失败,按任意键返回"<<endl;getchar();return 0;}int main(){park x;int i=1;luru(&x);do{search(&x);cout<<"是否继续?"<<endl<<"1.继续"<<endl<<"0.退出"<<endl;cin>>i;}while(i!=0);return 0;}三、运行结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
旅游景点咨询系统的设计与实现一、需求分析1、问题描述创建一个至少有15个点的无向网表示的某个旅游景点的导游图。
顶点代表景点,类型为字符串(例如,泰山导游图:“天地广场门”,“十八盘”,“冯玉祥墓”,“桃花峪门”,“中天门”,“南天门”,“玉皇顶”等),弧表示两个景点之间可以直达,弧上的权值表示两个景点之间的路程(公里数),弧上还有到达方法的信息(有步行和索道两种)。
建立一个游客咨询系统。
2、基本要求a.创建图的存储结构。
b.输入两个景点名,就可以得到从一个景点到达另一个景点的所有简单路径、相应路径的路程公里数、行走的方法(每一段是步行,还是坐索道)。
c.输入两个景点名,就可以得到其最短路径,即:路程最短的行进方法;如果两者无路径可通,就得出“两景点不可达的信息”。
二、概要设计1.数据结构本程序需要用到两个结构体,分别为ArcCell和MGraph。
2.程序模块本程序包含两个模块,一个是实现功能的函数的模块,另一个是主函数模块。
系统子程序及功能设计本系统共有七个子程序,分别是:int LocateVex(MGraph G,VertexType u)//得到顶点u的序号void CreateDN(MGraph *G)//建立景点间的无向网VertexType* GetVex(MGraph G,int v)//根据顶点序号返回顶点值int FirstAdjVex(MGraph G,VertexType v)//返回v的第一个邻接顶点的序号int NextAdjVex(MGraph G,VertexType v,VertexType w)//返回v的(相对于w的)下一个邻接顶点的序号void Simpleway(MGraph& m,char *str,char *buf)//求任意两个景点之间的所有简单路径int Minway(MGraph& m,char *str,char *buf)//求两顶点间的最短路径3.各模块之间的调用关系以及算法设计函数CreateDN调用函数LocateVex函数Simpleway调用函数LocateVex函数Minway调用函数LocateVex,GetVex,FirstAdjVex,NextAdjVex 主函数调用函数CreateDN,Simpleway,Minway。
三、详细设计1.数据类型定义typedef struct{VRType adj;int info;}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct{VertexType vexs[MAX_VERTEX_NUM];AdjMatrix arcs;int vexnum,arcnum;}MGraph;2.系统主要子程序详细设计a.void CreateDN(MGraph *G){ /* 采用数组(邻接矩阵)表示法,构造有向网G */int i,j,k,w,c;char s[MAX_INFO],*info;VertexType va,vb;printf("请输入景点个数以及景点间所有路径的个数(以空格隔开)");scanf("%d %d",&(*G).vexnum,&(*G).arcnum);printf("请输入%d个景点:\n",(*G).vexnum);for(i=0;i<(*G).vexnum;++i) /* 构造顶点向量*/scanf("%s",(*G).vexs[i]);for(i=0;i<(*G).vexnum;++i) /* 初始化邻接矩阵*/for(j=0;j<(*G).vexnum;++j){(*G).arcs[i][j].adj=INFINITY; /* 网*/(*G).arcs[i][j].info=NULL;}printf("请输入%d条景点间的路径,路径间的路程权值以及路径间到达方式(以0或1来表示到达方式,步行:0,索道:1,如:光明顶迎客松30 1): \n",(*G).arcnum);for(k=0;k<(*G).arcnum;++k){scanf("%s%s%d%d*c",va,vb,&w,&c);/* %*c吃掉回车符*/i=LocateVex(*G,va);j=LocateVex(*G,vb);(*G).arcs[i][j].adj=(*G).arcs[j][i].adj=w; /* 有向网*/(*G).arcs[i][j].info=(*G).arcs[j][i].info=c; /* 有向*/}}b.void Simpleway(MGraph& m,char *str,char *buf)/*求任意两个景点之间的所有简单路径*/{for(int i=0;i<m.vexnum;i++){visited[i]=false;}int x=LocateVex(m,str);int y=LocateVex(m,buf);/*从x出发到y*/stack<int>s;s.push(x);visited[x]=true;int i=0;int z=0;//表示没有找到这两个点之间有路径while(!s.empty()){int flag=0;//取栈顶元素int t=s.top();for(;i<m.vexnum;i++){if(m.arcs[t][i].adj != INFINITY && visited[i]==false){s.push(i);flag=1;visited[i]=true;/*找到简单路径*/if(s.top()==y)//到达终点{z=1;//找到这样的路径cout<<"一条简单路径为:"<<endl;{stack<int>s2;//建立一个临时的栈//创建一个数组存放路径下标int *way=new int[s.size()];int count=0;while(!s.empty()){s2.push(s.top());s.pop();}//还原s同时输出路径while(!s2.empty()){cout<<m.vexs[s2.top()]<<" ";way[count++]=s2.top();s.push(s2.top());s2.pop();}//计算路径长度,给出到达的方式{int num=0;cout<<" 到达方式:";for(int k=0;k<s.size()-1;k++){int x1=LocateVex(m,m.vexs[way[k]]);int y1=LocateVex(m,m.vexs[way[k+1]]);num+=m.arcs[x1][y1].adj;if(m.arcs[x1][y1].info==0)cout<<"步行"<<" ";elsecout<<"索道"<<" ";}cout<<"路程:"<<num<<endl;}}cout<<endl;{//出栈int p=s.top();visited[p]=false;s.pop();//从p开始接着访问后面的邻接点i=p+1;break;}}//跳出本次循环i=0;break;}}if(flag==0){//出栈int p=s.top();visited[p]=false;s.pop();//从p开始接着访问后面的邻接点i=p+1;}}if(z==0){cout<<"两景点不可达"<<endl;}}c.int Minway(MGraph& m,char *str,char *buf)//求两顶点间的最短路径{int x=LocateVex(m,str);int y=LocateVex(m,buf);//分配路径相关信息的存储空间int **road=new int*[m.vexnum];for(int i=0;i<m.vexnum;i++){road[i]=new int[m.vexnum];}//初始化for(int i=0;i<m.vexnum;i++){for(int j=0;j<m.vexnum;j++){if(j==0){road[i][j]=x;}else{road[i][j]=-1;}}}for(int i=0;i<m.vexnum;i++){//while(find_s[x]==true)find_s[i]=false;length[i]=m.arcs[x][i].adj;if(m.arcs[x][i].adj!=INFINITY){road[i][1]=i;}}find_s[x]=true;length[x]=0;rigth_length[x]=0;for(int j=1;j<m.vexnum;j++){int pose=find_min_length(m,length);{int z=0;//记录找到它的路径while(road[pose][z]!=-1&&z<=m.vexnum){z++;}}//cout<<"min_length="<<length[pose]<<endl;rigth_length[pose]=length[pose];//将路径最短的关联的另一个顶点加入已找到路径的数组中find_s[pose]=true;//更新最短路径for(int i=0;i<m.vexnum;i++){//i点还没有找到最短路径if(find_s[i]==false && m.arcs[pose][i].adj + length[pose] < length[i]) {length[i]=m.arcs[pose][i].adj + length[pose];{//记录中间节点int z=0;//记录找到它的路径while(road[pose][z]!=-1){z++;}/*移位再插入,用pose更新*///(1)复制for(int k=0;k<z;k++){road[i][k]=road[pose][k];}road[i][z]=i;}}}}cout<<endl;if(road[y][1]==-1){cout<<"两景点不可达"<<endl;return -1;}else{cout<<"最短路径为:";int count=0;while(road[y][count]!=-1 && count<m.vexnum){cout<<m.vexs[road[y][count]]<<" ";count++;}cout<<" 到达方式:";for(int i=0;i<count-1;i++){int x1=LocateVex(m,m.vexs[road[y][i]]);int y1=LocateVex(m,m.vexs[road[y][i+1]]);if(m.arcs[x1][y1].info==0)cout<<"步行"<<" ";elsecout<<"索道"<<" ";}cout<<endl;return rigth_length[y];}}四、测试与分析1.建立旅游景点咨询系统,根据提示依次输入景点,路径,以及到达方式。