用C语言:设无向图G有n个顶点e条边,写一算法建立G的邻接多重表,要求该算法时间复杂性为O(n+e), 且除邻接多重表本身所占空间之外只用O(1)辅助空间,从键盘输入图。
时间: 2024-02-01 10:04:11 浏览: 76
实验六 图(算法与数据结构)
要满足题目中所要求的时间复杂度和空间复杂度限制,我们可以使用邻接多重表来表示无向图。下面是一个满足要求的算法示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义图的顶点结构
typedef struct Vertex {
int data; // 顶点数据
struct EdgeNode* first_edge; // 指向该顶点的边表的第一个结点
} Vertex;
// 定义图的边结点结构
typedef struct EdgeNode {
struct Vertex* vertex1; // 指向顶点1
struct Vertex* vertex2; // 指向顶点2
struct EdgeNode* next_edge1; // 指向顶点1的下一条边
struct EdgeNode* next_edge2; // 指向顶点2的下一条边
} EdgeNode;
// 创建无向图的邻接多重表
void createGraph(Vertex** graph, int num_vertices, int num_edges) {
*graph = (Vertex*)malloc(num_vertices * sizeof(Vertex));
for (int i = 0; i < num_vertices; i++) {
(*graph)[i].data = i;
(*graph)[i].first_edge = NULL;
}
printf("Enter the edges (vertex1 and vertex2):\n");
for (int i = 0; i < num_edges; i++) {
int vertex1, vertex2;
scanf("%d %d", &vertex1, &vertex2);
EdgeNode* edge = (EdgeNode*)malloc(sizeof(EdgeNode));
edge->vertex1 = &(*graph)[vertex1];
edge->vertex2 = &(*graph)[vertex2];
edge->next_edge1 = (*graph)[vertex1].first_edge;
edge->next_edge2 = (*graph)[vertex2].first_edge;
(*graph)[vertex1].first_edge = edge;
(*graph)[vertex2].first_edge = edge;
}
}
int main() {
int num_vertices, num_edges;
printf("Enter the number of vertices: ");
scanf("%d", &num_vertices);
printf("Enter the number of edges: ");
scanf("%d", &num_edges);
Vertex* graph;
createGraph(&graph, num_vertices, num_edges);
// 输出邻接多重表
printf("Adjacency Multi-List:\n");
for (int i = 0; i < num_vertices; i++) {
printf("Vertex %d:", i);
EdgeNode* edge = graph[i].first_edge;
while (edge != NULL) {
printf(" (%d, %d)", edge->vertex1->data, edge->vertex2->data);
if (edge->vertex1 == &graph[i]) {
edge = edge->next_edge1;
} else {
edge = edge->next_edge2;
}
}
printf("\n");
}
return 0;
}
```
这段代码会先要求用户输入顶点的数量和边的数量,然后根据用户输入构建无向图的邻接多重表。用户需要依次输入每条边的两个顶点,然后代码会根据输入构建邻接多重表。最后,代码会输出邻接多重表的内容。
希望对你有所帮助!如果还有其他问题,请随时提问。
阅读全文