邻接多重表和邻接表的比较
-
邻接多重表和邻接表都是
链式存储结构
。 -
邻接多重表是对于
无向图
而言,
十字链表对于有向图
而言。
邻接表 有向图和无向图均可以。
二维数组 有向图和无向图均可以。 -
邻接表中每一条边 ( vi , vj ) 都有
两个顶点
,两个顶点结点分别在第 i 个 和 第 j 个链表中,给某些图的操作带来不便。
如在邻接表中,需要对边进行某种操作,对访问过的边做标记或者删除某一条边,此时需要找到同一条边的两个结点。
邻接多重表的结构
-
邻接多重表
与十字链表
类似;
无向图中的每一条边
和每一个顶点
都用一个结点来表示。 -
每一条边用一个结点来表示。包括 6 个域。
mark
: 标志域,可用于标记本条边是否被搜索 / 遍历过。
ivex 和 jvex
:该边依附的两个顶点在图中的位置。(邻接多重表适用于无向图)
ilink
:指向下一条依附于顶点 ivex 的边。
jlink
:指向下一条依附于顶点 jvex 的边。
info
:指向和边相关的各种信息的指针域。 -
每个顶点也用一个结点来表示。包括两个域。
data
:存储和该顶点相关的信息
firstedge
:指示第一条依附于该顶点的边
无向图和它的邻接多重表示例
邻接表多重表代码表示
#define MAX_VERTEX_NUM 20
typedef enum
{
unvisited,
visited
} VisitIf //访问标记
typedef struct EBox
{
VisitIf mark; //访问标记
int ivex, jvex; //依附该边的两个顶点
struct EBox *ilink, *jlink; //指向各自依附这两个顶点的下一条边
InfoType *info; //该边信息指针
} EBox; // 边结点
typedef struct VexBox
{
VertexType data; //存储顶点相关信息
EBox *firstedge; //指向第一条依附于该顶点的边
} VexBox; // 顶点结点
typedef struct
{
VexBox adjmulist[MAX_VERTEX_NUM];
int vexnum, edgenum; //无向图的顶点数和边数
} AMLGraph; //一个无向图的邻接多重表