数据结构-图的课程设计
《数据结构课程设计》
课程题目 |
GDOU最短路径问题 |
课程编号 |
j1620102 |
学生姓名 |
janine_lee |
所在专业 |
信息管理与信息系统 |
所在班级 |
1131 |
任课老师 |
易学明 |
实习时间 |
16-17周 |
设计成绩 |
|
老师评语 |
目录
一. 课程设计目的 3
二. 课程设计要求 3
三. 课程设计要求 3
四. 需求分析 3-4
1. 问题分析 3
2. 功能需求 3
3. 实现要点 4
五. 逻辑结构和存储结构设计(概要设计) 4
六. 详细设计 5
七. 源代码 5
八. 时间复杂度和空间复杂度分析 13
九. 程序运行结果 13
十. 心得 17
一、 课程设计题目:
GDOU最短路径问题
二、课程设计目的:
1. 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
2. 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法
和技能;
3. 提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4. 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所具备的科学工作方法和作风。
三、课程设计要求:
题目0.GDOU是真是一个好地方,校园如一座大花园,美丽而宽广。校园有许多建筑如教学楼、饭堂、宿舍楼、图书馆、体育馆、运动场、商业街、医院等,还有一些著名的风景点。现请根据学校的平面图,找出一些重要的场所,画出学校的平面图(场所可以根据其重要性适当减少),根据实际画出不同点间的路径,并估算每两个场所间的路径长。请设计数据结构并编程,当给出一个出发点和要到达另外一个场所的信息时,请给出最佳路径,并输出路径相关信息。
四、需求分析 :
1、问题描述
图的最短路径问题是指从指定的某一点v开始,求得从该地点到图中其它各地点的最短路径,并且给出求得的最短路径的长度及途径的地点。除了完成最短路径的求解外,还能对该图进行修改,如顶点以及边的增删、边上权值的修改等。
GDOU最短路径问题中的数据元素有:
a) 顶点数
b) 边数
c) 边的长度(带权长度)
2、功能需求
要求完成以下功能:
a) 输出顶点信息:将GDOU内各位置输出。
b) 输出边的信息:将GDOU内每两个位置(若两个位置之间有直接路径)的距离输出。
c) 修改:修改两个位置(若两个位置之间有直接路径)的距离,并重新输出每两个位置(若两个位置之间有直接路径)的距离。
d) 求最短路径:输出给定两点之间的最短路径的长度及途径的地点或输出任意一点与其它各点的最短路径。
e) 删除:删除任意一条边。
f) 插入:插入任意一条边。
3、实现要点
a) 对图的创建采用邻接矩阵的存储结构,而且对图的操作设计成了模板类。为了便于处理,对于图中的每一个顶点和每一条边都设置了初值。
b) 为了便于访问,用户可以先输出所有的地点和距离。
c) 用户可以随意修改两点之间好的距离。
d) 用户可以增加及删除边。
e) 当用户操作错误时,系统会出现出错提示。
五、概要设计:
1. 抽象数据类型图的定义如下:
ADT Map{
数据对象V:V是具有相同特性数据元素的集合,称为顶点集。
数据关系R:
R={VR}
VR={(v,w)|v , w∈V, (v , w)表示v和w之间存在路径}
基本操作:
Map(&G, V, VR)
初始条件: V是图的顶点集,VR是图中边的集合。
操作结果:按定义(V, VR) 构造图G。
GetVex(G, v)
初始条件:图G存在,v是G中某个顶点。
操作结果:返回v的信息。
InsertVex(&G, v)
初始条件:图G存在,v和G中顶点具有相同特征。
操作结果:在图G中增添新顶点v。
DeleteVex(&G, v)
初始条件:图G存在,v和G中顶点具有相同特征。
操作结果:删除G中顶点v及其相关的边。
InsertArc(&G, v, w)
初始条件:图G存在,v和w是G中两个顶点。
操作结果:在G中增添弧<v,w>,若G是无向的,则还增添对称弧<w,v>。
DeleteArc(&G, v, w)
初始条件:图G存在,v和w是G中两个顶点。
操作结果:在G中删除弧<v,w>,若G是无向的,则还删除对称弧<w,v>。
} ADT Map
2. 主程序
void main()
{
初始化;
while(“命令”!=“退出”)
{
Switch语句
接受命令(输入选择项序号);
处理命令;
}
}
3. 本程序运用函数的调用,只有两个模块,它们的调用关系为:
主程序模块
带权无向图模块
六、详细设计
(详细见下面的源代码)
structVextype{ /
char name[30];
int num;
}; //图中顶点表示点,存放点名称
void Menu() //输出菜单
void PutOutVex(Map*G) //输出每个顶点的信息
void PutOutArc(Map*G) //输出每条边的信息
void Dijkstra(Map* G) //迪杰斯特拉算法求最短路径
void DeleteVex(Map*G) //删除某个顶点
void DeleteArc(Map*G) //删除某条边
void InsertArc(Map*G) //插入某条边
void main() //主函数
七、源程序代码
#include<iostream>
#include<conio.h>
using namespacestd;
const intMAX=1000; //最大距离
const intMAXVES=8;//最大的顶点数
//采用结构体,里面的数据无封装性,不过胜在容易使用结构体中的数据
struct Vextype{ //图中顶点表示点,存放点名称
char name[30];
int num;
};
struct Map{
Vextype vexs[MAXVES]; //顶点的信息
int arcs[MAXVES][MAXVES]; //邻接矩阵
int vexnum,arcnum ; //顶点数和边数
};
Map b;
Map map(){ //建立无向网的邻接矩阵
int i, j;
Map G;
G.vexnum =8; //存放顶点数
G.arcnum =14; //存放边数
for(i=0;i<G.vexnum;i++){
G.vexs[i].num=i;
strcpy(G.vexs[0].name,"校 医 院");//将 校医院 复制至 G.vexs[0].name
strcpy(G.vexs[1].name,"海 风");
strcpy(G.vexs[2].name,"第三饭堂");
strcpy(G.vexs[3].name,"科 技 楼");
strcpy(G.vexs[4].name,"钟 海 楼");
strcpy(G.vexs[5].name,"中心广场");
strcpy(G.vexs[6].name,"图 书 馆");
strcpy(G.vexs[7].name,"主 楼");
}
for(i=0;i<G.vexnum;i++) {
for(j=0;j<G.vexnum;j++) {
G.arcs[i][j]=MAX;
G.arcs[0][1]=200; //校医院-海风(利用权值代表它们的距离)
G.arcs[0][3]=400; //校医院-科技楼
G.arcs[1][2]=130; //海风-第三饭堂
G.arcs[1][3]=250; //海风-科技楼
G.arcs[2][3]=150; //第三饭堂-科技楼
G.arcs[2][4]=100; //第三饭堂-钟海楼
G.arcs[3][4]=50; //科技楼-钟海楼
G.arcs[3][5]=50; //科技楼-中心广场
G.arcs[3][6]=30; //科技楼-图书馆
G.arcs[4][5]=9; //钟海楼-中心广场
G.arcs[4][7]=20;//钟海楼-主楼
G.arcs[5][7]=13;//中心广场-主楼
G.arcs[5][6]=10;//中心广场-图书馆
G.arcs[6][7]=22;//图书馆-主楼
}
}
for(i=0;i<G.vexnum;i++) {
for(j=0;j<G.vexnum;j++) {
G.arcs[j][i]=G.arcs[i][j]; //使上述所有 G.arcs[j][i]=G.arcs[i][j] ,比如,上面写了 G.arcs[6][7]=22 ,但没有写出G.arcs[7][6]=22 ,那么此处就是把G.arcs[6][7] 的值赋给 G.arcs[7][6] ;
}
}
return G;
}
void Menu() //菜单
{
cout<<"******************************************************************************";
cout<<" *** 1:输出顶点的信息 *** \n";
cout<<" *** 2:边 的信息输出 *** \n";
cout<<" *** 3:求出 最短路径 *** \n";
cout<<" *** 4:插入 某 条 边 *** \n";
cout<<" *** 5:删除 某个顶点 *** \n";
cout<<" *** 6:删除 某 条 边 *** \n";
cout<<" *** 7:修 改 *** \n";
cout<<" *** 8:退 出 *** \n";
cout<<"******************************************************************************";
}
void PutOutVex(Map*G) //遍历所有顶点,并且输出每个顶点的信息
{
int v;
for(v=0;v<G->vexnum;v++) {
cout<<" "<<G->vexs[v].num<<" 代表: "<<G->vexs[v].name<<endl;
}
}
void PutOutArc(Map*G) //遍历所有边(遍历邻接矩阵中所有顶点跟顶点之间的边),输出每条边的信息
{
for(int i=0;i<G->vexnum;i++)
for(int j=0;j<G->vexnum;j++)
if(G->arcs[i][j]<MAX)
{
cout<<"从 "<<G->vexs[i].name<<" 到 "<<G->vexs[j].name<<" 距离为:"<<G->arcs[i][j]<<" 米"<<endl;
}
}
void Update(Map*G) //修改源顶点/结束顶点(也就是,修改邻接矩阵所对应的图中的顶点)
{
int v0,v1,length;
cout<<"请输入要修改的源顶点:";
cin>>v0;
cout<<"请输入要修改的结束顶点:";
cin>>v1;
cout<<"它们的距离为:";
cin>>length;
G->arcs[v0][v1]=G->arcs[v1][v0]=length;
}
void Dijkstra(Map* G) //迪杰斯特拉算法求最短路径
{
int v,w,i,min,t=0,x,v0,v1;
int final[20], D[20], p[20][20]; //用空的final[20]装已经求得在最短路径上的顶点编号(地点编号v1-v8), 用空的D[20]装顶点之间的带权长度(权值), 用空的 p[20][20]装已经求得在最短路线上的所有顶点;
cout<<"请输入源顶点:\n";
cin>>v0;
if(v0<0||v0>G->vexnum) //判断源顶点是否存在
{
cout<<"此点编号不存在!请重新输入顶点编号:";
cin>>v0;
}
cout<<"请输入结束顶点:\n";
cin>>v1;
if(v1<0||v1>G->vexnum) //判断结束顶点是否存在
{
cout<<"此点编号不存在!请重新输入顶点编号:";
cin>>v1;
}
for(v=0;v<G->vexnum;v++) {
// 初始化final[20],p[20][20],final[v]=1即已经求得v0到v的最短路径,
//p[v][w]=1则是w从v0到v当前求得最短路径上的顶点,D[v]带权长度
final[v]=0;
D[v]=G->arcs[v0][v];
for(w=0;w<G->vexnum;w++){
p[v][w]=0;
}
if(D[v]<MAX)
{
p[v][v0]=1;p[v][v]=1;
}
}
D[v0]=0;
final[v0]=1;
for(i=1;i<G->vexnum;i++)
{
min=MAX;
for(w=0;w<G->vexnum;w++){
if(!final[w]){
if(D[w]<min)
{
v=w;
min=D[w];
}
final[v]=1;
}
}
for(w=0;w<G->vexnum;w++){
if(!final[w]&&(min+G->arcs[v][w]<D[w]))
{
D[w]=min+G->arcs[v][w];
for(x=0;x<G->vexnum;x++)
p[w][x]=p[v][x];
p[w][w]=1;
}
}
}
cout<<"从 "<<G->vexs[v0].name<<" 到"<<G->vexs[v1].name<<"的最短路径为:"<<D[v1]<<" 米"<<endl;
cout<<"它们的具体路线如下:\n";
for(int j=0;j<G->vexnum;j++)
{
if(p[v1][j]==1)
cout<<G->vexs[j].name<<endl;
}
}
void DeleteVex(Map*G) //删除顶点
{
int row,col;
int v0;
cout<<"请输入要删除的顶点";
cin>>v0;
for(int i=v0;i<G->vexnum;i++)
G->vexs[i]=G->vexs[i+1];
G->vexnum--;
for(row=0;row<G->vexnum;row++)
{
for(col=v0;col<G->vexnum;col++)
G->arcs[row][col]=G->arcs[row][col+1];
}
for(col=0;col<G->vexnum;col++)
{
for(row=v0;row<G->vexnum;row++)
G->arcs[col][row]=G->arcs[col][row+1];
}
}
void DeleteArc(Map*G) //删除某条边
{
int v0,v1;
cout<<"请输入两顶点:\n";
cin>>v0>>v1;
G->arcs[v0][v1]=MAX;
G->arcs[v1][v0]=MAX;
}
void InsertArc(Map*G) //插入某条边
{
int v0,v1,l=0;
cout<<"请输入两顶点:\n";
cin>>v0>>v1;
cout<<"请输入它们之间的距离:\n";
cin>>l;
G->arcs[v0][v1]=l;
G->arcs[v1][v0]=l;
}
void main() //主函数
{
int a;
char ch;
b=map(); //将map()中的对象G含有的数据,赋给对象b
Menu();
cout<<endl;
cout<<"请输入操作号(1-8):";
cin>>a;
while(a!=8)
{
switch(a)
{
case 1:
PutOutVex(&b);
Menu();
break;
case 2:
PutOutArc(&b);
Menu();
break;
case 3:
PutOutVex(&b);
cout<<"按任意键(除了Esc键,它是返回菜单键)进入计算最短路径操作"<<endl;
if((ch=getch())==27){Menu();}
else{
Dijkstra(&b);
Menu();
}
break;
case 4:
cout<<"按任意键(除了Esc键,它是返回菜单键)进入插入边操作"<<endl;
if((ch=getch())==27){Menu();}
else{
InsertArc(&b);
Menu();
}
break;
case 5:
PutOutVex(&b);
cout<<"按任意键(除了Esc键,它是返回菜单键)进入删除点操作"<<endl;
if((ch=getch())==27){Menu();}
else{
DeleteVex(&b);
Menu();
}
break;
case 6:
cout<<"按任意键(除了Esc键,它是返回菜单键)进入删除边操作"<<endl;
if((ch=getch())==27){Menu();}
else{
DeleteArc(&b);
Menu();
}
break;
case 7:
PutOutArc(&b);
cout<<"按任意键(除了Esc键,它是返回菜单键)进入修改操作"<<endl;
if((ch=getch())==27){Menu();}
else{
Update(&b);
Menu();
}
break;
case 8:
exit(1);
break;
default:
break;
}
cout<<endl;
cout<<"请输入操作号(0-8):";
cin>>a;
}
}
八、时间复杂度和空间复杂度分析
1) 本课程设计在求最短路径的问题上采用的迪杰斯特拉算法,与弗洛伊德算法相比时间复杂度较低,但每求一条最短路径都必须重新查询一遍,导致查询效率低。而弗洛伊德算法只要计算一次,即可求得每一对顶点之间的最短路径(边),虽然时间复杂度为高,但以后每次查询只要查表即可,会极大地提高查询的效率,而且,弗洛伊德算法还支持带负权的图的最短路径的计算。由此可见,以后,选用算法时必须综合各方面因素考虑。
2) 由于功能函数较多,在编写程序时将函数逐个添加完成的,就是说,每增加一个函数,进行一次编译运行,此函数通过了再写下一个函数。或许这种方法比较麻烦,但当有错误时只要针对新加函数进行修改即可。同时,要充分利用软件所提供的调试功能,这也会大大减少编程人员的负担。
3) 采用结构体,虽然对数据成员公有化,导致无封装性,但是本课程设计旨在完成最短路径的算法,所以采用结构体是为了易于调用这些数据成员,减轻编程人员的负担。
九、程序运行结果
a) 开始界面
b) 输出顶点信息
c) 输出边的信息
d) 修改
e) 求最短路径
f) 删除某一顶点
g) 删除某条边
h) 插入某条边
i) 退出
十、总结及体会
这次的课程设计,用了2个礼拜准备,很多地方自己不会,通过问舍友,问师兄,加上看书上网查来解决问题,原本以为了解了思想就能很快的把课程设计做出来,但是要做的时候才发现准备的不充分,于是我先把大概的路线画了张无向图,再把它的邻接矩阵写下来。在旁边标上自己的想法,再想要用什么代码来写这部分,这样一下子就明朗很多了。但是由于先前基础比较差,写代码方面真的很吃力。这也给了我很多的动力,代码方面真的要学好才能真正学会数据结构这门课,所以我打算这个寒假在网上再学一遍C++,把代码学透。再来学习数据结构这门课。
数据结构-图的课程设计相关推荐
- 数据结构与算法课程设计大作业
考 核 要 求 课程编号:400802010 课程名称:数据结构与算法课程设计考试形式:大作业 大作业1-9见我的下载 里面包含多个版本的设计 文件有cpp文件设计文档总结等 一.设计 ...
- 数据结构计算机专业教学计划编制,数据结构与算法课程设计报告--教学计划编制...
数据结构与算法课程设计报告--教学计划编制 数据结构与算法课程设计报告题目教学计划编制目录一.需求分析311系统概述3111研究背景3112研究意义及目的312具体分析4121功能需求分析4122运行 ...
- 数据结构与算法课程设计之五子棋(人机)
数据结构与算法课程设计之五子棋(人机) 五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏.通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜. 这是 ...
- 数据结构c语言课程设计报告,(数据结构c语言课程设计报告.doc
(数据结构c语言课程设计报告 数据结构 课程设计报告 设计题目:迷宫求解 专 业 机电一体化 班 级 08专接本 学 生 学 号 104910252011 指导教师 高在村 完成时间 2011. 5 ...
- C语言数据结构迷宫实验报告,数据结构c语言课程设计报告之迷宫
数据结构c语言课程设计报告之迷宫 C语言与数据结构课程设计报告学 号 ** 姓 名 ** 课程设计题目 迷 宫 求 解 2012 年 5 月目 录1 需求分析 1.1 功能与数据需求 1.1.1 题目 ...
- 数据结构c语言程序设计报告,数据结构与算法课程设计报告模版.doc
数据结构与算法课程设计报告模版.doc 数据结构与算法课程设计报告题 目本科生导师制问题与家族关系查询系统院 (系) 信息科学与工程 专业班级 计算机应用技术1301班 学生姓名 顾 泉 学 号 20 ...
- 数据结构与算法课程设计——C语言《职员薪资查询系统》
数据结构与算法课程设计--C语言<职员薪资查询系统> 温馨提示:课设要自己去操作,自己写代码,可以借鉴他人代码,学习思路和一些操作,切不可完全抄袭!!! 总体说明:设计一个职员薪资查询系统 ...
- 数据结构与算法课程设计
基于c语言的数据结构课程设计 选题:二手车信息管理系统 课程设计要求如下: 1.每人选择一个题目,独立完成(可以自拟,题目不得重复) 2.课程设计要求必须用到数据结构,即线性存储或非线性存储.必须用 ...
- 【无标题】数据结构与算法课程设计公园导游图
目 录 1 需求分析........................................................ 1 1.1 ...
- 用MATLAB编程正弦稳态相量图,matlab课程设计--利用MATLAB对线性电路正弦稳态特性分析...
matlab课程设计--利用MATLAB对线性电路正弦稳态特性分析 课程设计任务书 学生姓名: 专业班级: 指导教师: 刘 新 华 工作单位:信息工程学院 题 目: 利用MATLAB对线性电路正弦稳态 ...
最新文章
- pandas基于时序数据计算模型预测推理需要的统计数据(累计时间、长度变化、变化率、方差、均值、最大、最小等):范围内的统计量、变化率、获得数据集最后的几条数据的统计量、变化率、获得范围内的统计量
- 使用bash工具创建ssh key
- linux命令之find和locate
- 二叉树的中序遍历非递归方法(算法导论第三版12.1-3)
- mysql连接不断线_某些小时后MySql连接自动掉线
- javascript等待异步线程完成_前端:什么是单线程,同步,异步?彻底弄懂 JavaScript 执行机制...
- HTTP POST GET 本质区别详解(转)
- 怎么升级计算机硬盘,研究僧 篇一:记一次老电脑的升级之路
- linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(oracle基础配置_04)
- 常见排序算法(比较排序)及比较
- nvidia-smi‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件
- Google Drive 被曝0day,可诱骗用户安装恶意软件
- mmap和MappedByteBuffer
- 均线策略python代码_Python版商品期货多品种均线策略
- 腾讯加入QQ群,代码生成地址
- python label背景透明_如何使tkinter标签的背景透明,以便只看到文本?
- 手机连接电脑linux系统怎么样,电脑(Linux/Windows)使用SSH远程登录安卓(Android)手机实现无线传输和管理文件(图文详解)...
- c语言指针选择题库及答案,C语言指针练习习题及答案.doc
- Transfer learning for deep neural network-based partial differential equations solving论文笔记
- ubuntu 双显卡安装n卡 Quadro K620 Tesla K80*8 显卡驱动的卸载 (已解决)没有图形界面。黑屏
热门文章
- 分布式项目Maven打包出现Could not resolve dependencies for project、Could not find artifact问题解决
- 3天完成Open CPU开发!7天完成Costdown!满足客户对成本、功耗、安全性等方面的需求!
- 鸿蒙会出电脑系统吗,鸿蒙有没有可能出PC操作系统?
- 修订歌词《仙剑》电视原声插曲《逍遥叹》
- 深度学习中训练迭代次数理解【源码阅读技巧分享】【深度学习循环迭代理解】【for X, y in train_iter:】
- dreamweaver cs6 的破解方法
- HTML5期末大作业:旅游网页设计与实现——旅游风景区网站HTML+CSS+JavaScript 景点静态网页设计 学生DW静态网页设计
- java设计triangle三角形_Java:【三角形类Triangle】设计一个名为Triangle的类来扩展GeometricObject类。该类包括:...
- 关于条形码,你知道多少?
- 推荐一款博客备份工具!