9.2.2邻接表存储方法

来源:互联网 发布:cf手游刷钻软件注册码 编辑:程序博客网 时间:2024/06/04 17:48

图的邻接表存储方法是一种顺序分配与链式分配相结合的存储方法。在邻接表中,对图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点vi的边(对有向图是以顶点vi为尾的弧。)每个单链表上附设一个表头结点。表结点和表头结点的结构如下:



其中,表结点由三个域组成,adjvex指示与顶点vi邻接的点在图中的位置,nextarc指示下一条边或弧的结点,info存储与边或弧相关的信息,如权值等。表头结点由两个域组成,data存储顶点vi的名或其他信息,firstarc指向链表中的第一个结点。

邻接表的特点如下:

  • 邻接表表示不唯一。这是因为在每个顶点对应的单链表中,各边结点的链接次序可以是任意的,取决于建立邻接表的算法以及边的输入次序。
  • 对于有n个顶点和e条边的无向图,其邻接表有n个顶点结点和2e个边结点。显然,对于稀疏图,邻接表比邻接矩阵要节省空间。
  • 对于无向图,邻接表的顶点vi对应的第i个链表的边结点数目正好是顶点vi的度。
  • 对于有向图,邻接表的顶点vi对应的第i个链表的边结点数目仅仅是vi的出度。其入度为邻接表中所有adjvex域值为i的边结点数目。
邻接表存储表示的定义如下:

typedef struct ANode                  /*弧的结点结构类型*/{int adjvex;                       /*该弧的终点位置*/struct ANode *nextarc;            /*指向下一条弧的指针*/InfeType info;                    /*该弧的相关信息*/}ArcNode;typedef struct Vnode                  /*邻接表头结点的类型*/{Vertex data;                      /*顶点信息*/ArcNode *fristarc;                /*指向第一条弧*/}VNode;typedef VNode AdjList[MAXV];          /*AdjList是邻接表类型*/typedef struct        {AdjList adjlist;                  /*邻接表*/int n,e;                          /*图中顶点数n和边数e*/}ALGraph;                             /*图的类型*/


由于在有向图的邻接表中只存放了以一个顶点为起点的弧,所以不易找到指向该顶点的弧。为此,可以设计有向图的逆邻接表。所谓逆邻接表,就是在有向图的邻接表中,对每个顶点,链接的是指向该顶点的弧。





原创粉丝点击