数据结构实践课程报告

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

算法设计实践课程报告
学院:计算机学院
班级:
学号:
姓名:
一、课程目的
本课程设计为培养学生综合实践的能力,理论知识和实际有机的结合起来,锻炼学生实际分析问题和解决问题的能力,提高学生适应实际、实践编程的能力,使对C++系统编程有一个深入的了解。

二、题目
3. 校园导游程序——最短路径应用
问题描述:
用无向网表示你所在学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。

要求能够回答有关景点介绍、游览路径等问题。

基本要求:
实现一简单的功能查询界面:
(1)查询各景点的相关信息;
(2)选定某一景点作为起始点,可查询从该景点出发到其余各景点的最佳游览路径。

三、算法分析与设计
首先,此算法建立了类mgraph,通过邻接矩阵存储校园景点图,并通过构造函数初始化图,手动给校园图附上相关信息(包括景点编号、名称、简介、路径及路径长度等)。

然后,手动绘制了部分模拟校园图。

该函数包括深度优先遍历图和迪杰斯特拉最短路径算法,主
要功能是实现校园七个景点(0.图书馆,1.三山楼,2.三江楼,3.教工浴室,4.西山操场,5.西山美食城,6.京江操场)的简介和最短路径的算法,最后用主函数输出结果,用switch语句分别输出,最后求出两点之间的最短路径。

四、运行结果及分析
输出结果:
五、总结
这个程序在调试时,我发现一次只能查找一个景点的相关介绍,之后的最短路径的计算生成时是成功的,但在调试时却不是很好,输出结果有误。

通过这次算法设计实践,我对数据结构的运用有了更深的体会,对无向图和创建无向图的理解更加深刻,理解了迪杰斯特拉算法的原理,不再是盲目地照搬书上的程序。

之后,我还发现了我的不足之处,对程序的设计还不过灵活。

附录:源程序清单
#include<iostream>
#include<string>
using namespace std;
const int maxsize=100;
class mgraph
{
public:
mgraph(string a[],int n,int e);//构造函数,建立n个顶点,e条边的图
~mgraph(){} //析构函数
void dfstraverse(int v);//深度优先遍历
void shortpath(mgraph g,int v,int r);//求v到其余各个顶点的最短路径
private:
string vertex[maxsize];//存放图中顶点的数组
int arc[maxsize][maxsize];//存放图中边的数组
int vertexnum,arcnum;//图中的顶点数和边数
};
mgraph::mgraph(string a[],int n,int e)
{
int i,j,k;
vertexnum=n;
arcnum=e;
for( i=0;i<vertexnum;i++)
vertex[i]=a[i];
for(i=0;i<vertexnum;i++) //初始化邻接矩阵
for(j=0;j<vertexnum;j++)
arc[i][j]=0;
for(k=0;k<arcnum;k++)//依次输入每一条边
{
cout<<"请输入两个景点的编号:"<<endl;
cin>>i>>j;//依次输入边依附的两个顶点的编号和距离
if(i<7&&j<7)arc[i][j]=arc[j][i]=1;//置有边标志
else cout<<"没有该景点!!!"<<endl;
}
}
void mgraph::shortpath(mgraph g,int v,int r)
{
for (int i = 0; i < vertexnum; i++)
for (int j = 0; j < vertexnum; j++)
{
arc[i][j] = 1000000;//初始化路径长度
}
arc[0][1]=arc[1][0]=10;
arc[1][2]=arc[2][1]=5;
arc[2][3]=arc[3][2]=8;
arc[0][4]=arc[4][0]=15;
arc[1][4]=arc[4][1]=9;
arc[2][4]=arc[4][2]=10;
arc[3][4]=arc[4][3]=11;
arc[4][5]=arc[5][4]=12;
arc[0][5]=arc[5][0]=10;
arc[0][6]=arc[6][0]=14;
arc[5][6]=arc[6][5]=9;
int dist[maxsize]={0},s[maxsize];
string path[maxsize];
int k,i;
for( i=0;i<g.vertexnum;i++)
{
dist[i]=g.arc[v][i]; //初始化数组dist[n],path[n]
if(dist[i]<10000)
path[i]=g.vertex[v]+g.vertex[i];
else path[i]="";
}
s[0]=v;//初始化集合s
dist[v]=0;//标记顶点v为源点
int num=1;
while(num<g.vertexnum)//当顶点数num小于图的顶点数
{
for( k=0,i=0;i<g.vertexnum;i++)//在dist中查找最小值元素
if((dist[i]!=0)&&(dist[i]<dist[k]))k=i;
s[num++]=k;//将新生成的终点加入集合s
for(i=0;i<g.vertexnum;i++)//修改数组dist和path
if(dist[i]>dist[k]+g.arc[k][i])
{
dist[i]=dist[k]+g.arc[k][i];
path[i]=path[k]+g.vertex[i];
}
}
cout<<"路径长度为:"<<dist[k]<<"路径为:"<<path[k];
}
int main()
{
int aa,x,y;
cout<<"欢迎进入江苏大学校园导游系统!!"<<endl;
cout<<"0.图书馆,1.三山楼,2.三江楼,3.教工浴室,4.西山操场,5.西山美食城,
6.京江操场"<<endl;
string a[7]={"0","1","2","3","4","5","6"};
string b[7]={"图书馆","三山楼","三江楼","教工浴室","西山操场","西山美食城","京江操场"};
string c[7]={"图书馆:本建筑共有5层,有大量图书可供学生查阅,还可在其中自习",
"三山楼:2号教学楼,共8层,平时上课地点","三江楼:1号教学楼,共18层,
平时上课地点",
"教工浴室:周二至周日开放,开放时间:14:00至20:00","西山操场:早操地点,
平时自由锻炼的地方,每晚有大量人跑步",
"西山美食城:有大量美食可供选择,物美价廉","京江操场:位于六食堂附近,
规模比西山操场略小"};
mgraph tu(a,7,1);
cout<<"主要景点平面图:"<<endl;
cout<<" 京江操场* * * * * * * 六食堂
"<<endl;
cout<<" * * "<<endl;
cout<<" * * "<<endl;
cout<<" * * "<<endl;
cout<<" * * "<<endl;
cout<<" * * "<<endl;
cout<<" * * * *西山美食城* * * * "<<endl;
cout<<" * * * * "<<endl;
cout<<" * * * * "<<endl;
cout<<" * * * * "<<endl;
cout<<" * * * 西山操场* *老一区* "<<endl;
cout<<" * * * * * "<<endl;
cout<<" * * * * * * * * * * * * * * *教
工浴室"<<endl;
cout<<" * * * * * "<<endl;
cout<<" * * * * * "<<endl;
cout<<"* * * * *东山操场* * * "<<endl;
cout<<"* * * * "<<endl;
cout<<"* * * * 图书馆* * * * * * * * * * * * * * * "<<endl;
cout<<" * * * "<<endl;
cout<<" * * * * * * * * * * * * * *三山楼 * * * *三江楼
"<<endl;
cout<<"请输入您想要了解的景点编号:";
cin>>aa;
switch(aa)
{
case 0:
cout<<"此景点为:"<<b[0]<<"\n简介:"<<c[0]<<endl;break;
case 1:
cout<<"此景点为:"<<b[1]<<"\n简介:"<<c[1]<<endl;break;
case 2:
cout<<"此景点为:"<<b[2]<<"\n简介:"<<c[2]<<endl;break;
case 3:
cout<<"此景点为:"<<b[3]<<"\n简介:"<<c[3]<<endl;break;
case 4:
cout<<"此景点为:"<<b[4]<<"\n简介:"<<c[4]<<endl;break;
case 5:
cout<<"此景点为:"<<b[5]<<"\n简介:"<<c[5]<<endl;break;
case 6:
cout<<"此景点为:"<<b[6]<<"\n简介:"<<c[6]<<endl;break;
default:
cout<<"您好,请输入编号为0-6的数字"<<endl;
}
cout<<"请输入当前所在景点的编号:";
cin>>x;
cout<<"请输入您要前往的景点编号:"<<endl;
cin>>y;
cout<<"最短路径为:"<<endl;
tu.shortpath(tu,y,x);
cout<<"祝大家旅途愉快!!!"<<endl;
return 0;
}。

相关文档
最新文档