7.2.4 无向图(网)的邻接多重链表存储表示

  类似于有向图的十字链表,若将无向图中表示同一条边的两个结点合在一起,将得到无向图的另一种表示方法--邻接多重表。

  例如,无向图G2的邻接多重表如下所示(忽略相关信息指针):

 

无向图的邻接多重表存储表示
  const MAX_VERTEX_NUM = 20;
  typedef emnu {unvisited, visited} VisitIf;

  typedef struct EdgeNode{     // 边结点结构定义
   VisitIf mark;          // 访问标记
   int ivex, jvex;         // 该边依附的两个顶点的位置
   struct EdgeNode *ilink, *jlink; // 分别指向依附这两个顶点的下一条边
   VRType weight;          // 与弧相关的权值,无权则为0
   InfoType *info;         // 与该边相关信息的指针
  } ;
  typedef struct {        // 顶点结点结构定义
   VertexType data;
   EdgeNode *firstedge;      // 指向第一条依附该顶点的边
  } VexNode;
  typedef struct {        // 多重链表结构定义
   VexNode adjmulist[MAX_VERTEX_NUM];
   int vexnum, edgenum;      // 无向图的当前顶点数和边数
   GraphKind kind;         // 图的种类标志
  } AMLGraph;

 

  由于无向图的邻接表中每一条边有两个结点,给对图的边进行访问的操作带来不便。以无向图G2为例,当从顶点A出发访问了边(A,E)之后,为了下次不再对这条边进行访问,就需要找到表示这条边的另一个结点加上访问标志。由此可类似于有向图,只用一个结点表示一条边,即将该边的所有信息(边两端的两个顶点、与其中一个端点有相同端点的下一条边的信息等)放在一个结点中,由于无向图中的边是没有方向性的,因此所有有一个端点相同的边均链接在同一链表中,所以在顶点结点中只有一个链表的头指针。另一方面,因为每一条边有两个顶点,因此每个边结点都链接在两个链表中,但它们之间并不形成"十字"关系。