c语言设无向图G有n个顶点e条边,写一算法建立G的邻接多重表,要求该算法时间复杂性为O(n+e),且除邻接多重表本身所占空间之外只用O(1)辅助空间
时间: 2024-02-01 20:03:52 浏览: 95
算法的思路如下:
1. 创建一个长度为n数组adjList,用于存储邻接多重表的头结点。
2. 初始化adjList数组,将所有头结点的指针都置为NULL。
3. 遍历图中的每条边,对于每条边的两个顶点u和v,进行如下操作:
- 创建一个新的邻接表节点,并将u和v分别赋值给节点的顶点u和v。
- 将新节点插入到节点u对应的链表中,插入位置为链表的头部。
- 将新节点插入到节点v对应的链表中,插入位置为链表的头部。
4. 返回adjList数组作为建立好的邻接多重表。
该算法的时间复杂度为O(n+e),其中n为顶点数,e为边数。在算法执行过程中,只需要额外使用O(1)的辅助空间,即使顶点和边数很大,也不会占用过多的内存空间。
以下是C语言的实现代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct AdjListNode {
int u;
int v;
struct AdjListNode* next;
} AdjListNode;
AdjListNode** buildAdjacencyList(int n, int e) {
AdjListNode** adjList = (AdjListNode**)malloc(n * sizeof(AdjListNode*));
// 初始化adjList数组
for (int i = 0; i < n; i++) {
adjList[i] = NULL;
}
// 构建邻接多重表
for (int i = 0; i < e; i++) {
int u, v;
scanf("%d%d", &u, &v); // 读取边的两个顶点
// 创建新的邻接表节点
AdjListNode* newNode = (AdjListNode*)malloc(sizeof(AdjListNode));
newNode->u = u;
newNode->v = v;
newNode->next = NULL;
// 将新节点插入到节点u对应的链表中
newNode->next = adjList[u];
adjList[u] = newNode;
// 将新节点插入到节点v对应的链表中
newNode = (AdjListNode*)malloc(sizeof(AdjListNode));
newNode->u = v;
newNode->v = u;
newNode->next = NULL;
newNode->next = adjList[v];
adjList[v] = newNode;
}
return adjList;
}
int main() {
int n, e;
printf("请输入顶点数n和边数e:");
scanf("%d%d", &n, &e);
AdjListNode** adjList = buildAdjacencyList(n, e);
// 打印邻接多重表
printf("邻接多重表:\n");
for (int i = 0; i < n; i++) {
printf("%d: ", i);
AdjListNode* curNode = adjList[i];
while (curNode != NULL) {
printf("(%d, %d) ", curNode->u, curNode->v);
curNode = curNode->next;
}
printf("\n");
}
// 释放内存
for (int i = 0; i < n; i++) {
AdjListNode* curNode = adjList[i];
while (curNode != NULL) {
AdjListNode* nextNode = curNode->next;
free(curNode);
curNode = nextNode;
}
}
free(adjList);
return 0;
}
```
运行上述代码,输入顶点数和边数,然后输入每条边的两个顶点,程序将输出建立好的邻接多重表。
阅读全文