在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(¤t>data, sizeof(int), 1, file); // 写入当前节点的数据域 fwrite(¤t>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)