c语言,无向图采用邻接表作为存储结构,编写算法求图中各顶点的度。算法思路
时间: 2023-11-18 13:11:05 浏览: 281
邻接表存储的无向图可以通过遍历每个节点的邻接表来计算出每个节点的度数,具体算法步骤如下:
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语言实现代码。
阅读全文