7.2.2 图的邻接表存储表示

  类似于树的孩子链表,将和同一顶点"相邻接"的所有邻接点链接在一个单链表中,单链表的头指针则和顶点信息一起存储在一个一维数组中。

算法 图的邻接表存储表示
  const MAX_VERTEX_NUM = 20;
  typedef struct ArcNode {    // 弧结点的结构
   int adjvex;          // 该弧所指向的顶点的位置
   struct ArcNode *nextarc;   // 指向下一条弧的指针
   VRType weight;        // 与弧相关的权值,无权则为0
   InfoType *info;        // 指向该弧相关信息的指针
  } ;
  typedef struct VNode {    // 顶点结点的结构
   VertexType data;       // 顶点信息
   ArcNode *firstarc;      // 指向第一条依附该顶点的弧
  } AdjList[MAX_VERTEX_NUM];
  typedef struct {       // 图的邻接表结构定义
   AdjList vertices;      // 顶点数组
   int vexnum, arcnum;     // 图的当前顶点数和弧数
   GraphKind kind;       // 图的种类标志
  } ALGraph;
 
 按下页算法7.1建立的无向图G2
    

 的邻接表如下所示:
  

 依次输入的数据为:
  6 7 AG
  A B C D E F
  AB AE BE BF CD CF DF

  从算法可见,每生成一个弧的结点之后是按在第2章中惯用的"倒插"方法插入到相应顶点的邻接表中的。并且对于无向图,每输入一条边需要生成两个结点,分别插入在这条边的两个顶点的链表中。即无向图的邻接表中弧结点的个数为图中边的数目的两倍。