图形数据结构
- 格式:doc
- 大小:99.00 KB
- 文档页数:13
SVG是一种使用XML格式定义图形的数据结构。
它提供了三种类型的图形对象:矢量图形(例如由直线和曲线组成的路径)、图像和文本。
这些图形对象可以进行分组、添加样式、变换、组合等操作,并且具有嵌套变换、剪切路径、alpha蒙板、滤镜效果、模板对象和其他扩展等特性。
SVG格式的数据结构主要包括:
1.元素:SVG中的所有内容都是XML元素,每个元素都可以被视为
一个对象,具有属性、子元素和文本内容等。
2.属性:SVG元素的属性定义了元素的外观、行为和布局。
例如,
颜色、形状、尺寸、位置等。
3.图形对象:SVG提供了多种图形对象,如线段、曲线、圆形、矩
形等。
这些对象可以通过组合、变换和样式设置等方式进行操作。
4.层和组:SVG中的图形对象可以按照层或组进行组织和管理。
层
和组可以帮助组织和控制图形的层次结构和可见性。
5.文本和字体:SVG支持文本和字体,可以在图形中添加文本内容,
并设置字体样式。
6.图像和链接:SVG可以嵌入图像并创建超链接,以便与其他网页
或资源进行交互。
⼋、基本数据结构(图形结构)⼀、理解 “图”图(Graph)。
和树⽐起来,这是⼀种更加复杂的⾮线性表结构。
树中的元素称为节点,图中的元素叫作顶点(vertex)。
如下图所⽰,图中的⼀个顶点可以与任意其他顶点建⽴连接关系。
这种建⽴的关系叫作边(edge)。
举个例⼦微信:⽐如在微信中可以把每个⽤户看作⼀个顶点。
如果两个⽤户之间互加好友,那就在两者之间建⽴⼀条边。
所以,整个微信的好友关系就可以⽤⼀张图来表⽰。
其中,每个⽤户有多少个好友,对应到图中,就叫作顶点的度(degree),就是跟顶点相连接的边的条数。
微博:微博的社交关系跟微信有点不⼀样,或者说更加复杂⼀点。
微博允许单向关注,也就是说,⽤户 A 关注了⽤户 B,但⽤户 B 可以不关注⽤户 A。
可以把图结构稍微改造⼀下,引⼊边的“⽅向”的概念。
如果⽤户 A 关注了⽤户 B,就在图中画⼀条从 A 到 B 的带箭头的边,来表⽰边的⽅向。
如果⽤户 A 和⽤户 B 互相关注了,那就画⼀条从 A 指向 B 的边,再画⼀条从 B 指向 A 的边。
把这种边有⽅向的图叫作“有向图”。
以此类推,把边没有⽅向的图叫作“⽆向图”。
⽆向图中有“度”这个概念,表⽰⼀个顶点有多少条边。
在有向图中,把度分为⼊度(In-degree)和出度(Out-degree)。
顶点的⼊度,表⽰有多少条边指向这个顶点;顶点的出度,表⽰有多少条边是以这个顶点为起点指向其他顶点。
对应到微博的例⼦,⼊度就表⽰有多少粉丝,出度就表⽰关注了多少⼈。
QQ:QQ 中的社交关系要更复杂的⼀点。
QQ 不仅记录了⽤户之间的好友关系,还记录了两个⽤户之间的亲密度。
如果两个⽤户经常往来,那亲密度就⽐较⾼;如果不经常往来,亲密度就⽐较低。
要⽤到另⼀种图,带权图(weighted graph)。
在带权图中,每条边都有⼀个权重(weight),可以通过这个权重来表⽰ QQ 好友间的亲密度。
⼆、邻接矩阵存储⽅法图最直观的⼀种存储⽅法就是,邻接矩阵(Adjacency Matrix)。
数据结构的四种基本类型一、引言数据结构是计算机科学中的重要基础概念,它是指数据对象以及它们之间的关系,以及在这些对象上执行的操作。
数据结构可以分为四种基本类型,包括线性结构、树形结构、图形结构和集合结构。
本文将详细介绍这四种基本类型的定义、特点和应用。
二、线性结构1.定义:线性结构是一组有序的数据元素,每个元素最多只有一个前驱和一个后继。
2.特点:线性表中的元素之间存在一对一的关系,即除了第一个和最后一个元素外,其他元素都有且仅有一个前驱和后继。
3.应用:常见的线性结构包括数组、链表、栈和队列。
其中数组适用于需要频繁访问某个位置上的元素;链表适用于插入和删除操作频繁的场景;栈适用于需要实现先进后出(LIFO)策略的场景;队列适用于需要实现先进先出(FIFO)策略的场景。
三、树形结构1.定义:树形结构是一组非线性数据元素,由若干个节点组成,节点之间存在一对多或多对多的关系。
2.特点:树形结构中的节点之间存在一对多或多对多的关系,其中只有根节点没有父节点,而其他节点都有且仅有一个父节点。
3.应用:常见的树形结构包括二叉树、平衡树和B+树。
其中二叉树适用于需要快速查找某个元素的场景;平衡树适用于需要维护数据平衡性的场景;B+树适用于需要支持高效范围查询和排序的场景。
四、图形结构1.定义:图形结构是一组非线性数据元素,由若干个顶点和边组成,顶点之间可以存在多个连接关系。
2.特点:图形结构中的顶点之间可以存在多个连接关系,其中边表示两个顶点之间的连通关系。
3.应用:常见的图形结构包括有向图、无向图和带权图。
其中有向图适用于描述某些行为或事件发生先后顺序的场景;无向图适用于描述某些物品或概念之间相互关联的场景;带权图适用于需要考虑权重因素影响的场景。
五、集合结构1.定义:集合结构是一组无序数据元素,每个元素都是唯一的。
2.特点:集合结构中的元素之间没有任何顺序关系,且每个元素都是唯一的。
3.应用:常见的集合结构包括哈希表和布隆过滤器。
计算机数据结构八股文计算机数据结构是一门重要的计算机科学基础课程,在计算机专业的学习过程中占据着重要的地位。
学习数据结构不仅能够提高程序设计能力,还能够帮助我们更好地理解计算机科学的其他领域,比如算法设计、操作系统、数据库等。
在学习数据结构的过程中,我们需要掌握一些基本的概念和常用的算法,下面是八股文的内容:一、数据结构的概念数据结构是指数据元素之间的关系和它们的存储方式。
常见的数据结构包括数组、链表、栈、队列、树、图等。
数据结构的选择和设计直接影响程序的运行效率和空间利用率。
二、线性数据结构线性数据结构是指数据元素之间存在一对一的关系,也就是元素之间只有前驱和后继两个方向。
常见的线性数据结构包括数组、链表、栈、队列等。
三、树形数据结构树形数据结构是指数据元素之间存在一对多的关系,也就是一个节点可以有多个子节点。
常见的树形数据结构包括二叉树、平衡树、B树、B+树等。
四、图形数据结构图形数据结构是指数据元素之间存在多对多的关系,也就是一个节点可以有多个相邻节点。
常见的图形数据结构包括邻接矩阵、邻接表、深度优先搜索、广度优先搜索等。
五、排序算法排序算法是数据结构中的重要内容。
常见的排序算法包括插入排序、选择排序、冒泡排序、快速排序、归并排序等。
选择合适的排序算法可以提高程序的运行效率。
六、查找算法查找算法是数据结构中的另一个重要内容。
常见的查找算法包括顺序查找、二分查找、哈希查找等。
选择合适的查找算法可以提高程序的查询效率。
七、动态规划动态规划是一种常用的算法设计技巧,可以用来解决多阶段决策问题。
常见的动态规划问题包括背包问题、最长公共子序列问题、最短路径问题等。
八、高级数据结构高级数据结构是指在常见数据结构的基础上进行扩展,以解决一些特殊的问题。
常见的高级数据结构包括红黑树、区间树、线段树等。
以上就是计算机数据结构八股文的内容,希望对大家的学习有所帮助。
俄罗斯方块图形数据结构处理用一个二维数据来进行处理,数据里的元素是每一个格子的标志位。
数据结构保存在图形工厂中,是一个三维数组,TYPE来取出二维数组。
每一个具体的图形是一个一维数组,在二维数组变量中由状态变量来取出。
所以定义了二维数组和状态变量。
由SET方法获得。
具体代码有如下一些:、Private int body[][]Private int statusPrivate int shapes[][][]Private int typesetBody(){} setStatus(){}俄罗斯方块图形移动用left来表示离左边界的距离用top来表示离上边办的距离向左移动就是left-1向右移动就是left+1向下移动就是top+1旋转就是改变状态status如何画俄罗斯方块图形每一个方块是一个4*4的方阵,由x 来表示行号,由y来表示列号画小方块需要四个参数,小方块的位置坐标和宽度与高度。
方块中的小方块画与不画由标志来决定宽度和高度由一个常量来表示CELL_SIZE由颜色来控制显示的拖影由填充矩形来控制显示的拖影由getFlagByPoint(int x, int y)方法来得到标志位是否为1按键不管用是需要在测试类中为框架添加监听器。
如何决定是否能够移动需要在ground 中来进行确定决定宽度和高度图形来作动作(有四个动作,向左,向右,向下,旋转,用常量来表示)需要位置信息getLeft() getTop()在ground类中定义isMoveable(shape,action)方法isMember(int x,int y,Boolean rotate)在控制类里面进行判断,来确定是否作下一步工作。
图形自行下落的确定在图形接口中来确定如果不能下落了,就需要变成一个障碍物,同时产生一个新图形如何变成障碍物定义一个数组obstacles[][]将对应的位置变成障碍物对应的如何显示与上一样。
判断是不是障碍物的判断。
有向无环图有向无环图(DAG)是一种重要的图形数据结构,在计算机科学、网络和算法分析等领域中都有广泛的应用。
它与普通无向图有所不同,因为它会在连接时增加一个方向,这就意味着它可以表示有序的数据。
有向无环图被广泛应用于计算机科学领域,比如拓扑排序、分布式处理、编译器设计等等。
概念有向无环图是由一些顶点和一些有序的边组成,它将数据结构中的每个顶点连接起来。
每条边都有一个方向,这就决定了图中的有序性,也决定了如何遍历图中的每个顶点。
它只有在没有重复出现的边时,才能保证从一个顶点开始,能够遍历到整个图中的每个顶点。
另外一个特点是,它不能有环,也就是说,从一个顶点出发,不能回到该顶点本身。
拓扑排序有向无环图是一种很强大的数据结构,它可以用来实现拓扑排序(Topological Sorting)。
拓扑排序是一种重要的技术,可以根据有向边的方向,对顶点进行排序,以便给定时序性任务分配排序方式。
比如,在建筑工程中,需要用到拓扑排序,比如地基建完再搭框架,搭框架后再安装门窗等等。
拓扑排序能保证输出的顺序和输入的顺序一致,也可以用于求解最短路径问题,比如求解从一个城市到另外一个城市的最短路径。
分布式处理有向无环图也可以用来实现分布式处理(Distributed Processing),它可以把任务分解成一些独立的子任务,然后把它们连接起来,形成有向无环图,这样每一个子任务可以在不同的处理器上完成。
分布式处理可以使用有向无环图的拓扑排序算法,实现对任务的排序,从而保证任务的正确执行。
同时,由于它不存在环路,因此也可以保证它是安全的,不会出现死锁的情况,这样也就可以保证流程的有序性。
编译器设计有向无环图也可以用于编译器设计(Compiler Design)。
编译器是计算机科学中一种重要的应用,它可以把高级语言翻译成机器语言,从而可以让计算机处理高级语言编写的程序。
有向无环图可以用来构建编译器,因为它可以实现对语句的排序,这样可以保证编译器在编译过程中符合语法规则,并且能够正确翻译,从而使程序能够正确执行。
图形结构是计算机科学中一种重要的数据结构,它通过节点和边的组合来描述对象之间的关系。
在计算机科学中,图形结构被广泛应用于各种领域,例如社交网络分析、路由算法、信息检索和图像处理等。
本文将介绍图形结构的基本概念和常见算法,以加深读者对图形结构的理解。
一、图形结构的定义和基本概念图形结构由节点和边组成,节点表示对象,边表示节点之间的关系。
图形结构可以用来描述许多实际问题,例如社交网络中的用户和关注关系,地图中的城市和道路连接关系等。
在图形结构中,节点和边可以有不同的属性,例如节点可以表示人的姓名、年龄等,边可以表示两个人之间的关系类型。
图形结构可以分为有向图和无向图两种类型。
有向图中的边有方向,表示节点之间的单向关系;而无向图中的边没有方向,表示节点之间的双向关系。
有向图和无向图都可以用邻接矩阵或邻接表来表示。
在邻接矩阵中,使用一个二维数组来表示节点之间的连接关系;而在邻接表中,使用链表来表示。
二、图形结构的常见算法 1. 广度优先搜索(BFS) 广度优先搜索是一种用于遍历图形结构的算法,它从起始节点开始,逐层遍历图形结构,直到找到目标节点或遍历完所有节点。
广度优先搜索使用队列数据结构来存储遍历的节点,每次从队列中取出一个节点,并将与之相邻的未访问节点加入队列。
广度优先搜索可以用于查找最短路径、寻找连通分量等问题。
2.深度优先搜索(DFS) 深度优先搜索是一种用于遍历图形结构的算法,它从起始节点开始,沿着一个路径一直遍历到无法再继续下去为止,然后回溯到上一个节点,继续遍历其他路径。
深度优先搜索使用栈数据结构来存储遍历的节点,每次从栈中取出一个节点,并将与之相邻的未访问节点加入栈。
深度优先搜索可以用于拓扑排序、生成迷宫等问题。
3.最小生成树最小生成树是指一个连通图的一棵生成树,它的所有边的权值之和最小。
最小生成树算法可以用于解决网络设计、电路布线等问题。
常见的最小生成树算法有Prim算法和Kruskal算法。
几种常见的数据结构数据结构是计算机科学中一种组织和存储数据的方式,常用于解决不同类型的问题。
几种常见的数据结构包括线性数据结构、树形数据结构、图形数据结构和哈希表等。
一、线性数据结构:线性数据结构是一种按照顺序排列的数据结构,其中数据元素之间存在一对一的关系。
常见的线性数据结构有数组、链表、栈和队列等。
1.数组:数组是一种连续的内存块,可用于存储相同类型的数据元素。
它具有随机访问的优点,但插入和删除元素的效率较低。
2.链表:链表由节点组成,每个节点包含数据和指向下一个节点的指针。
链表可以分为单向链表、双向链表和循环链表,插入和删除元素的效率较高,但访问元素的效率较低。
3. 栈:栈是一种后进先出(LIFO)的数据结构,只允许在栈的顶部进行插入和删除操作。
常用的栈操作有push(入栈)和pop(出栈)。
4. 队列:队列是一种先进先出(FIFO)的数据结构,插入操作在队尾进行,删除操作在队头进行。
常用的队列操作有enqueue(入队)和dequeue(出队)。
二、树形数据结构:树形数据结构是一种非线性的数据结构,它由节点和边组成,用于表示具有层级关系的数据。
常见的树形数据结构有二叉树、堆和树等。
1.二叉树:二叉树是一种每个节点最多有两个子节点的树形数据结构。
它可分为二叉树、平衡二叉树和红黑树等形式,常用于进行高效和排序操作。
2.堆:堆是一种用于实现优先队列的数据结构,它是一个完全二叉树,每个节点的值都大于或小于其子节点的值。
最大堆和最小堆是常见的堆的实现方式。
3.树:树是一种层次结构的数据结构,它由一个根节点和零个或多个子树组成。
树形数据结构常用于构建层级关系,如文件系统和组织结构等。
三、图形数据结构:图形数据结构是一种由节点和边组成的非线性数据结构,用于表示多对多的关系。
常见的图形数据结构有有向图和无向图等。
1.有向图:有向图中的边具有方向性,常用于表示有向关系,如网页链接和任务依赖等。
2.无向图:无向图中的边没有方向性,常用于表示无向关系,如社交网络中的好友关系。
计算机图形学图形的表示与数据结构在当今数字化的时代,计算机图形学扮演着至关重要的角色。
从我们日常使用的手机应用中的精美界面,到好莱坞大片中令人惊叹的特效场景,计算机图形学的应用无处不在。
而要实现这些精彩的图形效果,首先需要解决的就是图形的表示与数据结构问题。
什么是图形的表示呢?简单来说,就是如何用计算机能够理解和处理的方式来描述图形。
这就好比我们想要给别人介绍一个物体,需要用恰当的语言和方式来描述它的形状、颜色、大小等特征。
对于计算机来说,它需要一种精确、高效的方式来存储和处理图形信息。
常见的图形表示方法有两种:矢量图形和光栅图形。
矢量图形就像是用数学公式来描述图形。
比如说,一个圆形可以用圆心的坐标和半径来表示,一条直线可以用起点和终点的坐标来确定。
这种表示方法的优点是无论图形放大或缩小多少倍,都不会出现失真的情况,因为图形的形状是通过数学公式计算出来的。
常见的矢量图形格式有 SVG(可缩放矢量图形)、EPS(封装的 PostScript)等。
矢量图形常用于需要高质量输出的场合,比如标志设计、插图绘制等。
而光栅图形则是将图形分割成一个个的像素点,每个像素点都有自己的颜色和亮度值。
我们常见的图片格式如 JPEG、PNG 等都属于光栅图形。
光栅图形的优点是能够表示非常复杂的图像,比如照片。
但缺点是在放大时会出现锯齿状的边缘,也就是我们常说的“像素化”。
在计算机图形学中,选择合适的图形表示方法取决于具体的应用场景。
如果需要对图形进行频繁的缩放、旋转等操作,并且对图形的质量要求较高,那么矢量图形可能是更好的选择。
但如果要处理真实世界的图像,比如照片,那么光栅图形则更为合适。
接下来,让我们来谈谈图形的数据结构。
数据结构就像是图形在计算机中的“家”,它决定了图形信息如何被组织和存储,从而影响着图形处理的效率和效果。
在计算机图形学中,常见的数据结构有链表、数组、树等。
链表是一种灵活的数据结构,可以方便地添加或删除元素。
CAD中常用数据结构在计算机辅助设计(CAD)领域,数据结构的选择和应用对于软件的性能、功能和用户体验都有着至关重要的影响。
CAD 系统需要处理大量的几何图形、属性信息以及各种操作命令,因此,合理的数据结构能够提高数据存储和处理的效率,从而使 CAD 软件更加高效和稳定。
接下来,让我们一起了解一下 CAD 中常用的数据结构。
链表是 CAD 中常见的数据结构之一。
链表由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
在 CAD 中,链表可以用于动态地存储和管理对象的信息。
例如,当用户在绘图过程中不断添加或删除图形元素时,链表可以方便地进行插入和删除操作,而不需要像数组那样移动大量的数据。
此外,链表还可以用于实现一些复杂的数据结构,如双向链表和循环链表,以满足不同的应用需求。
数组也是 CAD 中常用的数据结构。
数组是一种线性的数据结构,它将相同类型的元素存储在连续的内存空间中。
在 CAD 中,数组可以用于存储固定大小的数据集,例如图形的顶点坐标、颜色值等。
由于数组可以通过索引直接访问元素,因此其访问速度非常快。
但是,数组的大小在创建时就已经确定,如果需要动态地改变数组的大小,就需要进行复杂的内存操作。
栈和队列在 CAD 中也有着重要的应用。
栈是一种先进后出的数据结构,而队列是一种先进先出的数据结构。
在 CAD 中,栈可以用于保存操作的历史记录,以便进行撤销和恢复操作。
当用户执行一系列操作后,如果想要撤销之前的操作,就可以从栈中弹出最近的操作并进行反向处理。
队列则可以用于处理图形元素的绘制顺序,例如按照先入先出的原则依次绘制图形,以保证图形的显示顺序正确。
树结构在 CAD 中也经常被使用。
二叉树是一种特殊的树结构,它的每个节点最多有两个子节点。
二叉树可以用于快速地查找、插入和删除数据。
在 CAD 中,二叉树可以用于组织图形对象的层次结构,例如将复杂的图形分解为多个子图形,并通过二叉树来管理它们之间的关系。
淮海工学院计算机科学系实验报告书课程名:《数据结构》题目:图形数据结构实验班级:软件081学号:110831123姓名:XX图形数据结构实验报告要求1目的与要求:1)掌握图的邻接矩阵、邻接表、十字链表、邻接多重链表存储结构表示及其创建算法的c语言实现;2)掌握图的深度优先搜索遍历算法和图的广度优先搜索遍历算法及C语言实现;3)掌握AOV-网普里姆构造最小生成树算法的数据结构和算法实现;4)掌握AOE-网关路经的生成算法和实现;5)按照实验题目要求独立正确地完成实验内容(提交程序清单及相关实验数据与运行结果);6)认真书写实验报告,并按时提交(第12周周一提交)。
2 实验内容或题目题目:一、图形数据结构实验——图的建立与遍历。
内容:1)使用邻接矩阵和邻接表储表示分别实现如下给定的图1和或图2所示图的物理存储结构。
2)在1)所建立的图形存储结构上分别实现深度优先搜索遍历和广度优先搜索遍历,并给出遍历结果(序列)。
题目:二、连通网的最小生成树及其应用实验(选做)内容:对下图所示通信连通网,按照普里姆算法实现其最小生成树。
V1v6v5v4v3V26513566425例2 有向图3 实验步骤与源程序#include <stdio.h>#include <stdlib.h>#include <string.h>#include<conio.h>#include<math.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define NULL 0#define MAX_VErR_NUM 10#define QueueSize 30/*邻接矩阵存储表示定义*/typedef enum{False,True}Boolean;Boolean visited[MAX_VErR_NUM ];typedef char VertexType;typedef int EdgeType;typedef struct{VertexType vexs[MAX_VErR_NUM ]; //顶点表EdgeType arcs[MAX_VErR_NUM ][MAX_VErR_NUM ]; //邻接矩阵,可看做边表 int n,e; //图中当前的顶点数和边数}MGraph;/*邻接表定义*/typedef struct Node{int elem;struct Node *next;}Node,*QNode;typedef struct{QNode front;QNode rear;}Queue;typedef struct ArcNode /*头节点*/{int adjvex; /*该边所指向的顶点的位置*/struct ArcNode *nextarc; /*指向下一条边*/}ArcNode;typedef struct VNode /*表节点*/{int data; /*顶点信息*/ArcNode *firstarc; /*指向第一条依附该节点的边的指针*/}VNode,AdjList[MAX_VErR_NUM ];typedef struct{AdjList vertices; /*表节点*/int vexnum; /*节点的个数*/int arcnum; /*边的条数*/}Graph;int Visited[MAX_VErR_NUM ];/* 邻接矩阵的存储*/void CreateMGraph(MGraph *G){int i,j,k;VertexType ch1,ch2;printf("输入顶点数和边数(中间以空格隔开):\n");fflush(stdin);scanf("%d%d",&(G->n),&(G->e));printf("输入顶点号每个顶点以空格作为结束:\n");for(i=0;i<G->n;i++){getchar();scanf("%c",&(G->vexs[i]));}for(i=0;i<G->n;i++)for(j=0;j<G->n;j++)G->arcs[i][j]=0;printf("请输入每条边对应的两个顶点的序号(输入格式为:i,j):\n"); for(k=0;k<G->e;k++){printf("请输入第%d条边的顶点序号:",k+1);fflush(stdin);scanf("%c,%c",&ch1,&ch2);for(i=0;ch1!=G->vexs[i];i++);for(j=0;ch2!=G->vexs[j];j++);G->arcs[i][j]=1;}}/*邻接矩阵的深度优先遍历搜索*/void DFSM(MGraph *G,int i){int j;printf("v%c ",G->vexs[i]);visited[i]=True;for(j=0;j<G->n;j++) //依次搜索vi邻接点if(G->arcs[i][j]==1 && !visited[j])DFSM(G,j);}void DFSTraverseM(MGraph *G){int i;for(i=0;i<G->n;i++)visited[i]=False;for(i=0;i<G->n;i++)if(!visited[i])DFSM(G,i);}/* 邻接矩阵的广度优先遍历搜索*/ typedef struct{int front;int rear;int count;int data[QueueSize];}CirQueue;void InitQueue(CirQueue *Q){Q->front=Q->rear=0;Q->count=0;}int QueueEmpty(CirQueue *Q){return Q->count=QueueSize;}int QueueFull(CirQueue *Q){return Q->count==QueueSize;}void EnQueue(CirQueue *Q,int x){if (QueueFull(Q))printf("Queue overflow");else{Q->count++;Q->data[Q->rear]=x;Q->rear=(Q->rear+1)%QueueSize;}}int DeQueue(CirQueue *Q){int temp;if(QueueEmpty(Q)){printf("Queue underflow");return NULL;}else{temp=Q->data[Q->front];Q->count--;Q->front=(Q->front+1)%QueueSize;return temp;}}void BFSM(MGraph *G,int k){int i,j;CirQueue Q;InitQueue(&Q);printf("v%c ",G->vexs[k]);visited[k]=True;EnQueue(&Q,k);while (!QueueEmpty(&Q)){i=DeQueue(&Q);for (j=0;j<G->n;j++)if(G->arcs[i][j]==1&&!visited[j]){printf("广度优先遍历结点:%c\n",G->vexs[j]); visited[j]=True;EnQueue(&Q,j);}}}void BFSTraverseM(MGraph *G){int i;for (i=0;i<G->n;i++)visited[i]=False;for (i=0;i<G->n;i++)if (!visited[i])BFSM(G,i);}/*邻接表*/void InitQueue(Queue *Q) /*初始化操作*/{Q->front=Q->rear=(QNode)malloc(sizeof(Node));if(!Q->front) exit(OVERFLOW);Q->front->next=NULL;}void EnQueue(Queue *Q,int e) /*进队操作*/{QNode p=(QNode)malloc(sizeof(Node));if(!p) exit(OVERFLOW);p->elem=e;p->next=NULL;Q->rear->next=p;Q->rear=p;}void DeQueue(Queue *Q,int *e) /*出队操作*/{QNode p;p=Q->front->next;Q->front->next=p->next;if(Q->rear==p)Q->rear=Q->front;*e=p->elem;free(p);}int QueueEmpty(Queue Q){if(Q.rear==Q.front) return TRUE;else return -1;}int LocateVex(Graph *G,int v) /*返回节点v在图中的位置*/{int i;for(i=0;i<G->vexnum;++i)if(G->vertices[i].data==v) break;else continue;if(i<G->vexnum) return i;else return 0;}/*邻接表创建*/void CreateGraph(Graph *G){int m,n,i,j,k,v1,v2,flag=0;ArcNode *p1,*q1,*p,*q;printf("请输入有向图的顶点数目: ");scanf("%d",&m);printf("请输入有向图的边的数目: ");scanf("%d",&n);G->vexnum=m; /*顶点数目*/G->arcnum=n; /*边的数目*/for(i=0;i<G->vexnum;++i){G->vertices[i].data=i+1; /*顶点信息*/G->vertices[i].firstarc=NULL;}for(k=0;k<G->arcnum;++k){printf("请输入第 %d 条边的起点和终点(中间以空格隔开): ",k+1);scanf("%d%d",&v1,&v2);i=LocateVex(G,v1);j=LocateVex(G,v2);if(i>=0&&j>=0){++flag;p=(ArcNode *)malloc(sizeof(ArcNode));p->adjvex=j;p->nextarc=NULL;if(!G->vertices[i].firstarc) G->vertices[i].firstarc=p;else{for(p1=G->vertices[i].firstarc;p1->nextarc;p1=p1->nextarc); p1->nextarc=p;}q=(ArcNode *)malloc(sizeof(ArcNode));q->adjvex=i;q->nextarc=NULL;if(!G->vertices[j].firstarc) G->vertices[j].firstarc=q;else{for(q1=G->vertices[j].firstarc;q1->nextarc;q1=q1->nextarc); q1->nextarc=q;}}else{printf("Not hava this edge!\n");k=flag;}}}int FirstAdjVex(Graph G,int v)/*返回v的第一个邻接顶点*/{if(G.vertices[v].firstarc)return G.vertices[v].firstarc->adjvex;elsereturn -1;}int NextAdjVex(Graph G,int v,int w)/*返回v中相对于w的下一个邻接顶点*/ {int flag=0;ArcNode *p;p=G.vertices[v].firstarc;while(p){if(p->adjvex==w){flag=1;break;}p=p->nextarc;}if(flag && p->nextarc)return p->nextarc->adjvex;elsereturn -1;}/*邻接表深度优先遍历*/void DFS(Graph G,int v){int w;Visited[v]=TRUE;printf("v%d ",G.vertices[v].data);for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))if(!Visited[w]) DFS(G,w);}void DFSTraverse(Graph G){int v;for(v=0;v<G.vexnum;++v)Visited[v]=FALSE;for(v=0;v<G.vexnum;++v)if(!Visited[v]) DFS(G,v);}/*邻接表广度优先遍历*/void BFSTraverse(Graph G)/*广度优先遍历*/{int v,v1,w;Queue q;for(v=0;v<G.vexnum;++v)Visited[v]=FALSE;InitQueue(&q);for(v=0;v<G.vexnum;++v)if(!Visited[v]){Visited[v]=TRUE;printf("v%d ",G.vertices[v].data);EnQueue(&q,v); /*第一个顶点入队*/while(!QueueEmpty(q)){DeQueue(&q,&v1); /*第一个顶点出对*/for(w=FirstAdjVex(G,v1);w>=0;w=NextAdjVex(G,v1,w))if(!Visited[w]){Visited[w]=TRUE;printf("v%d ",G.vertices[w].data);EnQueue(&q,w);}}}}void main(){int a,flag=1;MGraph G;Graph g;char ch;printf("1 对邻接矩阵进行深度优先遍历与广度优先遍历 \n2 对邻接表进行深度优先遍历与广度优先遍历 \n3 退出 \n");while(flag){printf("请选择:");scanf("%d",&a);switch(a){case 1:CreateMGraph(&G);printf("深度优先遍历结点: ");DFSTraverseM(&G);printf("\n");printf("广度优先遍历结点:");BFSTraverseM(&G);printf("\n");break;case 2:CreateGraph(&g);printf("深度优先搜索为:\n");DFSTraverse(g);printf("\n");printf("广度优先搜索为:\n");BFSTraverse(g);printf("\n");break;case 3:flag=0;break;}}}4 测试数据与实验结果(可以抓图粘贴)邻接矩阵的深度与广度遍历并输出,如下图输出结果:邻接表的深度与广度遍历,输出结果如下图所示:5 结果分析与实验体会这次的实验说实话比前几次难点,特别是邻接表的遍历会应用到前面所学到的队列,就明显增加了难度,并且图中所涉及的语句比较难理解,幸好老师让我们上机讲了一遍,不然自己真不知道从哪里入手,也对程序了解了点。