图的邻接表存储结构及求各顶点的度

数组与链表相结合的存储方法称为邻接表(Adjacency List)

邻接表的处理方法是:

1.图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过数组可以较容易地读取顶点信息,更加方便。另外,对于顶点数组中,每个数组元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息。

2.图中每个顶点Vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点Vi的边表,有向图称为顶点Vi作为弧尾的出边表。


获取图的相关信息:

1.我们要想知道某个顶点的度,就去查找这个顶点的边表中节点的个数。

2.要判断顶点Vi到Vj是否存在边,只需要测试顶点Vi的边表中adjvex是否存在节点Vj的下标j就行了。

3.求顶点的所有邻接点,其实就是对此顶点的边表进行遍历,得到的adjvex域对应的顶点就是邻接点。


对于有向图,邻接表是以顶点为弧尾来存储边表的,逆邻接表是以顶点为弧头来存储边表的。


无向图的邻接表结构:


有向图的邻接表及逆邻接表结构:


对于带权的网图,可以在边表节点定义中再增加一个weight的数据域,存储权值信息即可:



下面的程序就是利用图的邻接表存储结构,实现计算无向图的各个顶点的度数(C/C++):


/*********************************************/

/*    邻接表存储结构      */

/*********************************************/

#include <stdio.h>

#include <stdlib.h>

#include <iostream>

  • 16
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
邻接表存储的无向可以通过遍历每个节点的邻接表来计算出每个节点的数,具体算法步骤如下: 1. 定义一个数组degree,用于存储每个节点的数。 2. 遍历邻接表中的每个节点,将其相应的数加1。 3. 遍历每个节点的邻接表,将与其相连的节点的数也加1。 4. 输出每个节点的数即可。 C语言实现代码如下: ```c #include<stdio.h> #include<stdlib.h> #define MAX_VERTEX_NUM 100 //最大顶点数 //边表结构体 typedef struct EdgeNode{ int adjvex; //邻接点在顶点数组中的下标 struct EdgeNode *next; //指向下一条边的指针 }EdgeNode; //顶点表结构体 typedef struct VertexNode{ int data; //顶点数据 EdgeNode *firstedge; //指向第一条边的指针 }VertexNode, AdjList[MAX_VERTEX_NUM]; //的结构体 typedef struct{ AdjList adjList; //邻接表 int vexNum, edgeNum; //顶点数和边数 }Graph; //计算中各顶点 void CalculateDegree(Graph G, int degree[]){ int i; EdgeNode *p; for(i = 0; i < G.vexNum; i++){ degree[i] = 0; //初始化每个节点的数为0 p = G.adjList[i].firstedge; while(p){ //遍历邻接表中的每个节点,将其相应的数加1 degree[i]++; p = p->next; } } for(i = 0; i < G.vexNum; i++){ p = G.adjList[i].firstedge; while(p){ //遍历每个节点的邻接表,将与其相连的节点的数也加1 degree[p->adjvex]++; p = p->next; } } } int main(){ Graph G; int degree[MAX_VERTEX_NUM]; int i, j; printf("请输入顶点数和边数:"); scanf("%d %d", &G.vexNum, &G.edgeNum); printf("请输入顶点的数据:\n"); for(i = 0; i < G.vexNum; i++){ scanf("%d", &G.adjList[i].data); G.adjList[i].firstedge = NULL; } printf("请输入每条边的两个顶点序号:\n"); for(i = 0; i < G.edgeNum; i++){ int v1, v2; scanf("%d %d", &v1, &v2); EdgeNode *e1 = (EdgeNode*)malloc(sizeof(EdgeNode)); e1->adjvex = v2; e1->next = G.adjList[v1].firstedge; G.adjList[v1].firstedge = e1; EdgeNode *e2 = (EdgeNode*)malloc(sizeof(EdgeNode)); e2->adjvex = v1; e2->next = G.adjList[v2].firstedge; G.adjList[v2].firstedge = e2; } CalculateDegree(G, degree); printf("各顶点数为:\n"); for(i = 0; i < G.vexNum; i++){ printf("%d ", degree[i]); } printf("\n"); return 0; } ``` 以上就是解无向顶点数的算法思路和C语言实现代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值