1. 图的定义
图1-图的定义
图形结构是属于复杂的非线性结构,我们来看一下图的定义:
图由顶点的集合和边的集合构成。
图的形式化定义通常表示为:G = ( V , E)
其中G表示一个图
集合V(vertex):表示图G中顶点的有限非空集合,记为V ( G )。
图G中的0,1,2,3,4这几个数据元素称为顶点,对于n个顶点的图,对每个顶点连续编号,即顶点的编号为0 ~ n-1,通过编号唯一确定一个顶点。
集合E(Edge):连接V中两个不同顶点(顶点对)的边的有限集合,记为E ( G ),是图G中边的集合。
2. 有向图和无向图
图2-无向图
在图2中,如果表示边的顶点对是无序的,则称G为无向图,用圆括号序偶表示无向边
。比如在上图中(0,1)表示一条无向边,其实和(1,0)是同一条边。
图3-有向图
如果表示边的顶点对是有序的,则称G为有向图,用尖括号序偶表示有向边
,比如下面的<0 , 1>明确表示是0到1,是有向的。
3. 抽象数据类型——ADT
图4-抽象数据类型
我们从图4中可以知道,这是一个有向图,对于图中的每个节点都有前驱和后继关系,比如:对于节点3来说,它的节点之间的关系有这些:<0,3>,<1,3>,<2,3>,<4,3>,它有多个前驱节点,节点0,1,2,4都是节点3的前驱节点。再比如对于节点1来说,它的节点之间的关系:<1,2>,<1,3>,它也有多个后继节点,节点2,3都是节点1的后继节点。我们可以理解为<i,j>中,i为前驱节点,j为后继节点
。
根据图的数据之间的关系和数据操作,图的抽象数据类型ADT定义如下:
ADT
ADT Graph
{
数据对象:
//ElemType为类型标识符
D = {ai | ai∈ElemType, i=1 , 2 , … , n , n ≧ 0 }
数据关系:
R = {<ai,aj> | ai, aj∈D, i=1,2,…,n, j=1,2,…,n,其中每个元素可以有零个或多个前驱节点,可以有零个或多个后继节点}
数据操作:
(1)初始化图InitGraph(&g):构造一个空的图g
(2)销毁树ClearGraph(&g):释放图g占用的内存空间
(3)DFS(G,v):从顶点v出发,深度优先遍历图g
(4)BFS(G,v):从顶点v出发,广度优先遍历图g
... ...
}