数据结构实验报告图与景区.docx
- 文档编号:27986525
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:13
- 大小:44.28KB
数据结构实验报告图与景区.docx
《数据结构实验报告图与景区.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告图与景区.docx(13页珍藏版)》请在冰豆网上搜索。
数据结构实验报告图与景区
学生学号
实验课成绩
学生实验报告书
实验课程名称
数据结构与算法综合实验
开课学院
计算机科学与技术学院
指导教师姓名
学生姓名
学生专业班级
2017
2018
学年
第
2
学期
实验课程名称:
数据结构与算法综合实验
实验项目名称
图与景区信息管理系统实践
报告成绩
实验者
专业班级
组别
同组者
完成日期
2018年5月23日
第一部分:
实验分析与设计(可加页)
一、实验目得与要求
1.目得
掌握图得定义与图得存储结构。
掌握图得创建方法与图得应用
使用C++语言,定义图得数据结构,结合迭代开发思路实现“景区信息管理系统”。
掌握图得两种遍历方法与应用。
使用C++语言与深度优先算法实现“旅游景点导航”功能开发。
掌握迪杰斯特拉算法与应用。
使用C++语言与迪杰斯特拉算法实现“搜索最短路径”功能开发。
理解最小生成树得概念,掌握普里姆算法与应用。
使用C++语言与最小生成树算法实现“铺设电路规划”功能开发。
2、要求
开发景区信息管理系统,对景区得信息进行管理。
使用图得数据结构来保存景区景点信息,为用户提供创建图、查询景点信息、旅游景点导航、搜索最短路径、铺设电路规划等功能。
二、分析与设计
(1)创建工程读取文件信息,创建图,输出周边景点信息读取景区信息文件,采用图得存储结构,创建景区景点图,查询景点信息。
(2)迭代开发,进行深度优先搜索,实现旅游景点导航。
(3)继续迭代,采用迪杰斯特拉算法、普里姆算法,实现搜索最短路径与电路铺设,开发景区信息管理系统。
1.数据结构得设计
记录顶点信息得结构体
structVex
{
intnum;//景点编号
charname[20];//景点名字
chardesc[1024];//景点介绍
};
记录边得信息得结构体
structEdge
{
intvex1;//边得第一个顶点
intvex2;//边得第二个顶点
intweight;//权值
};
用来保存路径得链表得结构体
typedefstructPath
{
intvexs[20];//保存一条路径
Path*next;
}*PathList;
CGraph类用来实现相应功能得方法
classCGraph
{
private:
intm_aAdjMatrix[20][20];//邻接矩阵
Vexm_aVexs[20];//顶点信息数组
intm_nVexNum;//当前图得顶点个数
public:
voidInit(void);
boolInsertVex(VexsVex);
boolInsertEdge(EdgesEdge);
VexGetVex(intnVex);
intGetVexnum(void);
intFindEdge(intnVex,EdgeaEdge[]);
voidDFS(intnVex,boolaVisited[],int&nIndex,PathList&pList);
voidDFSTraverse(intnVex,PathList&pList);
intFindShortPath(intnVexStart,intnVexEnd,EdgeaPath[]);
voidFindMinTree(EdgeaPath[]);
};
2、核心算法设计
(1)输出周边景点信息
Input:
操作表号与景点编号
Output:
输入景点得周边景点信息
Process:
intCGraph:
:
FindEdge(intnVex,EdgeaEdge[])
{
intk=0;
for(inti=0;i { if(m_aAdjMatrix[nVex][i]! =0) { aEdge[k]、vex1=nVex; aEdge[k]、vex2=i; aEdge[k]、weight=m_aAdjMatrix[nVex][i]; k++; } } returnk;//返回边得条数 } (2)深度优先搜索算法实现旅游景点导航 Input: 操作表号与景点编号 Output: 从输入景点出发走遍整个景区得各种路线方案 Process: voidCGraph: : DFS(intnVex,boolaVisited[],int&nIndex,PathList&pList) { aVisited[nVex]=true;//改为已访问 pList>vexs[nIndex++]=nVex;//访问顶点 //判断就是否所有节点都已访问过 intnVexNum=0; for(inti=0;i { if(aVisited[i])nVexNum++; } //所有顶点都被访问过 if(nVexNum==m_nVexNum) { //新增链表节点,保存本次遍历得路径 pList>next=(PathList)malloc(sizeof(Path)); for(inti=0;i { pList>next>vexs[i]=pList>vexs[i]; } pList=pList>next; pList>next=NULL; } else { //按顶点得存储顺序,查找当前顶点相连得得顶点 for(inti=0;i { //既没有遍历过,又与当前顶点相连得顶点 if(! aVisited[i]&&(m_aAdjMatrix[nVex][i]>0)) { //以该顶点为起点遍历剩下得顶点 DFS(i,aVisited,nIndex,pList); aVisited[i]=false;//访问状态置空 nIndex;//回溯 } } } } voidCGraph: : DFSTraverse(intnVex,PathList&pList) { intnIndex=0; boolaVisited[MAX_VERTEX_NUM]={false}; DFS(nVex,aVisited,nIndex,pList); } (3)Dijkstra算法搜索最短路径 Input: 操作表号与起始景点编号 Output: 从起始顶点到终点得最短路径 Process: intCGraph: : FindShortPath(intnVexStart,intnVexEnd,EdgeaPath[]) { intnShortPath[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//保存最短路径 intnShortDistance[MAX_VERTEX_NUM];//保存最短距离 boolaVisited[MAX_VERTEX_NUM];//判断某顶点就是否已经加入到最短路径 //初始化 intv; for(v=0;v { aVisited[v]=false; if(m_aAdjMatrix[nVexStart][v]! =0) //初始化该顶点到其她顶点得最短距离,默认为两点间得距离 nShortDistance[v]=m_aAdjMatrix[nVexStart][v]; else //如果顶点i与nVexStart不相连,则最短距离设为最大值 nShortDistance[v]=0x7FFFFFFF; nShortPath[v][0]=nVexStart;//起始点为nVexStart for(intj=1;j { nShortPath[v][j]=1;//初始化最短路径 } } //初始化,nVexStart顶点加入到集合中 aVisited[nVexStart]=true; intmin; for(inti=1;i { min=0x7FFFFFFF; boolbAdd=false;//判断就是否还有顶点可以加入到集合中 for(intj=0;j { if(aVisited[j]==false) { if(nShortDistance[j] { v=j;//j顶点离nVexStart顶点最近 min=nShortDistance[j];//j到nVexStart得最短距离为min bAdd=true; } } }//如果没有顶点可以加入到集合,则跳出循环 if(bAdd==false) { break; } aVisited[v]=true;//将顶点j加入到集合 nShortPath[v][i]=v;//将顶点j保存到nVexStart到j得最短路径里 for(intw=0;w { //将w作为过度顶点计算nVexStart通过w到每个顶点得距离 if(aVisited[w]==false&&(min+m_aAdjMatrix[v][w] =0) { //更新当前最短路径及距离 nShortDistance[w]=min+m_aAdjMatrix[v][w]; for(inti=0;i { //如果通过w到达顶点i得距离比较短,则将w得最短路径复制给i nShortPath[w][i]=nShortPath[v][i]; } } } } intnIndex=0; intnVex1=nVexStart; //将最短路径保存为边得结构体数组 for(inti=1;i { if(nShortPath[nVexEnd][i]! =1) { aPath[nIndex]、vex1=nVex1; aPath[nIndex]、vex2=nShortPath[nVexEnd][i]; aPath[nIndex]、weight=m_aAdjMatrix[aPath[nIndex]、vex1][aPath[nIndex]、vex2]; nVex1=nShortPath[nVexEnd][i]; nIndex++; } } returnnIndex; } (4)普里姆算法构建最小生成树 Input: 输入操作编号 Output: 得到最小生成树得路径 Process: voidCGraph: : FindMinTree(EdgeaPath[]) { boolaVisited[MAX_VERTEX_NUM];//判断某顶点就是否在最小生成树顶点集合里 for(inti=0;i { aVisited[i]=false; } aVisited[0]=true;//0顶点加入到集合中 intmin; intnVex1,nVex2; for(intk=0;k { min=0x7FFFFFFF; for(inti=0;i { if(aVisited[i])//从集合中取一个顶点 { for(intj=0;j { if(! aVisited[j])//从不在集合得顶点中取出一个顶点 { if((m_aAdjMatrix[i][j] =0)) { nVex1=i; nVex2=j; min=m_aAdjMatrix[i][j];//找出最短得边 } } } } } //保存最短边得两个顶点 aPath[k]、vex1=nVex1; aPath[k]、vex2=nVex2; aPath[k]、weight=m_aAdjMatrix[nVex1][nVex2]; //将两个顶点加入到集合 aVisited[nVex1]=true; aVisited[nVex2]=true; } } 3、测试用例设计 使用实验所要求得图创建两个文本文件,对文件进行读取,观察其相关功能得实现。 三、主要仪器设备及耗材 1、安装了Windows10或其它版本得Windows操作系统得PC机1台 2、PC机系统上安装了MicrosoftVisualStudio2010开发环境 第二部分: 实验过程与结果(可加页) 一、实现说明 使用MircosoftVisualStudio2010开发工具,创建一个空得控制台工程。 利用图得存储结构来保存景区景点图,使用C++语言开发景区信息管理系统,工程名为GraphCPro。 (1)添加Graph、h文件,用来定义图得数据结构,实现图得相关操作。 (2)添加Tourism、h文件,用来实现景区信息管理系统得相关功能。 Tourism、h存放与Tourism、cpp相关函数得数据类型得定义,函数原型得声明等。 (3)添加Main、cpp文件,在文件中创建程序入口函数intmain(void)。 调用Tourism、h中得相关函数实现相应功能。 二、调试说明(调试手段、过程及结果分析) 调试得主要内容为编写程序得语法正确性与否,程序逻辑得正确性与否。 调试手段主要采用了MircosoftVisualStudio2010集成开发环境中得“开始执行(Ctrl+F5)”运行并测试,与F11“逐语句调试”、F12“逐过程调试”、F9“切换断点”、ctrl+B“新建断点”等。 三、软件测试(测试效果、界面、综合分析与结论) 1.测试效果界面 2.综合分析与结论 由于上一次得哈夫曼树没有写很好所以我回去以后有好好学习了一下数据结构,本次实验也比第一次有了经验了,通过与视频得学习我本次把实验全都做出来了。 但在实现得过程中对算法得理解还不够透彻,有待提高。 第三部分: 实验小结、收获与体会 通过本次试验,我进一步掌握了有关图得相关算法,也对数据结构在实际编程得应用中有了进一步得了解,也对深度优先搜索、迪杰斯特拉、普里姆算法有了进一步得了解。 同时,我也发现自己对于图得有关知识掌握得还远远不够,对于一些算法还不能熟练应用于编程中,所以,在以后得学习中,要多编程,以提高自己得动手编程能力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告 景区