C语言有向图的文件存储
时间: 2023-09-06 20:07:40 浏览: 101
数据结构-c语言-带main函数-图7.2-图的存储结构-图的邻接矩阵的创建-有向图。
5星 · 资源好评率100%
在 C 语言中,可以使用文件来存储有向图的信息。一种常见的方式是使用邻接表来表示有向图,然后将邻接表存储到文件中。
具体地,可以使用一个结构体来表示邻接表的每个节点,其中包括节点的值以及指向该节点的所有边。然后,可以将所有节点的信息按照一定的格式写入文件中,例如每一行表示一个节点,节点的值和指向该节点的边可以用空格或制表符分隔开。
当需要读取文件中的有向图信息时,可以按照相同的格式读取每一行,然后根据节点值和边的信息构建邻接表。
下面是一个简单的示例代码,实现了将有向图存储到文件和从文件中读取有向图信息的功能:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_NODES 100
// 邻接表节点结构体
typedef struct Node {
int value; // 节点的值
struct Edge* edges; // 指向该节点的所有边
} Node;
// 边结构体
typedef struct Edge {
int to; // 边的终点节点
struct Edge* next; // 指向下一条边
} Edge;
// 将有向图存储到文件
void save_graph(Node* nodes, int num_nodes, const char* filename) {
FILE* fp = fopen(filename, "w");
if (fp == NULL) {
printf("Failed to open file %s\n", filename);
return;
}
// 逐个节点写入文件
for (int i = 0; i < num_nodes; i++) {
// 写入节点的值
fprintf(fp, "%d", nodes[i].value);
// 写入节点指向的所有边
Edge* edge = nodes[i].edges;
while (edge != NULL) {
fprintf(fp, " %d", edge->to);
edge = edge->next;
}
fprintf(fp, "\n");
}
fclose(fp);
}
// 从文件中读取有向图信息
Node* load_graph(int* num_nodes, const char* filename) {
FILE* fp = fopen(filename, "r");
if (fp == NULL) {
printf("Failed to open file %s\n", filename);
return NULL;
}
Node* nodes = (Node*)malloc(sizeof(Node) * MAX_NODES);
int count = 0;
// 逐行读取文件
char line[100];
while (fgets(line, sizeof(line), fp) != NULL) {
int value, to;
// 解析节点的值
if (sscanf(line, "%d", &value) != 1) {
printf("Error: invalid file format\n");
fclose(fp);
return NULL;
}
// 创建新节点
nodes[count].value = value;
nodes[count].edges = NULL;
// 解析节点指向的边
char* ptr = line;
while (*ptr != '\0') {
if (sscanf(ptr, "%d", &to) == 1) {
Edge* edge = (Edge*)malloc(sizeof(Edge));
edge->to = to;
edge->next = nodes[count].edges;
nodes[count].edges = edge;
}
ptr++;
}
count++;
}
fclose(fp);
*num_nodes = count;
return nodes;
}
int main() {
// 创建一个有向图
Node nodes[] = {
{1, NULL},
{2, NULL},
{3, NULL},
{4, NULL}
};
nodes[0].edges = (Edge*)malloc(sizeof(Edge));
nodes[0].edges->to = 1;
nodes[0].edges->next = (Edge*)malloc(sizeof(Edge));
nodes[0].edges->next->to = 3;
nodes[0].edges->next->next = NULL;
nodes[1].edges = (Edge*)malloc(sizeof(Edge));
nodes[1].edges->to = 2;
nodes[1].edges->next = NULL;
nodes[2].edges = (Edge*)malloc(sizeof(Edge));
nodes[2].edges->to = 3;
nodes[2].edges->next = NULL;
nodes[3].edges = (Edge*)malloc(sizeof(Edge));
nodes[3].edges->to = 0;
nodes[3].edges->next = (Edge*)malloc(sizeof(Edge));
nodes[3].edges->next->to = 2;
nodes[3].edges->next->next = NULL;
// 将有向图存储到文件
save_graph(nodes, 4, "graph.txt");
// 从文件中读取有向图信息
int num_nodes;
Node* loaded_nodes = load_graph(&num_nodes, "graph.txt");
if (loaded_nodes != NULL) {
// 打印读取的节点信息
for (int i = 0; i < num_nodes; i++) {
printf("Node %d: %d -> ", i, loaded_nodes[i].value);
Edge* edge = loaded_nodes[i].edges;
while (edge != NULL) {
printf("%d ", edge->to);
edge = edge->next;
}
printf("\n");
}
free(loaded_nodes);
}
return 0;
}
```
阅读全文