中国石油大学数据结构课程设计文档格式.docx
《中国石油大学数据结构课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《中国石油大学数据结构课程设计文档格式.docx(27页珍藏版)》请在冰豆网上搜索。
x,y>
|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();
∙基本数据:
∙voidDrawFloyd(CDC*pDC);
∙voidFloyd();
∙voidTransform();
∙voidInitHand();
∙//有向图的当前顶点数目
∙intvexnum;
∙//有向图的当前边数目
∙intarcnum;
∙//有向图深度优先已经遍历顶点数目
∙intm_nDFSnum;
∙//有向图存储链表
∙CTypedPtrList<
CObList,CGraphVertex*>
m_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
∙//{{AFX_DATA(CDiGraphDraw)
∙enum{IDD=IDD_DIGRHDRAW_FORMVIEW};
∙//NOTE:
theClassWizardwilladddatamembershere
∙//}}AFX_DATA
∙//Attributes
∙//Operations
∙voidDrawFloyd(CDC*pDC);
∙//画出弗洛伊德算法的结果
∙voidSetEdgeWeightHand();
∙//手动设置权值
∙voidDelEdgesHand();
∙//手动删除边
∙voidAddEdgesHand();
∙//手动添边
∙voidMovVertsHand();
∙BOOLm_Capture;
∙voidDelVertsHand();
∙//手动删除顶点
∙voidAddVertsHand();
∙//手动添加顶点
∙voidCreateDGHand();
∙//手动创建有向图
∙voidCreateDGRandom();
∙//自动创建有向图
∙voidComputeFloyd();
∙CGraph