中国石油大学数据结构课程设计.docx
《中国石油大学数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《中国石油大学数据结构课程设计.docx(27页珍藏版)》请在冰豆网上搜索。
![中国石油大学数据结构课程设计.docx](https://file1.bdocx.com/fileroot1/2022-10/11/60021a4e-6b4e-4c8b-bc92-c9cda555cf80/60021a4e-6b4e-4c8b-bc92-c9cda555cf801.gif)
中国石油大学数据结构课程设计
——数据结构(C语言)课程设计
题目:
可视化弗洛伊德最短路径
一.实习目的
通过实习,了解并初步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、系统集成、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作方法,为进一步的应用开发打好基础。
二.问题描述
设计、实现随机或手动建立一个有向图,可以使用弗洛伊德算法输出有向图中节点之间最短路径及权值,并把有向图和弗洛伊德算法得出的最短路径及最小权值可视化。
三.需求分析
(1)可随机建立有向图,并在屏幕上使图可视化;
(2)可手动建立有向图,添加节点、删除节点、移动节点、添加边、删除边、设置权值,并在屏幕上使图可视化;
(3)对已建立的有向图实现弗洛伊德算法找出最短路径,并在屏幕上使最短路径及最小权值矩阵可视化;
四.概要设计
∙.系统中子程序及功能要求:
数据对象V:
一个集合,该集合中的所有元素具有相同的特性
数据关系R:
R={VR}
VR={|P(x,y)^(x,y属于V)}
(1)OnButtonCreategraph()//随机建图按钮;
(2)OnButtonHuman()//手动建图按钮;
(3)OnButtonAddvertex()//添加节点按钮;
(4)OnButtonDeletevertex()//删除节点按钮;
(5)OnButtonMovevertex()//移动节点按钮;
(6)OnButtonAddedge()//添加边按钮;
(7)OnButtonDeleteedge()//删除边按钮;
(8)OnButtonSetweight()//设置权值按钮;
(9)OnButtonFloyd()//弗洛伊德算法按钮;
(10)DrawDGRandom(TCenterPoint,pDC)//随机建图;
(11)DrawDiGraph(CDC*pDC)//图可视化;
(12)DrawVexs(CDC*pDC)//节点可视化;
(13)DrawEdges(CDC*pDC)//边可视化;
(14)InitHand()//存储节点;
(15)CreateDGHand(CPointcenterpoint)//手动建图;
(16)AddVertsHand()//添加节点;
(17)DeleteVex(CPointvPoint)//删除节点;
(18)AddEdgesHand()//添加边;
(19)DeleteEdge(CGraphVertex*pBeginVex,CGraphVertex*pEndVex)//删除边;
(20)SetEdgeWeightHand()//设置权值;
(21)Floyd()//弗洛伊德算法;
(22)DrawFloyd(CDC*pDC)//弗洛伊德可视化;
∙各程序模块之间的调用关系(子程序编号见上):
主函数可调用子程序1、2、3、4、5、6、7、8、9
子程序1可调用子程序10
子程序2、3可调用子程序14、15
子程序3可调用子程序16
子程序4可调用子程序17
子程序6可调用子程序18
子程序7可调用子程序19
子程序8可调用子程序20
子程序9可调用子程序21
子程序10可调用子程序11
子程序16可调用子程序12
子程序17可调用子程序12、19
子程序18、19、20可调用子程序13
子程序21可调用子程序22
五.测试分析
按照附录中的测试数据,得出如下测试、分析结果:
1.建图功能:
(1)随机建图:
随机去顶节点的个数与位置及节点之间边的连接、方向与权值大小,并在屏幕上输出图结构;
测试结果:
可随机输出一有向图。
(2)手动建图:
a、添加节点:
手动添加节点并放在任意位置;
结果:
可在任意位置添加节点。
b、删除节点:
手动删除一节点;
结果:
只能按顺序删除,无法任意删除,有待改进。
c、移动节点:
可将某一节点移动到其他位置;
结果:
尚未实现。
d、添加边:
在任意两个不同节点之间添加任意方向的边;
结果:
可以实现添加任意方向的边。
e、删除边:
删除任意一条已存在的边;
结果:
可以删除任意一条存在的边。
d、设置权值:
给任意一条已存在的边赋予权值;
结果:
可以赋予权值;
(3)弗洛伊德算法:
对已确定的有向图通过Floyd算法找到任意两点间的最短路径并在屏幕上输出最短路径及权值的矩阵;
结果:
可正确输出路径及权值。
六.使用说明
1.运行程序,首先出现主界面。
主界面首先包括两个个选项:
选项一:
随机建图,点击按钮可在屏幕上输出一随机有向图;
选项二:
手动建图,可以手动建立有向图。
2.手动建图,出现6个新的选项:
选项一:
添加节点,在任意位置点击添加一节点;
选项二:
删除节点,可删除一个节点;
选项三:
移动节点,可以移动一节点到其他位置(待改进);
选项四:
添加边,点击一个节点后再点击另外一个即可添加该方向的边;
选项五:
删除边,点击按钮后输入想删除的边的两个节点即可删除该边;
选项六:
设置权值,点击按钮后输入想添加的边的两个节点及权值即可给该边赋予权值。
3.弗洛伊德算法:
对屏幕上已显示的有向图运行Floyd算法,输出最短路径及权值。
七.附录:
测试数据
九.附C语言实现源码
∙系统用到的抽象数据类型定义:
∙classCDiGraph
∙{
∙public:
∙CDiGraph();
∙virtual~CDiGraph();
∙public:
∙基本数据:
∙voidDrawFloyd(CDC*pDC);
∙voidFloyd();
∙voidTransform();
∙voidInitHand();
∙//有向图的当前顶点数目
∙intvexnum;
∙//有向图的当前边数目
∙intarcnum;
∙//有向图深度优先已经遍历顶点数目
∙intm_nDFSnum;
∙//有向图存储链表
∙CTypedPtrListm_DigraphList;
∙CStringArrayvex[MAX];
∙intArrayweight[MAX][MAX];
∙CStringPath[MAX][MAX];
基本操作:
voidCreateDGRandom(CPointvCenterPoint);
//自动创建有向图
voidCreateDGHand(CPointvCenterPoint);
//手动创建有向图
///////////////////////////////////////////////////////
//有向图基本函数//
///////////////////////////////////////////////////////
intLocateInList(CStringvName);
//判断顶点vPoint是否在有向图存储链表
CGraphVertex*IsPointInList(CPointvPoint);
//判断顶点名vName是否在有向图存储链表
CGraphVertex*IsNameInList(CStringvName);
//判断边(pBeginVex,pEndVex)是否在有向图中
BOOLIsEdgeExist(CGraphVertex*pBeginVex,CGraphVertex*pEndVex);
//判断名为vName的顶点是否在有向图中存储链表中
CGraphVertex*IsVexNameInList(CStringvName);
//查找名为vName的顶点在有向图中存储链表中的地址
CGraphVertex*FindVexNameInList(CStringvName);
//设置边(vBeginVex,vEndVex)的权值
voidSetEdgeWeight(CStringvBeginVex,CStringvEndVex,intvWeight);
voidDeleteVex(CPointvPoint);
//删除显示位置为vPoint的顶点
voidDeleteEdge(CGraphVertex*pBeginVex,CGraphVertex*pEndVex);
//删除边(pBeginVex,pEndVex)
voidInsertEdge(CGraphVertex*pBeginVex,CGraphVertex*pEndVex,intweight);
//插入顶点(pBeginVex,pEndVex)之间的边
///////////////////////////////////////////////////////
//有向图显示函数//
///////////////////////////////////////////////////////
//有向图可视化显示
voidDrawDiGraph(CDC*pDC);
//显示有向图边
voidDrawEdges(CDC*pDC);
//显示有向图顶点
voidDrawVexs(CDC*pDC);
∙};
画图类:
∙classCDiGraphDraw:
publicCFormView
∙{
∙protected:
∙CDiGraphDraw();//protectedconstructorusedbydynamiccreation
∙DECLARE_DYNCREATE(CDiGraphDraw)
∙
∙//FormData
∙public:
∙//{{AFX_DATA(CDiGraphDraw)
∙enum{IDD=IDD_DIGRHDRAW_FORMVIEW};
∙//NOTE:
theClassWizardwilladddatamembershere
∙//}}AFX_DATA
∙
∙//Attributes
∙public:
∙
∙//Operations
∙public:
∙voidDrawFloyd(CDC*pDC);
∙//画出弗洛伊德算法的结果
∙voidFloyd();
∙voidSetEdgeWeightHand();
∙//手动设置权值
∙voidDelEdgesHand();
∙//手动删除边
∙voidAddEdgesHand();
∙//手动添边
∙voidMovVertsHand();
∙BOOLm_Capture;
∙voidDelVertsHand();
∙//手动删除顶点
∙voidAddVertsHand();
∙//手动添加顶点
∙voidCreateDGHand();
∙//手动创建有向图
∙voidCreateDGRandom();
∙//自动创建有向图
∙voidComputeFloyd();
∙CGraph