C语言创建图的邻接矩阵,设计算法自动生成邻接表。要求能够打印图的邻接矩阵和邻接表,进行验证
时间: 2024-06-08 20:11:04 浏览: 92
以下是C语言实现自动生成邻接表的算法:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20
// 定义邻接矩阵结构体
typedef struct {
int vertex[MAX_VERTEX_NUM]; // 存储顶点信息
int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 存储边信息
int vertex_num; // 顶点数
int edge_num; // 边数
} MGraph;
// 定义邻接表结构体
typedef struct {
int vertex; // 存储顶点信息
struct ArcNode *first_arc; // 指向第一个邻接点的指针
} VNode;
typedef struct ArcNode {
int adjvex; // 存储邻接点在vertex数组中的下标
struct ArcNode *next; // 指向下一个邻接点的指针
} ArcNode;
typedef struct {
VNode adj_list[MAX_VERTEX_NUM]; // 存储邻接表信息
int vertex_num; // 顶点数
int edge_num; // 边数
} ALGraph;
void generate_adj_list(MGraph *mg, ALGraph *ag);
void print_matrix(MGraph *mg);
void print_adj_list(ALGraph *ag);
int main() {
MGraph mg = {
{0, 1, 2, 3, 4}, // 顶点信息
{
{0, 1, 1, 0, 0},
{1, 0, 0, 1, 1},
{1, 0, 0, 1, 0},
{0, 1, 1, 0, 1},
{0, 1, 0, 1, 0}
}, // 边信息
5, // 顶点数
7 // 边数
};
ALGraph ag;
generate_adj_list(&mg, &ag);
printf("邻接矩阵:\n");
print_matrix(&mg);
printf("\n邻接表:\n");
print_adj_list(&ag);
return 0;
}
// 根据邻接矩阵生成邻接表
void generate_adj_list(MGraph *mg, ALGraph *ag) {
ag->vertex_num = mg->vertex_num;
ag->edge_num = mg->edge_num;
for (int i = 0; i < ag->vertex_num; i++) {
ag->adj_list[i].vertex = mg->vertex[i];
ag->adj_list[i].first_arc = NULL;
ArcNode *last_arc = NULL; // 指向上一个邻接点的指针
for (int j = 0; j < ag->vertex_num; j++) {
if (mg->edge[i][j] != 0) {
ArcNode *arc = (ArcNode *) malloc(sizeof(ArcNode));
arc->adjvex = j;
arc->next = NULL;
if (last_arc == NULL) { // 如果是第一个邻接点
ag->adj_list[i].first_arc = arc;
} else {
last_arc->next = arc;
}
last_arc = arc;
}
}
}
}
// 打印邻接矩阵
void print_matrix(MGraph *mg) {
for (int i = 0; i < mg->vertex_num; i++) {
for (int j = 0; j < mg->vertex_num; j++) {
printf("%d ", mg->edge[i][j]);
}
printf("\n");
}
}
// 打印邻接表
void print_adj_list(ALGraph *ag) {
for (int i = 0; i < ag->vertex_num; i++) {
printf("%d -> ", ag->adj_list[i].vertex);
ArcNode *arc = ag->adj_list[i].first_arc;
while (arc != NULL) {
printf("%d -> ", ag->adj_list[arc->adjvex].vertex);
arc = arc->next;
}
printf("NULL\n");
}
}
```
运行结果:
```
邻接矩阵:
0 1 1 0 0
1 0 0 1 1
1 0 0 1 0
0 1 1 0 1
0 1 0 1 0
邻接表:
0 -> 1 -> 2 -> NULL
1 -> 0 -> 3 -> 4 -> NULL
2 -> 0 -> 3 -> NULL
3 -> 1 -> 2 -> 4 -> NULL
4 -> 1 -> 3 -> NULL
```
阅读全文