用C语言举个例子将双向链表的数据存储在文件中,取出来是不是要构建一个双向链表 取出以及遍历
时间: 2024-02-20 14:01:37 浏览: 75
好的,这里是一个简单的C语言例子,展示如何将双向链表的数据存储在文件中,以及如何读取数据并构建双向链表,最后遍历整个链表。
假设我们有一个双向链表结构体定义如下:
```c
typedef struct Node {
int data;
struct Node* prev;
struct Node* next;
} Node;
```
我们可以将这个结构体的数据存储在文件中,例如将前驱节点指针、后继节点指针和节点数据依次存储在文件中。具体代码如下:
```c
void save_to_file(Node* head, char* file_name) {
FILE* fp = fopen(file_name, "wb");
if (fp == NULL) {
printf("Error: cannot open file %s\n", file_name);
return;
}
Node* p = head;
while (p != NULL) {
fwrite(&p->data, sizeof(int), 1, fp);
fwrite(&p->prev, sizeof(Node*), 1, fp);
fwrite(&p->next, sizeof(Node*), 1, fp);
p = p->next;
}
fclose(fp);
}
```
在上面的代码中,我们打开文件并将头结点的数据依次存储到文件中,然后遍历整个链表将每个节点的数据也存储到文件中。需要注意的是,这里的文件打开方式是二进制写入("wb"),以便于存储指针类型的数据。
接下来,我们可以使用类似的方式读取文件中的数据,并构建双向链表。具体代码如下:
```c
Node* load_from_file(char* file_name) {
FILE* fp = fopen(file_name, "rb");
if (fp == NULL) {
printf("Error: cannot open file %s\n", file_name);
return NULL;
}
Node* head = NULL;
Node* p = NULL;
while (1) {
int data;
Node* prev;
Node* next;
size_t n = fread(&data, sizeof(int), 1, fp);
if (n == 0) {
break;
}
fread(&prev, sizeof(Node*), 1, fp);
fread(&next, sizeof(Node*), 1, fp);
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
node->prev = prev;
node->next = next;
if (head == NULL) {
head = node;
}
if (p != NULL) {
p->next = node;
node->prev = p;
}
p = node;
}
fclose(fp);
return head;
}
```
在上面的代码中,我们打开文件并读取第一个节点的数据,然后根据数据构造头结点。接着,我们循环读取文件中的每个节点的数据,然后根据数据构造节点,并将其连接到链表中。需要注意的是,在构造节点时,我们需要使用malloc函数分配内存空间,以便于存储指针类型的数据。最后,我们返回构建好的双向链表。
最后,我们可以使用类似的方式遍历整个链表,例如从头结点开始遍历所有节点,并打印出节点的数据。具体代码如下:
```c
void traverse(Node* head) {
Node* p = head;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
```
在上面的代码中,我们使用一个指针变量p从头结点开始,遍历整个链表并打印出每个节点的数据。
阅读全文