现在的位置: 首页 > 综合 > 正文

2013年09月11日 ⁄ 综合 ⁄ 共 1192字 ⁄ 字号 评论关闭

 

一:图的概念:图是一种更为复杂的数据结构。
在实际的程序设计中数据元素之间存在着三种关系:
1:一种是先行后续的关系,一个数据元素有一个直接前驱和一个直接后继,这种数据结构叫做线性结构;
2:一种是明显的层次关系,每一层的数据元素可能和下一层中的多个数据元素相关,但只和上一层的一个数据元素相关,这种数据的组织结构叫做树。
3:还有一种是数据元素之间存在“一对多”或“多对一”的关系,也就是任意两个元素之间都可以存在着关系,这种数据的组织结构叫图结构。
图:是由顶点的非空集合V(由n>0个顶点)与边的结合E(顶点之间的关系)所构成的。若图G中每一条边都没有方向,则G为无向图。若图G中每一条边都有方向,则G为有向图。

图的存储形式:
1:邻接矩阵存储方法
2:邻接表存储方法
邻接矩阵的存储方法也称为数组存储方法,其核心思想是:用两个数组来存储一个图。这两个数组一个是一维数组,用来存放图的数据。一个是二维数组用来表示图中定点的相互关系。

另一种图的存储形式是利用邻接表对图进行存储。邻接矩阵方法不适合存储稀疏图(边的数目很少的图),可以用邻接表存储这类图。

具体的对于图中的每一个节点分别建立一个链表,如果图中具有n个节点,其邻接点就含有n个线性链表。每个链表前面设置一个头结点称为定点结点

vertex |  next

顶点域vertex 用来存放顶点的数据信息,指针域next指向依附于顶点vertex 的第一条边。通常将一个图的n个顶点节点放到一个统一的数组中进行管理,并且用该数组的下标表示顶点在图中的位置。

而在每一个链表中,链表的每一个结点称为称为边结点,它表示依附于对应的顶点节点的一条边。边结点的结构如图 1-31 所示。

adjvex | weight | next
adjvex 域存放该边的另一端顶点在顶点数组中的位置(数组下标),weight 存放边的权重,对于无权重的图,此项省略;next 是指针域,它将第i个链表中所有边结点连接成一个链表,最后一个边节点的next域为NULL。

邻接表的定义:
前面已经介绍了邻接表的结构特点。一个邻接表是由一个顺序表和一组链表构成。

顺序表中存放图的顶点信息。链表中存放图的边信息。

根据上述对邻接表结构的介绍,可以通过如下的代码定义一个链表。
#define MAX_VERTEX_NUM    20
typedef struct ArcNode{
 int adjvex;// 该边指向的顶点在顺序表中的位置。
 struct ArcNode * next;//下一条边
 infoType * weight;//边上的权重
}ArcNode;

typedef  struct VNode{
 VertexType data; // 顶点中的数据信息。
 ArcNode * firstarc;//指向单链表,即指向第一条边。
}VNode;

VNode G[MAX_VERTEX_NUM];// VNode 类型的数组G,它是图的容器。

抱歉!评论已关闭.