首页 > 编程知识 正文

网的邻接表,邻接表转换为邻接矩阵

时间:2023-05-05 10:54:27 阅读:135470 作者:2547

旁边的桌子

可知图中边的数量相对于顶点较少时,邻接矩阵的存储器空间浪费很大。 考虑在对边或弧线上使用链式存储,避免空间的浪费。 在联想树结构的孩子表示法中,通过将节点收纳到数组中,连锁收纳到节点的孩子中,无论有多少个孩子都不会浪费空间。

应用这一思路,将这种组合排列和链表的存储方法称为邻接表Adjacency List。

旁边桌子的处理方法是这样的。

1 )图中的顶点以一维数组存储。 当然也可以用单链表存储,但使用数组可以更容易地读取顶点信息,很方便。 此外,顶点数组还需要在每个数据元素中存储指向第一个相邻点的指针,以便于找到顶点的边信息。

2 )图中各顶点vi的所有邻接点构成一个线形表,邻接点的数量是不定的,所以用单链表存储。 有向图被称为顶点vi的边表,有向图被称为以vi为弧线的边表。

下图是有向图的邻接表结构。

可以看到,顶点表的每个节点由data和firstedge两个域表示,data是数据域,用于存储顶点信息。

firstedge是指针字段,指向边表中的第一个节点,即此顶点的第一个相邻点。

边缘节点由adjvex和next两个域组成。 adjvex是邻接点区域,存储对某个顶点的邻接点的顶点表的下标,next存储手指

指向边表下一个节点的指针,例如v1顶点和v0、v2相互邻接时,在v1的边表中,adjvex分别为v0的0和v2的2。

如果想知道某个顶点的程度,就去找该顶点边表中的节点数。

为了判断顶点vi和vj是否存在边缘,测试顶点vi的边缘表adjvex中是否存在节点vj的下标即可。

求出顶点的所有邻接点的话,实际上扫描这个顶点的边表,得到的adjvex域对应的顶点就是邻接点。

有向图的邻接表中的顶点vi的边表,作为以vi为弧的末尾的弧被记忆,这样可以很容易地得到每个顶点的曝光度。

为了更好地确定顶点的入度和以顶点为弧首的弧,可能需要创建有向图的逆邻接表。 也就是说,将创建每个顶点vi

链接到vi为弧线头的表。 如下图所示。

此时,能够容易地算出某个顶点的入度或出度为多少,也能够容易地实现判断两个顶点是否具有弧。

在加权网图的情况下,如下图所示,在边缘表的节点定义中再增加一个weight的数据字段,保存权重信息即可。

//节点定义typedef char VertexType; typedef int EdgeType; # definemaxvex 100 typedefstructedgenode//边表节点{ int adjvex; //存储邻接点区域、与邻接顶点对应的下标EdgeType weight; //用于保存权重,在非网图的情况下可以不需要结构节点* next; //链域,指向下一个相邻节点(}EdgeNode; typedef struct VertexNode //顶点表节点{ VertexType data; //顶点字段、存储顶点信息的EdgeNode *firstedge; //边缘标头指针}VertexNode,AdjList[MaxVex]; typedef struct{ AdjList adjList; int numVertexes,numEdges; //图中当前顶点数和边数}GraphAdjList; //无有向图的邻接表结构voidcreatealgraph (graphadjlist * g ) { int i,j,k; EdgeNode *e; printf (输入顶点数和边数:n ); scanf('%d,%d ',G-numVertexes,G-numEdges ); for(I=0; iG-numVertexes; I ) Scanf(g-adjlist[I].data ); //输入顶点信息G-adjList[i].firstedge=NULL; //边表为空表(for ) k=0; kG-numEdges; k ) ({ printf (输入边) vi,vj )上的顶点编号(n ) ); scanf('%d,%d ),I,j ); e=(edgenode* ) malloc (sizeof ) edgenode ); //向存储器申请区域,生成边表节点e-adjvex=j; //相邻编号为j e-next=G-adjList[i].firstedge; G-adjList[i].firstedge=e; //将指向当前顶点的指针指向ee=(edgenode* ) malloc ) sizeof ) edgenode ); e-adjvex=i; //相邻编号为i e-next=G-adjList[j].firstedge; G-adjList[j].firstedge=e; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。