用C语言编写设无向图G有n个顶点e条边,写一算法建立G的邻接多重表,要求该算法时间复杂性为O(n+e),且除邻接多重表本身所占空间之外只用O(1)辅助空间。
时间: 2024-02-01 16:03:52 浏览: 71
以下是使用C语言编写的算法,用于建立无向图G的邻接多重表。该算法的时间复杂性为O(n+e),并且只使用O(1)辅助空间。
```c
#include <stdio.h>
#include <stdlib.h>
// 定义无向图的边节点
struct EdgeNode {
int vertex1;
int vertex2;
struct EdgeNode* next1;
struct EdgeNode* next2;
};
// 定义无向图的顶点节点
struct VertexNode {
int vertex;
struct EdgeNode* firstEdge;
};
// 建立邻接多重表函数
void createAdjacencyMultiList(struct VertexNode* G, int n, int e) {
// 初始化顶点列表
for (int i = 0; i < n; i++) {
G[i].vertex = i + 1;
G[i].firstEdge = NULL;
}
// 输入边的信息并建立邻接多重表
for (int i = 0; i < e; i++) {
int v1, v2;
printf("请输入第 %d 条边连接的两个顶点:", i + 1);
scanf("%d %d", &v1, &v2);
// 创建新的边节点
struct EdgeNode* newEdge = (struct EdgeNode*)malloc(sizeof(struct EdgeNode));
newEdge->vertex1 = v1;
newEdge->vertex2 = v2;
newEdge->next1 = NULL;
newEdge->next2 = NULL;
// 在顶点v1处插入边节点
if (G[v1 - 1].firstEdge == NULL) {
G[v1 - 1].firstEdge = newEdge;
} else {
struct EdgeNode* curr1 = G[v1 - 1].firstEdge;
while (curr1->next1 != NULL) {
curr1 = curr1->next1;
}
curr1->next1 = newEdge;
}
// 在顶点v2处插入边节点
if (G[v2 - 1].firstEdge == NULL) {
G[v2 - 1].firstEdge = newEdge;
} else {
struct EdgeNode* curr2 = G[v2 - 1].firstEdge;
while (curr2->next2 != NULL) {
curr2 = curr2->next2;
}
curr2->next2 = newEdge;
}
}
}
// 打印邻接多重表函数
void printAdjacencyMultiList(struct VertexNode* G, int n) {
for (int i = 0; i < n; i++) {
printf("顶点 %d 的边节点连接顶点:", G[i].vertex);
struct EdgeNode* curr = G[i].firstEdge;
while (curr != NULL) {
if (curr->vertex1 == G[i].vertex) {
printf("%d ", curr->vertex2);
curr = curr->next1;
} else {
printf("%d ", curr->vertex1);
curr = curr->next2;
}
}
printf("\n");
}
}
// 主函数
int main() {
int n, e;
// 输入顶点个数和边的个数
printf("请输入无向图的顶点个数和边的个数:");
scanf("%d %d", &n, &e);
// 创建邻接多重表
struct VertexNode* G = (struct VertexNode*)malloc(n * sizeof(struct VertexNode));
createAdjacencyMultiList(G, n, e);
// 打印邻接多重表
printf("邻接多重表如下:\n");
printAdjacencyMultiList(G, n);
return 0;
}
```
你可以按照提示输入无向图的顶点个数和边的个数,然后程序会要求你输入每条边连接的两个顶点。最后,程序将打印出建立的邻接多重表。
阅读全文