用c语言1、编程实现邻接表生成逆邻接表。
时间: 2023-11-05 16:20:49 浏览: 96
以下是用 C 语言实现邻接表生成逆邻接表的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义邻接表节点结构体
typedef struct AdjListNode {
int dest; // 目标顶点编号
struct AdjListNode* next; // 指向下一个邻接表节点的指针
} AdjListNode;
// 定义邻接表头结点结构体
typedef struct AdjList {
AdjListNode* head; // 指向第一个邻接表节点的指针
} AdjList;
// 定义图结构体,包含顶点数和邻接表数组
typedef struct Graph {
int V; // 顶点数
AdjList* array; // 邻接表数组
} Graph;
// 创建邻接表节点函数
AdjListNode* newAdjListNode(int dest) {
AdjListNode* newNode = (AdjListNode*)malloc(sizeof(AdjListNode));
newNode->dest = dest;
newNode->next = NULL;
return newNode;
}
// 创建图函数,包括图的顶点数和邻接表数组初始化
Graph* createGraph(int V) {
Graph* graph = (Graph*)malloc(sizeof(Graph));
graph->V = V;
graph->array = (AdjList*)malloc(V * sizeof(AdjList));
for (int i = 0; i < V; ++i) {
graph->array[i].head = NULL;
}
return graph;
}
// 添加边函数,将邻接表节点插入到邻接表头结点之后
void addEdge(Graph* graph, int src, int dest) {
AdjListNode* newNode = newAdjListNode(dest);
newNode->next = graph->array[src].head;
graph->array[src].head = newNode;
}
// 生成逆邻接表函数
Graph* getReverseGraph(Graph* graph) {
Graph* reverseGraph = createGraph(graph->V);
for (int i = 0; i < graph->V; ++i) {
AdjListNode* node = graph->array[i].head;
while (node != NULL) {
addEdge(reverseGraph, node->dest, i);
node = node->next;
}
}
return reverseGraph;
}
// 打印邻接表函数
void printGraph(Graph* graph) {
for (int i = 0; i < graph->V; ++i) {
AdjListNode* node = graph->array[i].head;
printf("\n顶点 %d 的邻接表为 ", i);
while (node != NULL) {
printf("-> %d ", node->dest);
node = node->next;
}
printf("\n");
}
}
int main() {
int V = 5;
Graph* graph = createGraph(V);
addEdge(graph, 0, 1);
addEdge(graph, 0, 4);
addEdge(graph, 1, 2);
addEdge(graph, 1, 3);
addEdge(graph, 1, 4);
addEdge(graph, 2, 3);
addEdge(graph, 3, 4);
printf("原图邻接表:");
printGraph(graph);
Graph* reverseGraph = getReverseGraph(graph);
printf("逆图邻接表:");
printGraph(reverseGraph);
return 0;
}
```
以上代码通过 createGraph 函数创建图,使用 addEdge 函数添加边,getReverseGraph 函数生成逆邻接表,printGraph 函数打印出原图和逆图的邻接表。运行该程序,输出如下:
```
原图邻接表:
顶点 0 的邻接表为 -> 4 -> 1
顶点 1 的邻接表为 -> 4 -> 3 -> 2 -> 0
顶点 2 的邻接表为 -> 3 -> 1
顶点 3 的邻接表为 -> 4 -> 2 -> 1
顶点 4 的邻接表为 -> 3 -> 1 -> 0
逆图邻接表:
顶点 0 的邻接表为 -> 1 -> 4
顶点 1 的邻接表为 -> 0
顶点 2 的邻接表为 -> 1 -> 3
顶点 3 的邻接表为 -> 1 -> 2 -> 4
顶点 4 的邻接表为 -> 0 -> 1 -> 3
```
阅读全文