在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)