用C语言实现(1) 键盘输入数据,建立一个有向图的邻接表。 (2) 输出该邻接表。 (3) 在有向图的邻接表的基础上计算各顶点的度,并输出。
时间: 2024-03-03 16:51:17 浏览: 51
好的,我来回答你的问题。
首先,我们需要了解什么是有向图和邻接表。有向图是由一组顶点和一组有向边组成的图,每条边都有一个方向。而邻接表是一种表示图的方式,它将每个顶点和与之相邻的顶点列表存储在一起。
接下来,我将分步解释如何用C语言实现你的要求。
1. 键盘输入数据,建立一个有向图的邻接表
我们可以使用结构体来表示图中的顶点和边。具体实现如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义结构体表示顶点和边
typedef struct EdgeNode {
int adjvex; // 邻接点的下标
struct EdgeNode *next; // 指向下一条边的指针
} EdgeNode;
typedef struct VertexNode {
int data; // 顶点的数据
EdgeNode *first_edge; // 指向第一条边的指针
} VertexNode;
typedef struct Graph {
VertexNode *vertexes; // 存储顶点的数组
int num_vertexes; // 顶点的个数
int num_edges; // 边的个数
} Graph;
// 创建一个有向图的邻接表
void create_graph(Graph *G) {
printf("请输入顶点数和边数:");
scanf("%d%d", &G->num_vertexes, &G->num_edges);
// 创建存储顶点的数组
G->vertexes = (VertexNode *)malloc(G->num_vertexes * sizeof(VertexNode));
for (int i = 0; i < G->num_vertexes; i++) {
printf("请输入第%d个顶点的数据:", i + 1);
scanf("%d", &G->vertexes[i].data);
G->vertexes[i].first_edge = NULL;
}
// 建立边的邻接表
int v1, v2;
EdgeNode *e;
for (int i = 0; i < G->num_edges; i++) {
printf("请输入第%d条边的两个顶点的下标:", i + 1);
scanf("%d%d", &v1, &v2);
e = (EdgeNode *)malloc(sizeof(EdgeNode));
e->adjvex = v2;
e->next = G->vertexes[v1].first_edge;
G->vertexes[v1].first_edge = e;
}
}
```
2. 输出该邻接表
我们可以通过遍历邻接表的方式输出图中的所有顶点和边。具体实现如下所示:
```c
// 输出一个有向图的邻接表
void print_graph(const Graph *G) {
for (int i = 0; i < G->num_vertexes; i++) {
printf("%d: ", G->vertexes[i].data);
EdgeNode *e = G->vertexes[i].first_edge;
while (e) {
printf("%d ", G->vertexes[e->adjvex].data);
e = e->next;
}
printf("\n");
}
}
```
3. 在有向图的邻接表的基础上计算各顶点的度,并输出
我们可以通过遍历邻接表的方式计算每个顶点的入度和出度。具体实现如下所示:
```c
// 计算一个有向图中各顶点的入度和出度
void calculate_degree(const Graph *G) {
int *in_degree = (int *)calloc(G->num_vertexes, sizeof(int));
int *out_degree = (int *)calloc(G->num_vertexes, sizeof(int));
// 计算入度和出度
for (int i = 0; i < G->num_vertexes; i++) {
EdgeNode *e = G->vertexes[i].first_edge;
while (e) {
out_degree[i]++;
in_degree[e->adjvex]++;
e = e->next;
}
}
// 输出入度和出度
for (int i = 0; i < G->num_vertexes; i++) {
printf("%d: 入度=%d 出度=%d\n", G->vertexes[i].data, in_degree[i], out_degree[i]);
}
free(in_degree);
free(out_degree);
}
```
完整代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义结构体表示顶点和边
typedef struct EdgeNode {
int adjvex; // 邻接点的下标
struct EdgeNode *next; // 指向下一条边的指针
} EdgeNode;
typedef struct VertexNode {
int data; // 顶点的数据
EdgeNode *first_edge; // 指向第一条边的指针
} VertexNode;
typedef struct Graph {
VertexNode *vertexes; // 存储顶点的数组
int num_vertexes; // 顶点的个数
int num_edges; // 边的个数
} Graph;
// 创建一个有向图的邻接表
void create_graph(Graph *G) {
printf("请输入顶点数和边数:");
scanf("%d%d", &G->num_vertexes, &G->num_edges);
// 创建存储顶点的数组
G->vertexes = (VertexNode *)malloc(G->num_vertexes * sizeof(VertexNode));
for (int i = 0; i < G->num_vertexes; i++) {
printf("请输入第%d个顶点的数据:", i + 1);
scanf("%d", &G->vertexes[i].data);
G->vertexes[i].first_edge = NULL;
}
// 建立边的邻接表
int v1, v2;
EdgeNode *e;
for (int i = 0; i < G->num_edges; i++) {
printf("请输入第%d条边的两个顶点的下标:", i + 1);
scanf("%d%d", &v1, &v2);
e = (EdgeNode *)malloc(sizeof(EdgeNode));
e->adjvex = v2;
e->next = G->vertexes[v1].first_edge;
G->vertexes[v1].first_edge = e;
}
}
// 输出一个有向图的邻接表
void print_graph(const Graph *G) {
for (int i = 0; i < G->num_vertexes; i++) {
printf("%d: ", G->vertexes[i].data);
EdgeNode *e = G->vertexes[i].first_edge;
while (e) {
printf("%d ", G->vertexes[e->adjvex].data);
e = e->next;
}
printf("\n");
}
}
// 计算一个有向图中各顶点的入度和出度
void calculate_degree(const Graph *G) {
int *in_degree = (int *)calloc(G->num_vertexes, sizeof(int));
int *out_degree = (int *)calloc(G->num_vertexes, sizeof(int));
// 计算入度和出度
for (int i = 0; i < G->num_vertexes; i++) {
EdgeNode *e = G->vertexes[i].first_edge;
while (e) {
out_degree[i]++;
in_degree[e->adjvex]++;
e = e->next;
}
}
// 输出入度和出度
for (int i = 0; i < G->num_vertexes; i++) {
printf("%d: 入度=%d 出度=%d\n", G->vertexes[i].data, in_degree[i], out_degree[i]);
}
free(in_degree);
free(out_degree);
}
int main() {
Graph G;
create_graph(&G);
printf("邻接表如下:\n");
print_graph(&G);
printf("各顶点的度如下:\n");
calculate_degree(&G);
return 0;
}
```
阅读全文