数据结构课程设计
2015-01-14 00:02
176 查看
《数据结构课程设计》
题目0.GDOU是真是一个好地方,校园如一座大花园,美丽而宽广。校园有许多建筑如0教学楼、1饭堂、2宿舍楼、3图书馆、4体育馆、5运动场、6商业街、7医院等,还有一些著名的风景点。现请根据学校的平面图,找出一些重要的场所,画出学校的平面图(场所可以根据其重要性适当减少),根据实际画出不同点间的路径,并估算每两个场所间的路径长。请设计数据结构并编程,当给出一个出发点和要到达另外一个场所的信息时,请给出最佳路径,并输出路径相关信息。
本程序采用Floyd算法,其基本思想是先定义两个点Vi到Vj之间的弧是最短路径,然后进行n次试探。首先比较Vi,Vj和Vi,V0的路径长度,取长度较短的作为中间顶点的编号不大于1的最短路径。一次类推,经过n次比较之后,最后求得Vi到Vj之间的最短路径。
题目0中一共有7个地点,它们之间的分布和距离如下图:
1:饭堂、2:医院 3:图书馆、4:宿舍楼、5:体育馆、6:商业街 7:运动场
运行的环境:VC6.0,这个软件是比较适合C++初学者来使用,有着较为健全的功能。
使用的算法:Floyd算法
#include <iostream>
#include <string>
#include<iomanip> //引入输入输出格式头文件
using namespace std;
const int Maxsize = 10;
class MGraph //定义一个类:地图
{
public:
MGraph(string a,int n,int e);
void Floyd();
void print();
private:
string vertex[Maxsize];
int arc[Maxsize][Maxsize];
int vertexNum,arcNum;
int dist[Maxsize][Maxsize];
string path[Maxsize][Maxsize];
};
MGraph:: MGraph(string a,int n,int e)
{ int i,j,k,info;
vertexNum = n;
arcNum = e;
for(i=0;i<vertexNum;i++)
vertex[i]=a[i];
for(i=0;i<vertexNum;i++) //初始化边,请将不到达边初始值为最大值,这里设置为10000
for(j=0;j<vertexNum;j++)
arc[i][j]=10000;
for(k=0;k<arcNum;k++) //输入图的边的顶点信息,将图顶点进行编号,从0开始
{ cout<<"请输入边依附的两个顶点的编号"<<endl;
cin>>i>>j;
while(i>=vertexNum && j>=vertexNum)
{ cout<<"请重新输入"<<endl;
cin>>i>>j;
}
cout<<"请输入边的权值"<<endl; //输入图的边的权值
cin>>info;
while(info < 0)
{ cout<<"请重新输入"<<endl;
cin>>info;
}
arc[i][j]=info;
}
}
void MGraph::Floyd() //定义了Floyd算法
{ int i,j,k;
for(i=0;i<vertexNum;i++) //初始化dist和path
for(j=0;j<vertexNum;j++)
{ dist[i][j] = arc[i][j];
if(dist[i][j] != 10000)
path[i][j]=vertex[i]+vertex[j];
else path[i][j] =" ";
}
for(k=0;k<vertexNum;k++) //判定顶点i j之间是否经过k
for(i=0;i<vertexNum;i++)
for(j=0;j<vertexNum;j++)
if(dist[i][k]+dist[k][j]<dist[i][j])
{ dist[i][j]=dist[i][k]+dist[k][j];
path[i][j]=path[i][k]+"-"+path[k][j];
}
}
void MGraph::print() //结点m到n的最短路径
{ int a,b,i;
cout<<"图的所有路径如下:"<<endl;
for(i=0;i<vertexNum;i++) //输出图的所有路径信息
{ for(int j=0;j<vertexNum;j++)
cout<<setw(10)<<setiosflags(ios::left)<<path[i][j]<<" "; //10个字符位置,且左对齐
cout<<endl;
}
cout<<"图的所有路径长如下:"<<endl;
for(i=0;i<vertexNum;i++) //输出图的各边长信息
{ for(int j=0;j<vertexNum;j++)
cout<<setw(3)<<setiosflags(ios::left)<<dist[i][j]<<" "; //3个字符位置,且左对齐
cout<<endl;
}
cout<<"您想了解哪两个点的最短路径?请输入这两个点"<<endl;
string ch1,ch2;
cin>>ch1>>ch2; //输入要判定是的顶点,请输入顶点字符。
for(i=0;i<vertexNum;i++)
if(vertex[i] == ch1) a=i;
for(i=0;i<vertexNum;i++)
if(vertex[i] == ch2) b=i;
cout<<ch1<<"到"<<ch2<<"的最短路径为:"<<path[a][b]<<"长度为"<<dist[a][b]<<endl;
system("pause");
}
int main()
{ int n,e;
string ch;
cout<<"请输入顶点数和边数,空格格开:"<<endl;
cin>>n>>e;
cout<<"请依次输入各个顶点字符串:"<<endl;
cin>>ch;
MGraph m(ch,n,e);
m.Floyd();
m.print();
return 0;
}
这个程序相对比较简单,采用了Floyd算法,可以比较简便的算出两个点之间的长度。通过这次课程设计,再次巩固了C++的基础知识,此外也让我对了最短路径的算法有了更加深刻的认识。
《数据结构课程设计》
课程题目 | 最佳路径问题 |
课程编号 | j1620102 |
学生姓名 | 杨小华 |
所在专业 | 信息管理和信息系统 |
所在班级 | 信管1134班 |
任课老师 | 易学明 |
实习时间 | 第十七周 |
设计成绩 | |
老师评语 | |
题目0.GDOU是真是一个好地方,校园如一座大花园,美丽而宽广。校园有许多建筑如0教学楼、1饭堂、2宿舍楼、3图书馆、4体育馆、5运动场、6商业街、7医院等,还有一些著名的风景点。现请根据学校的平面图,找出一些重要的场所,画出学校的平面图(场所可以根据其重要性适当减少),根据实际画出不同点间的路径,并估算每两个场所间的路径长。请设计数据结构并编程,当给出一个出发点和要到达另外一个场所的信息时,请给出最佳路径,并输出路径相关信息。
本程序采用Floyd算法,其基本思想是先定义两个点Vi到Vj之间的弧是最短路径,然后进行n次试探。首先比较Vi,Vj和Vi,V0的路径长度,取长度较短的作为中间顶点的编号不大于1的最短路径。一次类推,经过n次比较之后,最后求得Vi到Vj之间的最短路径。
题目0中一共有7个地点,它们之间的分布和距离如下图:
1:饭堂、2:医院 3:图书馆、4:宿舍楼、5:体育馆、6:商业街 7:运动场
运行的环境:VC6.0,这个软件是比较适合C++初学者来使用,有着较为健全的功能。
使用的算法:Floyd算法
#include <iostream>
#include <string>
#include<iomanip> //引入输入输出格式头文件
using namespace std;
const int Maxsize = 10;
class MGraph //定义一个类:地图
{
public:
MGraph(string a,int n,int e);
void Floyd();
void print();
private:
string vertex[Maxsize];
int arc[Maxsize][Maxsize];
int vertexNum,arcNum;
int dist[Maxsize][Maxsize];
string path[Maxsize][Maxsize];
};
MGraph:: MGraph(string a,int n,int e)
{ int i,j,k,info;
vertexNum = n;
arcNum = e;
for(i=0;i<vertexNum;i++)
vertex[i]=a[i];
for(i=0;i<vertexNum;i++) //初始化边,请将不到达边初始值为最大值,这里设置为10000
for(j=0;j<vertexNum;j++)
arc[i][j]=10000;
for(k=0;k<arcNum;k++) //输入图的边的顶点信息,将图顶点进行编号,从0开始
{ cout<<"请输入边依附的两个顶点的编号"<<endl;
cin>>i>>j;
while(i>=vertexNum && j>=vertexNum)
{ cout<<"请重新输入"<<endl;
cin>>i>>j;
}
cout<<"请输入边的权值"<<endl; //输入图的边的权值
cin>>info;
while(info < 0)
{ cout<<"请重新输入"<<endl;
cin>>info;
}
arc[i][j]=info;
}
}
void MGraph::Floyd() //定义了Floyd算法
{ int i,j,k;
for(i=0;i<vertexNum;i++) //初始化dist和path
for(j=0;j<vertexNum;j++)
{ dist[i][j] = arc[i][j];
if(dist[i][j] != 10000)
path[i][j]=vertex[i]+vertex[j];
else path[i][j] =" ";
}
for(k=0;k<vertexNum;k++) //判定顶点i j之间是否经过k
for(i=0;i<vertexNum;i++)
for(j=0;j<vertexNum;j++)
if(dist[i][k]+dist[k][j]<dist[i][j])
{ dist[i][j]=dist[i][k]+dist[k][j];
path[i][j]=path[i][k]+"-"+path[k][j];
}
}
void MGraph::print() //结点m到n的最短路径
{ int a,b,i;
cout<<"图的所有路径如下:"<<endl;
for(i=0;i<vertexNum;i++) //输出图的所有路径信息
{ for(int j=0;j<vertexNum;j++)
cout<<setw(10)<<setiosflags(ios::left)<<path[i][j]<<" "; //10个字符位置,且左对齐
cout<<endl;
}
cout<<"图的所有路径长如下:"<<endl;
for(i=0;i<vertexNum;i++) //输出图的各边长信息
{ for(int j=0;j<vertexNum;j++)
cout<<setw(3)<<setiosflags(ios::left)<<dist[i][j]<<" "; //3个字符位置,且左对齐
cout<<endl;
}
cout<<"您想了解哪两个点的最短路径?请输入这两个点"<<endl;
string ch1,ch2;
cin>>ch1>>ch2; //输入要判定是的顶点,请输入顶点字符。
for(i=0;i<vertexNum;i++)
if(vertex[i] == ch1) a=i;
for(i=0;i<vertexNum;i++)
if(vertex[i] == ch2) b=i;
cout<<ch1<<"到"<<ch2<<"的最短路径为:"<<path[a][b]<<"长度为"<<dist[a][b]<<endl;
system("pause");
}
int main()
{ int n,e;
string ch;
cout<<"请输入顶点数和边数,空格格开:"<<endl;
cin>>n>>e;
cout<<"请依次输入各个顶点字符串:"<<endl;
cin>>ch;
MGraph m(ch,n,e);
m.Floyd();
m.print();
return 0;
}
这个程序相对比较简单,采用了Floyd算法,可以比较简便的算出两个点之间的长度。通过这次课程设计,再次巩固了C++的基础知识,此外也让我对了最短路径的算法有了更加深刻的认识。
相关文章推荐
- 四则运算实现(c 语言 数据结构课程设计题)
- 浅说代码风格 - 数据结构课程设计
- 数据结构课程设计---最长公共子串
- 数据结构课程设计---学生信息管理系统
- 数据结构课程设计(C++语言)
- 数组应用[数据结构课程设计]
- 数据结构课程设计---最长公共子串
- 重言式判别 (数据结构课程设计)
- 数据结构课程设计:括号匹配问题(实现检验匹配并输出不匹配的位置)
- 数据结构课程设计
- 数据结构课程设计题目
- 数据结构课程设计-校园导游系统-带注释
- 数据结构课程设计---学生信息管理系统
- 校园导航-_数据结构课程设计
- 数据结构课程设计(2)
- 数据结构课程设计-----用C#实现双向链表
- 数据结构课程设计--航空客运订票系统
- 数据结构课程设计---教学任务安排系统
- 个人帐簿管理系统设计[数据结构课程设计]
- 数据结构课程设计----基数排序