下面我将详细讲解C语言实现链表与文件存取的示例代码的完整攻略。
链表的实现
创建链表
首先我们需要创建链表,在C语言中,链表是由节点(node)组成的,每个节点包含两个部分:一个是数据部分(data),另一个是指向下一个节点的指针(next)。我们可以使用结构体来定义一个节点:
typedef struct Node {
int data;
struct Node* next;
} Node;
接着我们可以编写创建链表的函数:
Node* create_list(int data) {
Node* p = (Node*)malloc(sizeof(Node));
if (p) {
p->data = data;
p->next = NULL;
}
return p;
}
我们通过malloc函数动态分配内存来创建一个节点,然后将数据部分赋值为data,将指针部分设置为NULL,最后返回刚才创建的节点。
添加节点
在链表尾部添加一个节点的函数实现如下:
void add_node(Node** head, int data) {
Node** p = head;
while (*p) {
p = &((*p)->next);
}
*p = (Node*)malloc(sizeof(Node));
(*p)->data = data;
(*p)->next = NULL;
}
上述函数中的head参数是一个指向指针的指针,即head本身存储的是指针的地址,因此head所指向的指针可以随着链表的变化而变化。添加节点时,我们首先通过循环找到当前链表的最后一个节点,然后创建一个新的节点并将它的地址赋值为当前节点的下一个节点。
删除节点
删除链表中指定数据的节点函数实现如下:
void delete_node(Node** head, int data) {
Node** p = head;
while (*p) {
if ((*p)->data == data) {
Node* tmp = *p;
*p = (*p)->next;
free(tmp);
break;
}
p = &((*p)->next);
}
}
上述函数中的head同样是一个指向指针的指针,我们通过循环找到需要删除的节点并删除它。需要注意的是,删除节点时需要将该节点从链表中移除,并释放该节点占用的内存空间。
文件读写
文件的打开与关闭
在C语言中,我们使用fopen函数打开文件,它的定义如下:
FILE* fopen(const char* filename, const char* mode);
其中,filename表示要打开的文件名,mode指定文件打开的模式,它可以是以下值之一:
- "r" 表示只读模式
- "w" 表示写入模式,会覆盖同名文件
- "a" 表示追加模式,会将数据追加到文件末尾
使用完文件后,我们需要使用fclose函数关闭文件。
int fclose(FILE* stream);
文件读取与写入
在打开文件后,我们可以使用fread和fwrite函数来读取和写入文件。下面是这两个函数的定义:
size_t fread(void* ptr, size_t size, size_t count, FILE* stream);
size_t fwrite(const void* ptr, size_t size, size_t count, FILE* stream);
其中,ptr是一个指向存储数据的缓冲区的指针,size是每个数据项的大小,count是要读取或写入的数据项的数量,stream是文件指针。当读取成功时,这两个函数会返回实际读取或写入的数据项数量。
示例代码
我们可以使用上述链表和文件读写知识来实现一个简单的示例代码。以下是一个将链表写入文件并从文件中读取链表的例子:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
void add_node(Node** head, int data) {
Node** p = head;
while (*p) {
p = &((*p)->next);
}
*p = (Node*)malloc(sizeof(Node));
(*p)->data = data;
(*p)->next = NULL;
}
int main() {
Node* head = NULL;
add_node(&head, 1);
add_node(&head, 2);
add_node(&head, 3);
FILE* fout = fopen("out.bin", "wb"); // 打开二进制文件用于写入
fwrite(&head, sizeof(Node*), 1, fout); // 将链表写入文件
fclose(fout); // 关闭文件
Node* new_head = NULL;
FILE* fin = fopen("out.bin", "rb"); // 打开二进制文件用于读取
fread(&new_head, sizeof(Node*), 1, fin); // 从文件中读取链表
fclose(fin); // 关闭文件
Node* p = new_head;
while (p) {
printf("%d ", p->data);
Node* tmp = p;
p = p->next;
free(tmp);
}
printf("\n");
return 0;
}
在这个例子中,我们将链表写入名为 out.bin 的二进制文件中,并从文件中读取链表。需要注意的是,我们要使用二进制文件模式打开文件,因为链表指针的内存地址是一个指针类型,使用文本文件模式无法正确读取它。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现链表与文件存取的示例代码 - Python技术站