用C语言多板块编写邻接表和邻接矩阵的相互转换并打印并可以将输图的入信息保存至文件
时间: 2024-02-24 14:59:12 浏览: 56
以下是一个简单的示例程序,用于将邻接表转换为邻接矩阵并将图的信息保存到文件中。请注意,此程序假定输入的邻接表和邻接矩阵都是有向图。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 100
// 邻接表节点
typedef struct Node {
int vertex;
struct Node* next;
} Node;
// 邻接表
typedef struct {
Node* head;
} List;
// 邻接矩阵
typedef int Matrix[MAX_VERTICES][MAX_VERTICES];
// 将邻接表转换为邻接矩阵
void list_to_matrix(List* list, Matrix mat, int n) {
int i, j;
Node* node;
// 初始化矩阵
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
mat[i][j] = 0;
}
}
// 遍历邻接表,将边添加到邻接矩阵中
for (i = 0; i < n; i++) {
node = list[i].head;
while (node != NULL) {
mat[i][node->vertex] = 1;
node = node->next;
}
}
}
// 将邻接矩阵转换为邻接表
void matrix_to_list(Matrix mat, List* list, int n) {
int i, j;
Node* node;
// 初始化邻接表
for (i = 0; i < n; i++) {
list[i].head = NULL;
}
// 遍历邻接矩阵,将边添加到邻接表中
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (mat[i][j] == 1) {
node = (Node*)malloc(sizeof(Node));
node->vertex = j;
node->next = list[i].head;
list[i].head = node;
}
}
}
}
// 打印邻接表
void print_list(List* list, int n) {
int i;
Node* node;
for (i = 0; i < n; i++) {
printf("%d: ", i);
node = list[i].head;
while (node != NULL) {
printf("%d ", node->vertex);
node = node->next;
}
printf("\n");
}
}
// 打印邻接矩阵
void print_matrix(Matrix mat, int n) {
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("%d ", mat[i][j]);
}
printf("\n");
}
}
// 保存图的信息到文件中
void save_graph(List* list, Matrix mat, int n, char* filename) {
int i, j;
FILE* fp;
fp = fopen(filename, "w");
fprintf(fp, "邻接表:\n");
for (i = 0; i < n; i++) {
fprintf(fp, "%d: ", i);
Node* node = list[i].head;
while (node != NULL) {
fprintf(fp, "%d ", node->vertex);
node = node->next;
}
fprintf(fp, "\n");
}
fprintf(fp, "\n邻接矩阵:\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
fprintf(fp, "%d ", mat[i][j]);
}
fprintf(fp, "\n");
}
fclose(fp);
}
int main() {
int n = 5;
List list[MAX_VERTICES];
Matrix mat;
int i, j;
// 初始化邻接表
for (i = 0; i < n; i++) {
list[i].head = NULL;
}
// 添加边到邻接表中
list[0].head = (Node*)malloc(sizeof(Node));
list[0].head->vertex = 1;
list[0].head->next = (Node*)malloc(sizeof(Node));
list[0].head->next->vertex = 2;
list[0].head->next->next = NULL;
list[1].head = (Node*)malloc(sizeof(Node));
list[1].head->vertex = 2;
list[1].head->next = NULL;
list[2].head = (Node*)malloc(sizeof(Node));
list[2].head->vertex = 3;
list[2].head->next = NULL;
list[3].head = (Node*)malloc(sizeof(Node));
list[3].head->vertex = 4;
list[3].head->next = (Node*)malloc(sizeof(Node));
list[3].head->next->vertex = 1;
list[3].head->next->next = NULL;
list[4].head = NULL;
// 将邻接表转换为邻接矩阵并打印
list_to_matrix(list, mat, n);
printf("邻接矩阵:\n");
print_matrix(mat, n);
// 将邻接矩阵转换为邻接表并打印
matrix_to_list(mat, list, n);
printf("邻接表:\n");
print_list(list, n);
// 将图的信息保存到文件中
save_graph(list, mat, n, "graph.txt");
return 0;
}
```
说明:
- 该程序使用邻接表和邻接矩阵表示一个简单的有向图,并将其转换为另一种表示形式。
- `list_to_matrix()` 函数将邻接表转换为邻接矩阵, `matrix_to_list()` 函数将邻接矩阵转换为邻接表。
- `print_list()` 和 `print_matrix()` 函数分别用于打印邻接表和邻接矩阵。
- `save_graph()` 函数将图的信息保存到文件中。在该函数中,我们使用 `fprintf()` 函数将信息写入文件。
- 在主函数中,我们首先使用邻接表表示图,然后将其转换为邻接矩阵并打印。接下来,我们将邻接矩阵转换回邻接表并打印。最后,我们将图的信息保存到名为 `graph.txt` 的文件中。
请注意,这只是一个简单的示例程序,您需要根据实际需求进行修改和扩展。
阅读全文