用c语言编写图的存储及相互转换并打印要求是能够将客户输入(文件存储)的图的信息存入文件并读取
时间: 2024-03-01 17:54:30 浏览: 112
好的,让我来回答你的问题。
首先,我们需要了解图的存储方式。常见的图的存储方式有两种:邻接矩阵和邻接表。
邻接矩阵是一个二维数组,其中第 i 行第 j 列的元素表示第 i 个节点和第 j 个节点之间的边的权重。如果这两个节点之间没有边相连,则该元素的值为 0。
邻接表则是一个数组,每个元素都是一个链表,表示该节点连接的其他节点。
接下来,我们可以使用 C 语言来实现图的存储及相互转换。我们可以定义一个结构体来表示图,其中包含节点数量、边的数量、存储方式(邻接矩阵或邻接表)等信息。同时,我们还需要定义节点和边的结构体。
```
// 定义节点结构体
typedef struct node {
int id;
// 其他节点信息
} Node;
// 定义边结构体
typedef struct edge {
int weight;
// 其他边信息
} Edge;
// 定义图结构体
typedef struct graph {
int num_nodes;
int num_edges;
int** adj_matrix; // 邻接矩阵
Node* nodes; // 节点数组
Edge* edges; // 边数组
} Graph;
```
接下来,我们可以实现将图存储到文件中的函数。对于邻接矩阵的存储方式,我们可以将二维数组按行存储到文件中;对于邻接表的存储方式,我们可以将每个节点连接的其他节点按顺序存储到文件中。
```
// 将图存储到文件中(邻接矩阵)
void save_graph_adj_matrix(Graph* g, const char* filename) {
FILE* fp = fopen(filename, "wb");
fwrite(&g->num_nodes, sizeof(int), 1, fp);
fwrite(g->nodes, sizeof(Node), g->num_nodes, fp);
fwrite(&g->num_edges, sizeof(int), 1, fp);
for (int i = 0; i < g->num_nodes; i++) {
fwrite(g->adj_matrix[i], sizeof(int), g->num_nodes, fp);
}
fclose(fp);
}
// 将图存储到文件中(邻接表)
void save_graph_adj_list(Graph* g, const char* filename) {
FILE* fp = fopen(filename, "wb");
fwrite(&g->num_nodes, sizeof(int), 1, fp);
fwrite(g->nodes, sizeof(Node), g->num_nodes, fp);
fwrite(&g->num_edges, sizeof(int), 1, fp);
for (int i = 0; i < g->num_nodes; i++) {
int num_neighbors = 0;
for (int j = 0; j < g->num_nodes; j++) {
if (g->adj_matrix[i][j] != 0) {
num_neighbors++;
}
}
fwrite(&num_neighbors, sizeof(int), 1, fp);
for (int j = 0; j < g->num_nodes; j++) {
if (g->adj_matrix[i][j] != 0) {
fwrite(&j, sizeof(int), 1, fp);
}
}
}
fclose(fp);
}
```
最后,我们还需要实现读取文件中图的信息的函数。读取邻接矩阵存储方式的图比较简单,只需要按行读取二维数组即可。读取邻接表存储方式的图,则需要逐个读取每个节点连接的其他节点,然后构建邻接表。
```
// 从文件中读取图(邻接矩阵)
Graph* load_graph_adj_matrix(const char* filename) {
FILE* fp = fopen(filename, "rb");
Graph* g = (Graph*)malloc(sizeof(Graph));
fread(&g->num_nodes, sizeof(int), 1, fp);
g->nodes = (Node*)malloc(sizeof(Node) * g->num_nodes);
fread(g->nodes, sizeof(Node), g->num_nodes, fp);
fread(&g->num_edges, sizeof(int), 1, fp);
g->adj_matrix = (int**)malloc(sizeof(int*) * g->num_nodes);
for (int i = 0; i < g->num_nodes; i++) {
g->adj_matrix[i] = (int*)malloc(sizeof(int) * g->num_nodes);
fread(g->adj_matrix[i], sizeof(int), g->num_nodes, fp);
}
fclose(fp);
return g;
}
// 从文件中读取图(邻接表)
Graph* load_graph_adj_list(const char* filename) {
FILE* fp = fopen(filename, "rb");
Graph* g = (Graph*)malloc(sizeof(Graph));
fread(&g->num_nodes, sizeof(int), 1, fp);
g->nodes = (Node*)malloc(sizeof(Node) * g->num_nodes);
fread(g->nodes, sizeof(Node), g->num_nodes, fp);
fread(&g->num_edges, sizeof(int), 1, fp);
g->edges = (Edge*)malloc(sizeof(Edge) * g->num_edges);
int** adj_list = (int**)malloc(sizeof(int*) * g->num_nodes);
for (int i = 0; i < g->num_nodes; i++) {
adj_list[i] = NULL;
int num_neighbors;
fread(&num_neighbors, sizeof(int), 1, fp);
for (int j = 0; j < num_neighbors; j++) {
int neighbor_id;
fread(&neighbor_id, sizeof(int), 1, fp);
adj_list[i] = (int*)realloc(adj_list[i], sizeof(int) * (j+1));
adj_list[i][j] = neighbor_id;
}
}
g->adj_matrix = (int**)malloc(sizeof(int*) * g->num_nodes);
for (int i = 0; i < g->num_nodes; i++) {
g->adj_matrix[i] = (int*)calloc(g->num_nodes, sizeof(int));
for (int j = 0; j < g->num_nodes; j++) {
for (int k = 0; k < g->num_nodes; k++) {
if (adj_list[i][k] == j) {
g->adj_matrix[i][j] = 1;
break;
}
}
}
}
fclose(fp);
return g;
}
```
以上就是用 C 语言编写图的存储及相互转换的方法。如果你还有其他问题,可以继续问我哦!
阅读全文