C语言邻接矩阵建立无向图并转换成邻接表输出
时间: 2023-10-06 09:06:42 浏览: 118
图的邻接表转邻接矩阵和深度遍历
好的,下面是C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
// 邻接矩阵结构体
typedef struct {
int vertex[MAX_VERTEX_NUM]; // 顶点数组
int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vertex_num; // 顶点数
int edge_num; // 边数
} MGraph;
// 邻接表结构体
typedef struct ArcNode {
int adj_vex; // 邻接点下标
struct ArcNode *nextarc; // 指向下一个邻接点的指针
} ArcNode;
typedef struct VNode {
int data; // 顶点信息
ArcNode *firstarc; // 指向第一个邻接点的指针
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices; // 邻接表
int vertex_num; // 顶点数
int edge_num; // 边数
} ALGraph;
// 邻接矩阵转邻接表
void MGraphToALGraph(MGraph mg, ALGraph *ag) {
ag->vertex_num = mg.vertex_num; // 顶点数
ag->edge_num = mg.edge_num; // 边数
for (int i = 0; i < mg.vertex_num; i++) {
ag->vertices[i].data = mg.vertex[i]; // 存储顶点信息
ag->vertices[i].firstarc = NULL; // 初始化邻接表的第一个邻接点指针
}
for (int i = 0; i < mg.vertex_num; i++) {
for (int j = 0; j < mg.vertex_num; j++) {
if (mg.edge[i][j] != 0) {
// 创建一个新的邻接点
ArcNode *newArcNode = (ArcNode *) malloc(sizeof(ArcNode));
newArcNode->adj_vex = j;
newArcNode->nextarc = NULL;
// 将新的邻接点插入到对应的邻接表中
if (ag->vertices[i].firstarc == NULL) {
ag->vertices[i].firstarc = newArcNode;
} else {
ArcNode *p = ag->vertices[i].firstarc;
while (p->nextarc != NULL) {
p = p->nextarc;
}
p->nextarc = newArcNode;
}
}
}
}
}
int main(void) {
// 构建邻接矩阵
MGraph mg;
mg.vertex_num = 5;
mg.edge_num = 7;
mg.vertex[0] = 0;
mg.vertex[1] = 1;
mg.vertex[2] = 2;
mg.vertex[3] = 3;
mg.vertex[4] = 4;
mg.edge[0][1] = 1;
mg.edge[0][2] = 1;
mg.edge[1][3] = 1;
mg.edge[1][4] = 1;
mg.edge[2][3] = 1;
mg.edge[2][4] = 1;
mg.edge[3][4] = 1;
// 转换成邻接表
ALGraph ag;
MGraphToALGraph(mg, &ag);
// 输出邻接表
printf("邻接表:\n");
for (int i = 0; i < ag.vertex_num; i++) {
printf("%d -> ", ag.vertices[i].data);
ArcNode *p = ag.vertices[i].firstarc;
while (p != NULL) {
printf("%d ", ag.vertices[p->adj_vex].data);
p = p->nextarc;
}
printf("\n");
}
return 0;
}
```
以上代码将邻接矩阵转换成邻接表并输出,可以根据需要进行修改。
阅读全文