请用c语言实现邻接表顶点和边的输入
时间: 2024-03-23 18:43:43 浏览: 52
图的邻接表存储C语言实现
好的,邻接表是一种常用的图的存储结构,可以用链表或数组实现,以下是使用链表实现邻接表的代码示例,包括顶点和边的输入:
```c
#include <stdio.h>
#include <stdlib.h>
// 邻接表的边结构体
typedef struct EdgeNode {
int dest; // 边的终点
struct EdgeNode* next; // 指向下一条边的指针
} EdgeNode;
// 邻接表的顶点结构体
typedef struct VertexNode {
EdgeNode* first_edge; // 指向第一条边的指针
} VertexNode;
// 邻接表的图结构体
typedef struct Graph {
int num_vertices; // 顶点数
VertexNode* adj_list; // 邻接表头指针数组
} Graph;
// 创建邻接表的边
EdgeNode* create_edge(int dest) {
EdgeNode* new_edge = (EdgeNode*)malloc(sizeof(EdgeNode));
new_edge->dest = dest;
new_edge->next = NULL;
return new_edge;
}
// 创建邻接表的图
Graph* create_graph(int num_vertices) {
Graph* new_graph = (Graph*)malloc(sizeof(Graph));
new_graph->num_vertices = num_vertices;
new_graph->adj_list = (VertexNode*)malloc(num_vertices * sizeof(VertexNode));
// 初始化邻接表头指针数组
for (int i = 0; i < num_vertices; i++) {
new_graph->adj_list[i].first_edge = NULL;
}
return new_graph;
}
// 添加邻接表的边
void add_edge(Graph* graph, int src, int dest) {
EdgeNode* new_edge = create_edge(dest);
new_edge->next = graph->adj_list[src].first_edge;
graph->adj_list[src].first_edge = new_edge;
}
int main() {
int num_vertices, num_edges;
printf("请输入顶点数和边数:");
scanf("%d%d", &num_vertices, &num_edges);
Graph* graph = create_graph(num_vertices);
// 添加边
printf("请输入每条边的起点和终点:\n");
for (int i = 0; i < num_edges; i++) {
int src, dest;
scanf("%d%d", &src, &dest);
add_edge(graph, src, dest);
}
// 输出邻接表
printf("邻接表如下:\n");
for (int i = 0; i < num_vertices; i++) {
printf("%d:", i);
EdgeNode* edge = graph->adj_list[i].first_edge;
while (edge != NULL) {
printf(" %d", edge->dest);
edge = edge->next;
}
printf("\n");
}
return 0;
}
```
在该代码中,我们定义了邻接表的边结构体 EdgeNode 和顶点结构体 VertexNode,以及邻接表的图结构体 Graph。使用 create_edge 函数创建一条边,使用 create_graph 函数创建一个新的图。使用 add_edge 函数将一条边添加到邻接表中。最后,我们输入每条边的起点和终点,添加到邻接表中,并输出邻接表的内容。
阅读全文