数据结构实验报告图及景区.docx

上传人:b****2 文档编号:24189841 上传时间:2023-05-25 格式:DOCX 页数:14 大小:72.97KB
下载 相关 举报
数据结构实验报告图及景区.docx_第1页
第1页 / 共14页
数据结构实验报告图及景区.docx_第2页
第2页 / 共14页
数据结构实验报告图及景区.docx_第3页
第3页 / 共14页
数据结构实验报告图及景区.docx_第4页
第4页 / 共14页
数据结构实验报告图及景区.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数据结构实验报告图及景区.docx

《数据结构实验报告图及景区.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告图及景区.docx(14页珍藏版)》请在冰豆网上搜索。

数据结构实验报告图及景区.docx

数据结构实验报告图及景区

学生学号

实验课成绩

学生实验报告书

 

实验课程名称

数据构造与算法综合实验

开课学院

计算机科学与技术学院

指导教师XX

学生XX

学生专业班级

 

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.综合分析和结论

由于上一次的哈夫曼树没有写很好所以我回去以后有好好学习了一下数据构造,本次实验也比第一次有了经历了,通过和视频的学习我本次把实验全都做出来了。

但在实现的过程中对算法的理解还不够透彻,有待提高。

 

第三局部:

实验小结、收获与体会

通过本次试验,我进一步掌握了有关图的相关算法,也对数据构造在实际编程的应用中有了进一步的了解,也对深度优先搜索、迪杰斯特拉、普里姆算法有了进一步的了解。

同时,我也发现自己对于图的有关知识掌握的还远远不够,对于一些算法还不能熟练应用于编程中,所以,在以后的学习中,要多编程,以提高自己的动手编程能力。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1