C语言实现链表与文件存取的示例代码

下面我将详细讲解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技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • R语言拼接字符串_paste的用法说明

    当然!下面是关于\”R语言拼接字符串 paste 的用法说明\”的完整攻略: R语言拼接字符串 paste 的用法说明 paste 函数是R语言中用于拼接字符串的常用函数。以下是使用 paste 函数的示例: 示例1:拼接字符串 name <- \"John\" age <- 25 result <- paste(\&q…

    other 2023年8月19日
    00
  • devicenotfound解决方案

    以下是详细讲解“devicenotfound解决方案的完整攻略,过程中至少包含两条示例说明”的标准Markdown格式文本: DeviceNotFound 解决方案 在 Android 开发中,有时会遇到 DeviceNotFound 的错误,这通常是由于 Android Studio 无法连接到设备或模拟器导致的。本攻略将介绍如何解决 DeviceNotF…

    other 2023年5月10日
    00
  • 使用goodfeaturestotrack进行关键点检测—29

    使用goodfeaturestotrack进行关键点检测—29 引言 图像处理中的关键点检测是一个重要的研究领域,能够帮助我们在图像中发现有意义的区域并提取出这些区域的特征。其中,goodfeaturestotrack(GFT)算法是一种常用的关键点检测算法,本文将介绍如何使用GFT算法进行关键点检测。 GFT算法原理 GFT算法是一种基于角点检测的关键…

    其他 2023年3月29日
    00
  • premiere多个素材怎么进行嵌套?

    Premiere多个素材的嵌套攻略 在Adobe Premiere Pro中,嵌套是一种将多个素材组合在一起的方法,以便更方便地进行编辑和处理。下面是一个详细的攻略,介绍如何在Premiere中嵌套多个素材。 步骤1:创建一个新的序列 首先,打开Premiere并创建一个新的序列。在菜单栏中选择“文件(File)”>“新建(New)”>“序列(S…

    other 2023年7月27日
    00
  • 详解C++ 编写String 的构造函数、拷贝构造函数、析构函数和赋值函数

    让我来详细讲解如何编写 C++ String 的构造函数、拷贝构造函数、析构函数和赋值函数。 构造函数 C++ 中的构造函数是一个特殊的成员函数,用于初始化对象的数据成员。对于 String 类来说,我们需要提供多个不同的构造函数来满足各种使用场景。 默认构造函数 默认构造函数是一个不带参数的构造函数,当我们创建一个没有指定参数的 String 对象时,就会…

    other 2023年6月26日
    00
  • c++学习(八)(c语言部分)之图形库

    下面是关于 C++ 学习(八)(C 语言部分)之图形库的完整攻略,包含两个示例说明。 图形库 在 C 语言中,你可以使用图形库来创建基本的图形界面。图形库是一个软件库,它提供了一组函数,可以用来绘制图形、文本和其他图形元素。在 Windows 系统中,你可以使用 WinAPI 来创建图形界面,在 Linux 系统中,你可以使用 X Window System…

    other 2023年5月8日
    00
  • 使用vscode调试javascript的三种方式

    使用 VS Code 调试 JavaScript 的三种方式 在开发 JavaScript 应用程序时,出现错误是常见的情况,却不总是容易解决。为了快速解决这些问题,我们需要一个好的调试工具。在本文中,我们将讨论使用 VS Code 调试 JavaScript 的三种方式。 方式一:内置调试器 VS Code 内置了一个强大的调试器,可以通过配置文件的方式轻…

    其他 2023年3月29日
    00
  • 使用PowerShell操作Windows服务的命令小结

    下面是使用PowerShell操作Windows服务的命令小结的完整攻略。 命令小结 获取服务列表 使用 Get-Service 命令可以列出当前系统中所有的服务及其状态。 例如,想要查询所有服务的状态信息,可以执行以下命令: Get-Service 启动服务 使用 Start-Service 命令来启动指定的服务。 例如,将服务名为 Spooler 的服务…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部