当前位置:首页 > 行业动态 > 正文

c语言怎么将链表写入文件

在C语言中,将链表写入文件的方法有很多种,这里我将介绍一种简单的方法,即使用标准库函数fwrite()和fopen()来实现,我们需要定义一个链表结构体,然后创建一个链表,并将其写入文件,以下是详细的步骤:

1、定义链表结构体

#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
    int data; // 数据域
    struct Node *next; // 指针域,指向下一个节点
} Node;

2、创建链表

// 创建一个新的节点
Node *createNode(int data) {
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode>data = data;
    newNode>next = NULL;
    return newNode;
}
// 向链表中添加节点
void addNode(Node **head, int data) {
    Node *newNode = createNode(data);
    if (*head == NULL) {
        *head = newNode;
    } else {
        newNode>next = *head;
        *head = newNode;
    }
}

3、将链表写入文件

// 将链表写入文件的函数
void writeListToFile(FILE *file, Node *head) {
    fwrite(&head, sizeof(Node *), 1, file); // 写入链表头节点的地址
    Node *current = head; // 初始化当前节点为头节点
    while (current != NULL) { // 当当前节点不为空时,继续遍历链表
        fwrite(&current>data, sizeof(int), 1, file); // 写入当前节点的数据域
        fwrite(&current>next, sizeof(Node *), 1, file); // 写入当前节点的指针域(指向下一个节点)
        current = current>next; // 将当前节点更新为下一个节点
    }
}

4、读取链表并验证写入结果

// 从文件中读取链表的函数
Node *readListFromFile(FILE *file) {
    Node *head = NULL; // 初始化链表头节点为空
    fread(&head, sizeof(Node *), 1, file); // 读取链表头节点的地址
    head = (Node *)malloc(sizeof(Node)); // 根据读取到的地址分配内存空间给头节点
    head>next = NULL; // 初始化头节点的指针域为空
    Node *current = head; // 初始化当前节点为头节点
    while (!feof(file)) { // 当文件未结束时,继续读取数据
        int data; // 临时存储读取到的数据域的值
        fread(&data, sizeof(int), 1, file); // 读取数据域的值
        current>next = (Node *)malloc(sizeof(Node)); // 根据读取到的数据域的值分配内存空间给新节点
        current>next>data = data; // 将读取到的数据域的值赋给新节点的数据域
        current>next>next = NULL; // 初始化新节点的指针域为空
        current = current>next; // 将当前节点更新为新节点
    }
    return head; // 返回链表头节点的地址
}

5、主函数,测试链表写入和读取功能

int main() {
    FILE *file = fopen("list.bin", "wb"); // 以二进制写入模式打开文件,用于写入链表数据
    if (file == NULL) {
        printf("无法打开文件!
");
        return 1;
    }
    Node *head = NULL; // 初始化链表头节点为空
    addNode(&head, 1); // 向链表中添加一个节点,数据域为1
    addNode(&head, 2); // 向链表中添加一个节点,数据域为2
    addNode(&head, 3); // 向链表中添加一个节点,数据域为3
    writeListToFile(file, head); // 将链表写入文件
    fclose(file); // 关闭文件句柄
    file = fopen("list.bin", "rb"); // 以二进制读取模式打开文件,用于读取链表数据(验证写入结果)
    if (file == NULL) {
        printf("无法打开文件!
");
        return 1;
    }
    head = readListFromFile(file); // 从文件中读取链表数据,并返回链表头节点的地址(验证写入结果)
    fclose(file); // 关闭文件句柄
    current = head; // 初始化当前节点为头节点,用于遍历链表并打印节点数据域的值(验证写入结果)
    while (current != NULL) { // 当当前节点不为空时,继续遍历链表并打印节点数据域的值(验证写入结果)
        printf("%d ", current>data); // 打印当前节点的数据域的值(验证写入结果)
        current = current>next; // 将当前节点更新为下一个节点(验证写入结果)
    }
    printf("
"); // 换行(验证写入结果)
    return 0; // 程序正常结束(验证写入结果)
}
0