用C语言编写输入邻接表转换为邻接矩阵
时间: 2024-02-20 12:57:00 浏览: 69
好的,下面是用C语言编写输入邻接表转换为邻接矩阵的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 定义最大顶点数
// 定义邻接表中的节点
typedef struct ArcNode {
int adjvex; // 相邻节点编号
struct ArcNode *next; // 指向下一个相邻节点的指针
} ArcNode;
// 定义邻接表中的头节点
typedef struct VNode {
int data; // 顶点信息
ArcNode *first; // 指向第一个相邻节点的指针
} VNode, AdjList[MAX_VERTEX_NUM];
// 定义邻接表
typedef struct {
AdjList vertices; // 顶点数组
int vexnum, arcnum; // 定义顶点数和边数
} ALGraph;
// 定义邻接矩阵
typedef struct {
int **arcs; // 存放矩阵的二维数组
int n; // 矩阵的维数
} MGraph;
// 将邻接表转换为邻接矩阵
void Convert(ALGraph *G, MGraph *M) {
int i, j;
M->n = G->vexnum; // 矩阵维数等于顶点数
M->arcs = (int **)malloc((M->n) * sizeof(int *)); // 动态分配二维数组空间
for(i = 0; i < M->n; i++) {
M->arcs[i] = (int *)malloc((M->n) * sizeof(int));
for(j = 0; j < M->n; j++) {
M->arcs[i][j] = 0; // 初始化矩阵
}
}
for(i = 0; i < G->vexnum; i++) {
ArcNode *p = G->vertices[i].first;
while(p != NULL) {
M->arcs[i][p->adjvex] = 1; // 将相邻节点的位置赋值为1
p = p->next;
}
}
}
// 主函数
int main() {
int i, j, k, n, m, v, w;
ALGraph G;
MGraph M;
printf("请输入顶点数和边数:\n");
scanf("%d%d", &n, &m);
G.vexnum = n; G.arcnum = m;
printf("请输入顶点信息:\n");
for(i = 0; i < G.vexnum; i++) {
scanf("%d", &G.vertices[i].data);
G.vertices[i].first = NULL;
}
printf("请输入边的信息:\n");
for(k = 0; k < G.arcnum; k++) {
scanf("%d%d", &v, &w);
v--; w--; // 顶点编号从0开始
ArcNode *p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = w;
p->next = G.vertices[v].first;
G.vertices[v].first = p;
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = v;
p->next = G.vertices[w].first;
G.vertices[w].first = p;
}
Convert(&G, &M);
printf("邻接矩阵为:\n");
for(i = 0; i < M.n; i++) {
for(j = 0; j < M.n; j++) {
printf("%d ", M.arcs[i][j]);
}
printf("\n");
}
return 0;
}
```
以上代码可以实现将输入的邻接表转换为邻接矩阵,并输出矩阵。其中,输入的邻接表中,每个节点存储了一个顶点的信息和指向第一个相邻节点的指针;输入的邻接矩阵中,每个位置存储了两个顶点之间是否有边。
阅读全文