c语言试写出把图的邻接矩阵表示转换为邻接表表示的算法
时间: 2023-12-12 08:03:37 浏览: 100
图的邻接矩阵和邻接表表示的各种算法
当然,我可以帮你编写一个将图的邻接矩阵表示转换为邻接表表示的算法。以下是一个示例的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 图的最大顶点数
#define MAX_VERTICES 100
// 邻接表节点
typedef struct Node {
int vertex;
struct Node* next;
} Node;
// 邻接表
typedef struct List {
Node* head;
} List;
// 图结构
typedef struct Graph {
int numVertices;
List* array;
} Graph;
// 创建节点
Node* createNode(int vertex) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->vertex = vertex;
newNode->next = NULL;
return newNode;
}
// 创建图
Graph* createGraph(int numVertices) {
Graph* graph = (Graph*)malloc(sizeof(Graph));
graph->numVertices = numVertices;
// 创建邻接表数组
graph->array = (List*)malloc(numVertices * sizeof(List));
// 初始化邻接表为空
for (int i = 0; i < numVertices; i++) {
graph->array[i].head = NULL;
}
return graph;
}
// 添加边
void addEdge(Graph* graph, int src, int dest) {
// 添加从src到dest的边
Node* newNode = createNode(dest);
newNode->next = graph->array[src].head;
graph->array[src].head = newNode;
// 添加从dest到src的边(无向图)
newNode = createNode(src);
newNode->next = graph->array[dest].head;
graph->array[dest].head = newNode;
}
// 打印邻接表表示的图
void printGraph(Graph* graph) {
for (int i = 0; i < graph->numVertices; i++) {
Node* currentNode = graph->array[i].head;
printf("顶点 %d 的邻接表:", i);
while (currentNode) {
printf(" -> %d", currentNode->vertex);
currentNode = currentNode->next;
}
printf("\n");
}
}
int main() {
int numVertices, numEdges;
printf("请输入顶点数:");
scanf("%d", &numVertices);
// 创建图
Graph* graph = createGraph(numVertices);
printf("请输入边数:");
scanf("%d", &numEdges);
// 添加边
for (int i = 0; i < numEdges; i++) {
int src, dest;
printf("请输入边的起点和终点:");
scanf("%d %d", &src, &dest);
addEdge(graph, src, dest);
}
// 打印邻接表表示的图
printGraph(graph);
return 0;
}
```
这个算法首先定义了邻接表节点和邻接表的数据结构,然后创建了一个图的数据结构。接下来,通过`createNode`函数来创建一个新的节点,`createGraph`函数来创建一个新的图。然后使用`addEdge`函数添加边到图中。最后,使用`printGraph`函数打印出邻接表表示的图。
你可以根据需要修改输入和输出的方式来适应你的具体应用场景。希望这个算法能对你有所帮助!
阅读全文