C语言:数据结构-图的存储结构-邻接表

时间:2019-07-09 来源:www.exptablets.com

真钱捕鱼大全

它是图形的表示,其中为图中的每个顶点建立单链接的邻接列表,并且它们的标题指针存储在向量中。为顶点vi建立的单链接的邻接列表称为vi邻接列表。 vi邻接列表中的每个节点用于存储关于以顶点作为端点或起始点的边缘的信息,因此被称为边缘节点。 vi邻接列表中的节点数等于vi的边数,或相邻点或度的数量。对于有向图,它等于vi的边数,或邻居或出的数量。边缘节点通常包含三个字段:一个是相邻点域(adjvex),用于存储顶点vi的相邻顶点vj的序列号j;第二个是重量,用于存储边缘(vi,vj)或右边是第三个;第三个是链字段(下一个),用于链接vi邻接列表中的下一个边缘节点。在这三个域中,相邻的点域和链域是必不可少的,权限域可以根据情况进行交易。如果表示无能力图,则可以省略域。对于每个顶点vi的邻接列表,需要设置标题指针。如果图G中有n个顶点,则有n个标题指针。为了便于随机访问任何顶点的邻接列表,n个标题指针需要存储在向量(即,一维数组)中,其中第i个组件存储vi表的邻接指针。因此,可以通过该头部向量来表示和访问图形G.

对应于图7-1中的G1和图7-5中的G6的邻接列表分别在图7-6(a)和(b)中示出。

ebeffc0abb634fa8b26c05915c576217

f65f96863b4c43098b9c6ae6370f97c2

c1959631da85494f8a241c7a13080abd

d4d7b50682fe452b8405bd2b8c3864d5

图的邻接列表不是唯一的,因为在每个顶点的邻接列表中,边节点的链接的顺序可以任意排列,并且特定的链接顺序与边的输入顺序和生成有关。算法。

以下是对建立图表的邻接列表的相关类型的描述以及用于生成有向图邻接列表的算法描述。

/*定义图形的最大顶点数,它大于或等于特定图形的顶点数n */

#define MaxVertexNum 8

/*定义图形的最大边数,它大于或等于特定图形的边数e */

#define MaxEdgeNum 20

/*定义图中顶点数据的类型VertexType是一个整数*/

Typedef int VertexType;

/*将vexlist定义为用于存储顶点信息的数组类型*/

Typedef VertexType vexlist [MaxVertexNum];

/*在邻接表*/

中定义边节点类型

结构edgenode {

Int adjvex;/*连续点域*/

重量;/*权重字段,假定为整数,可以省略*/

struct edgenode * next;/*指向下一个边缘节点的链域*/

};

/*定义adjlist以存储n个头指针的数组类型*/

Typedef struct edgenode * adjlist [MaxVertexNum];

通过键盘键入Void Create2(vexlist GV,adjlist GL,int n,int e)/*

具有顶点数组GV和邻接表GL */

到非特权边缘的信息

{

Int i,j,k;

/*创建顶点数组*/

Printf('输入%d顶点数据\ n',n);

对于(i=0; i

/*初始化邻接列表,它将清空标题向量中的每个字段*/

对于(i=0; i

/*创建邻接列表*/

Printf('输入%d没有右边\ n',e);

对于(k=1; k <=e; k ++){

结构edgenode * p;

/*输入边*/

Scanf('%d%d',&amp; i,&amp; j);

/*动态地将新节点分配给系统*/

p=malloc(sizeof(struct edgenode));

/*将j的值赋给新节点*/

的相邻点字段

P-&GT; adjvex=j的;

/*将新节点插入vi邻接列表的标题*/

P-&gt;接着=GL [I]; GL [I]=P;

}

}

在图的邻接表中,只要首先从头向量中取出相应的头指针,然后查找,就可以方便地找到顶点的边(外)或相邻点(外边)。从标题指针开始。能够。由于每个顶点单链表的平均长度是e/n(对于有向图)或2 e/n(对于无向图),该查找操作的时间复杂度是O(e/n)。然而,从有向图的邻接列表中找到顶点的边内或边缘相邻点是不方便的。它需要扫描所有顶点邻接表中的边缘节点,因此时间复杂度为O(n)。 + E)。