c语言数据结构统计邻接表中顶点入度和判断入度是否为0的代码
时间: 2024-12-11 07:42:37 浏览: 44
在C语言中,邻接表是一种常用的图的数据结构,它通过链表存储每个顶点与其相邻顶点的关系。对于统计顶点的入度(即有多少条边指向该顶点),我们可以创建一个数组或哈希表来存储每个顶点的入度,并在遍历邻接表的过程中更新这个计数。
以下是一个简单的示例,假设我们有一个邻接表表示无向图:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义邻接表节点结构
typedef struct Node {
int vertex; // 相邻顶点的编号
struct Node* next; // 指向下一个邻居的指针
} AdjListNode;
// 定义顶点结构,包含入度信息
typedef struct Vertex {
int degree; // 入度
AdjListNode* neighbors; // 邻接列表头部
} VertexNode;
// 初始化图和顶点
void initGraph(int n) {
VertexNode* vertices = (VertexNode*)malloc(n * sizeof(VertexNode));
for (int i = 0; i < n; i++) {
vertices[i].degree = 0;
vertices[i].neighbors = NULL;
}
}
// 添加边,更新顶点的入度
void addEdge(int src, int dest, VertexNode** graph) {
VertexNode* srcNode = (*graph)[src];
VertexNode* destNode = (*graph)[dest];
if (!srcNode->neighbors) {
srcNode->neighbors = (AdjListNode*)malloc(sizeof(AdjListNode));
srcNode->neighbors->vertex = dest;
srcNode->neighbors->next = NULL;
}
if (!destNode->neighbors) {
destNode->neighbors = (AdjListNode*)malloc(sizeof(AdjListNode));
destNode->neighbors->vertex = src;
destNode->neighbors->next = NULL;
}
srcNode->degree++;
destNode->degree++;
}
// 更新并返回顶点的入度
int getDegree(int vertex, VertexNode** graph) {
return (*graph)[vertex].degree;
}
// 判断一个顶点的入度是否为0
int isDegreeZero(int vertex, VertexNode** graph) {
return (*graph)[vertex].degree == 0;
}
// 示例用法
int main() {
int n = 5; // 顶点数
initGraph(n);
// 添加一些边...
addEdge(0, 1); // 边 (0, 1)
addEdge(0, 4); // 边 (0, 4)
// 输出顶点0的入度
printf("Degree of vertex 0: %d\n", getDegree(0, &vertices));
// 判断顶点1的入度是否为0
if (isDegreeZero(1, &vertices)) {
printf("Vertex 1 has degree 0.\n");
} else {
printf("Vertex 1 does not have degree 0.\n");
}
return 0;
}
```
在这个示例中,`initGraph()`函数初始化了图,`addEdge()`用于添加边并更新入度,`getDegree()`用于获取指定顶点的入度,`isDegreeZero()`则检查入度是否为0。记得在实际应用中处理内存分配和释放,特别是当添加大量边时。
阅读全文