用一串C语言实现(1) 键盘输入数据,建立一个有向图的邻接表。 (2) 输出该邻接表。 (3) 在有向图的邻接表的基础上计算各顶点的度,并输出。
时间: 2024-03-09 17:49:10 浏览: 100
C++实现有向图的邻接表表示
5星 · 资源好评率100%
以下是一段C语言代码,实现(1) 键盘输入数据,建立一个有向图的邻接表。 (2) 输出该邻接表。 (3) 在有向图的邻接表的基础上计算各顶点的度,并输出。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100
typedef struct ArcNode { // 边表结点
int adjvex; // 邻接点在顶点数组中的下标
struct ArcNode* next; // 指向下一个邻接点的指针
} ArcNode;
typedef struct VertexNode { // 顶点表结点
int data; // 顶点信息
ArcNode* firstarc; // 指向第一个邻接点的指针
} VertexNode, AdjList[MAX_VERTEX_NUM];
typedef struct { // 邻接表
AdjList vertices; // 顶点数组
int vexnum, arcnum; // 顶点数和边数
} ALGraph;
// 建立邻接表
void CreateALGraph(ALGraph* G) {
printf("请输入顶点数和边数:");
scanf("%d%d", &G->vexnum, &G->arcnum);
for (int i = 0; i < G->vexnum; i++) {
printf("请输入第%d个顶点的信息:", i + 1);
scanf("%d", &G->vertices[i].data);
G->vertices[i].firstarc = NULL;
}
for (int i = 0; i < G->arcnum; i++) {
int v1, v2;
printf("请输入第%d条边的两个端点的下标:", i + 1);
scanf("%d%d", &v1, &v2);
ArcNode* arcnode = (ArcNode*)malloc(sizeof(ArcNode));
arcnode->adjvex = v2;
arcnode->next = G->vertices[v1].firstarc;
G->vertices[v1].firstarc = arcnode;
}
}
// 输出邻接表
void PrintALGraph(ALGraph G) {
printf("邻接表如下:\n");
for (int i = 0; i < G.vexnum; i++) {
printf("%d", G.vertices[i].data);
ArcNode* p = G.vertices[i].firstarc;
while (p != NULL) {
printf("->%d", G.vertices[p->adjvex].data);
p = p->next;
}
printf("\n");
}
}
// 计算各顶点的度并输出
void PrintDegree(ALGraph G) {
printf("各顶点的度如下:\n");
for (int i = 0; i < G.vexnum; i++) {
int degree = 0;
ArcNode* p = G.vertices[i].firstarc;
while (p != NULL) {
degree++;
p = p->next;
}
printf("顶点%d的度为%d\n", G.vertices[i].data, degree);
}
}
int main() {
ALGraph G;
CreateALGraph(&G);
PrintALGraph(G);
PrintDegree(G);
return 0;
}
```
注意:在本代码中,我们假设顶点的信息为整数,顶点的下标从0开始,且输入的边是有向边。
阅读全文