数据结构实验报告图与景区.docx
《数据结构实验报告图与景区.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告图与景区.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构实验报告图与景区
学生学号
实验课成绩
学生实验报告书
实验课程名称
数据结构与算法综合实验
开课学院
计算机科学与技术学院
指导教师姓名
学生姓名
学生专业班级
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.综合分析与结论
由于上一次的哈夫曼树没有写很好所以我回去以后有好好学习了一下数据结构,本次实验也比第一次有了经验了,通过与视频的学习我本次把实验全都做出来了。
但在实现的过程中对算法的理解还不够透彻,有待提高。
第三部分:
实验小结、收获与体会
通过本次试验,我进一步掌握了有关图的相关算法,也对数据结构在实际编程的应用中有了进一步的了解,也对深度优先搜索、迪杰斯特拉、普里姆算法有了进一步的了解。
同时,我也发现自己对于图的有关知识掌握的还远远不够,对于一些算法还不能熟练应用于编程中,所以,在以后的学习中,要多编程,以提高自己的动手编程能力。