当前位置:文档之家› 图的遍历动态演示

图的遍历动态演示

图的遍历动态演示程序摘要:图是一种复杂的数据结构,具有较高的学习难度。

本文讲述了对图的动态演示程序的操作和程序的具体实现过程,使得我们对图的认识更深刻,学习更容易。

本软件以Visual Studio 2008作为开发工具,使用邻接表法,用MFC类库实现了对图的可视化创建和图的遍历的动态演示。

本文首先讲解了图的遍历动态演示程序的实现框架和设计思路,然后深入讲解了对图中结点和弧的创建、插入和删除,最后着重讲解了图的深度优先遍历和广度优先遍历动态演示的具体实现。

关键词:图; 遍历; 动态演示The dynamic demonstrative program of traverse graph Abstract:Graph is a complex data structure, which is hard to learn. This thesis tells people the manipulate of the dynamic demonstrate of traverse graph and the specific realization progress of the program. This study give us a deeper understanding of graph, as well as make it easier to learn it. This software realizes the visual creation of graph and the dynamic demonstration of traverse graph by using adjacent table, MFC library and Visual Studio 2008. This thesis firstly explains the realization of the dynamic demonstrate of traverse graph program, the go into the depth of the creation, insertion, deleting of node and arc, at last explains emphatically the actual realization of the Depth-First traverse of graph and the Breadth-First traverse of graph.Key Words:graph, traverse, dynamic demonstrative目录1 引言 (1)1.1 开发背景 (1)1.2 开发的目的以及意义 (1)2 需求分析 (1)2.1 功能概述 (1)2.2 功能需求分析 (2)2.2.1 结点的操作 (2)2.2.2 弧的操作 (2)2.2.3 自动生成图的支持 (2)2.2.4 支持图的销毁 (3)2.2.5 图的遍历类型 (3)2.2.6 图的存储结构 (3)2.2.7 图的遍历代码 (3)2.2.8 支持图的遍历次序显示和中间辅助队列的进出队情况显示 (3)2.2.9 支持对遍历速度的设置 (3)2.2.10 支持暂停和单步 (3)2.2.11 支持对图的实现代码的查看和运行 (4)2.2.12 支持对版本和帮助的显示 (4)3 总体设计 (4)3.1 程序框架的搭建 (4)3.1.1 工程项目的创建 (4)3.1.2 窗口的显示 (4)3.2 菜单的制作 (6)3.2.1 创建图 (6)3.2.2 设置演示速度 (8)3.2.3 查看源代码的实现 (8)3.2.4 运行此程序菜单的实现 (9)3.2.5 打开此文件菜单和帮助菜单的实现 (10)3.2.5 版本菜单的实现 (10)3.2.6 退出菜单功能的实现 (10)3.3图的创建和遍历核心算法的设计与实现 (10)3.3.1 算法的设计 (10)3.3.2 核心算法的实现 (16)4 测试与总结 (28)谢辞 (29)参考文献 (30)1 引言在纷繁复杂的社会生活中,很多东西都涉及到图的应用问题。

最早的图的应用可以追溯到18世纪伟大的数学家欧拉用图解决了著名的哥尼斯堡桥问题。

目前,图的应用已经渗透到诸如电子线路分析、寻找最短路径、工程计划分析、人工智能、信息检索等领域。

而图的遍历是运用图解决问题必须掌握的知识。

1.1 开发背景社会生活中很多问题都涉及到“图”的知识,这些问题一般都比较复杂,比较难以解决,要解决这些问题,对“图”的学习是必须的。

但目前对于“图”知识的讲解用得最多的是ppt演示,而ppt只能演示已经设计好的“图”,灵活性差,而且这些ppt的制作过程都比较繁琐。

因此,设计一个能创建动态图,并且可以演示其遍历的软件非常重要。

本次毕业设计我用MFC开发一个图的遍历动态演示程序,希望能让初学者能够更好、更容易地掌握图的知识。

1.2 开发的目的以及意义为了让初学者更轻松地掌握“图”的知识,有必要进行本次毕业设计。

本次的毕业设计是将书本上所学的理论知识与实际相结合,是对所学知识的一种检查,是对动手能力的一种锻炼,同时也是从学习走向真正开发的一个过渡,希望通过本次的毕业设计使自己在程序的开发和设计上有新的认识并能有所提高。

2 需求分析2.1 功能概述首先是对图类型的选择,图的类型分为有向图和无向图。

其次是图的创建和销毁。

图的创建包括对图结点和弧的添加、插入和删除,其中添加和插入可以和成一个功能,都是增加数据信息。

这些功能的实现还必须在图形界面上显示出来,且用户能够方便地进行操作。

最后就是图的遍历。

图的遍历分为深度优先遍历和广度优先遍历,选择不同的遍历方式运行时,根据代码的执行步骤及时的在界面上反应遍历到哪个结点和图存储结构上的动态显示。

这里代码显示、图存储结构的显示和图的显示要同步起来。

对于遍历时速度也需要进行设置。

对于整个图的创建、遍历、销毁的代码实现,应该能够显示给用户看,而且还应该可以让用户感受一下该代码的运行效果。

2.2 功能需求分析2.2.1 结点的操作结点用圆和圆上的字符来表示,圆上的字符表示结点的名称。

当选择创建结点,在绘图区域点击鼠标的时候,在绘图区域绘制一个结点,并且在图的数据结构中添加一个结点,还要保存结点的位置。

结点在创建的时候应该保证其名称的唯一性。

当选择删除结点,在绘图区点击一个结点的时候,首先要检测鼠标点击位置是否有结点,如果有,则把保存该结点位置的信息以及和该结点相关的弧的位置信息删掉,并且把该结点从图的数据结构中删除,然后重绘一下图。

如果没有,则不做任何操作。

2.2.2 弧的操作根据图类型的不同,弧的表示也不同。

如果是有向图,则用一个箭头表示,箭头指向的是弧头,箭头的起始端是弧尾。

如果是无向图,则用一条直线表示。

当选择创建弧,在画图区域点击时,画一条直线或者一个箭头,并且在图的数据结构中添加一条弧,然后将弧的位置保存一下。

弧的创建应该避免重复弧的产生。

当选择删除弧,并且在画图区域点击时,先判断鼠标点击的位置是否存在一条弧,如果存在,则删除图数据结构中的选中的弧,并且删除保存的相应弧的位置信息,然后重绘一下图。

2.2.3 自动生成图的支持有时为了图方便快捷,希望一键创建图,这时应该可以点击一个按钮生成整个图,图的生成就是结点和弧的创建过程,其实现原理和注意事项参照上面的结点的操作和弧的操作中创建结点和创建弧的部分。

2.2.4 支持图的销毁当图的创建不是很满意的时候,可以点击清空按钮将图的结点位置信息和弧的位置信息清空,并且将图的数据结构销毁,然后清空绘图区域。

2.2.5 图的遍历类型图的遍历分为深度优先遍历和广度优先遍历,程序对这两种方式都应该支持。

选择不同的遍历方式,加载不同的初始化信息。

2.2.6 图的存储结构图的遍历动态演示就是要动态地展示图是如何遍历其存储结构的。

图遍历到哪里了,下一步应该访问哪个结点等都应该能准确地显示给用户。

2.2.7 图的遍历代码图在遍历时,应该根据代码一步一步地遍历,动态地展示代码运行到哪里了同样可以比较直观地体现图的遍历的整个流程。

图的动态显示和图存储结构的动态显示应该根据图的代码执行步骤来动态显示。

2.2.8 支持图的遍历次序显示和中间辅助队列的进出队情况显示图在遍历过程中,应显示中间辅助队列的进队和出队的情况。

图遍历完成后还要显示一下遍历结果,也就是这种遍历方式的遍历次序的显示。

2.2.9 支持对遍历速度的设置图的遍历速度不能固定,用户可以根据个人喜好来设置图的遍历速度,以便更好地体验图的遍历的整个过程。

2.2.10 支持暂停和单步当程序在执行遍历的时候,如果想仔细查看当前的各项情况,可以暂停遍历,参看完成之后可以点击运行继续执行,也可以点击单步查看每一步的执行情况。

2.2.11 支持对图的实现代码的查看和运行只看遍历的那部分代码有时候还不够,需要对图的创建等都有相应的了解,这时可以查看图的整个实现代码,并且运行该代码。

2.2.12 支持对版本和帮助的显示如果想查看版本和帮助信息,可以点击相应的菜单项查看。

3 总体设计3.1 程序框架的搭建3.1.1 工程项目的创建利用MFC的应用程序向导创建一个名称为GraphShow的对话框工程项目。

由于涉及到很多绘图的内容,为了避免多次界面重绘带来的闪屏或者界面卡死等可能性问题,这里保持对话框不能调整大小的默认属性。

3.1.2 窗口的显示如图1所示,此窗口的主体是向导帮我们生成的。

首先我们删掉默认生成的一个Static Text控件和两个Button控件,然后向界面中添加三个Static Text控件、一个ListBox控件、两个Radio Button控件和三个Button控件(各个控件的属性如表1所示)。

再者,我们添加一个Menu资源,设置好其中的各项,并把本窗体的Menu 属性设置为刚添加的Menu资源的ID。

这样,我们就把窗体分为了这样几个区域:图的存储结构显示区域、图的显示区域、代码显示区域、遍历结果显示区域、菜单区域和其它按钮区域。

图的存储结构显示区域由一个继承自CStatic类的CDrawLink类来控制,这个类拥有一个ALGraph结构体类型的成员;图的显示区域由CGraphDraw类来控制,这个类也是继承自CStatic;代码显示区域一个CListBox类型的变量关联;遍历结果显示区域由继承自CStatic类的CShowResult类来控制;整个界面由CGraphShowDlg类来管理,它继承自CDialog类,并且拥有一个ALGraph类型的成员。

当按下执行按钮的时候,开启一个线程,这个线程遍历图的同时设置List Box中选中的行、画图中被访问的结点和图存储结构中被访问的结点。

相关主题