c语言设计一个算法将无向图的邻接矩阵转为对应邻接表的算法
时间: 2023-10-12 19:48:06 浏览: 120
c语言 用邻接矩阵构造图,输出对应的邻接表
4星 · 用户满意度95%
你可以按照以下步骤设计一个算法,将无向图的邻接矩阵转换为对应的邻接表:
1. 创建一个空的邻接表,用于存储转换后的图。
2. 遍历邻接矩阵的每一行:
- 创建一个空的链表,用于存储当前行对应的顶点的邻接点。
- 遍历当前行的每一个顶点:
- 如果当前顶点与该行的其他顶点存在边连接(邻接矩阵中的值不为0):
- 创建一个新的节点,表示与当前顶点相邻的另一个顶点。
- 将该节点插入到当前顶点对应链表的末尾。
- 将当前行对应链表插入到邻接表中,作为当前顶点的邻接表。
3. 返回最终生成的邻接表。
下面是一个使用C语言实现上述算法的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 邻接表节点
typedef struct Node {
int vertex; // 相邻顶点的索引
struct Node* next; // 指向下一个节点的指针
} Node;
// 邻接表
typedef struct AdjList {
Node* head; // 指向链表头节点的指针
} AdjList;
// 创建节点
Node* createNode(int v) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->vertex = v;
newNode->next = NULL;
return newNode;
}
// 创建邻接表
AdjList* createAdjList(int vertices) {
AdjList* adjList = (AdjList*)malloc(vertices * sizeof(AdjList));
for (int i = 0; i < vertices; ++i) {
adjList[i].head = NULL;
}
return adjList;
}
// 添加边到邻接表
void addEdge(AdjList* adjList, int src, int dest) {
// 添加从 src 到 dest 的边
Node* newNode = createNode(dest);
newNode->next = adjList[src].head;
adjList[src].head = newNode;
// 添加从 dest 到 src 的边(无向图)
newNode = createNode(src);
newNode->next = adjList[dest].head;
adjList[dest].head = newNode;
}
// 打印邻接表
void printAdjList(AdjList* adjList, int vertices) {
for (int i = 0; i < vertices; ++i) {
Node* current = adjList[i].head;
printf("顶点 %d 的邻接表 ", i);
while (current) {
printf("-> %d ", current->vertex);
current = current->next;
}
printf("\n");
}
}
int main() {
int vertices; // 顶点数量
printf("请输入顶点数量:");
scanf("%d", &vertices);
// 创建邻接表
AdjList* adjList = createAdjList(vertices);
// 读取邻接矩阵
int adjacencyMatrix[vertices][vertices];
printf("请输入邻接矩阵:\n");
for (int i = 0; i < vertices; ++i) {
for (int j = 0; j < vertices; ++j) {
scanf("%d", &adjacencyMatrix[i][j]);
}
}
// 将邻接矩阵转换为邻接表
for (int i = 0; i < vertices; ++i) {
for (int j = 0; j < vertices; ++j) {
if (adjacencyMatrix[i][j] != 0) {
addEdge(adjList, i, j);
}
}
}
// 打印邻接表
printAdjList(adjList, vertices);
return 0;
}
```
你可以根据需要修改这段代码,并根据输入的邻接矩阵生成对应的邻接表。希望对你有所帮助!
阅读全文