迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C语言 >

释放C中链表中节点的分配内存

作者:迹忆客 最近更新:2023/05/05 浏览次数:

在本文中,我们将看到如何在 C 语言中释放或释放为链表中的节点分配的内存。


释放C中链表中节点的分配内存

在本文中,我们使用 free() 函数来释放由 malloc() 函数保留或分配的内存。 这意味着无论何时我们调用 malloc() 函数,我们都必须在某个时刻调用相应的 free() 函数来释放内存。

在 C 编程中使用链表时,只要调用 malloc() 函数,就会为链表的每个节点分配一个内存。 因此,每当不再需要节点或完整链表时,我们通过调用 free() 方法释放分配的内存。

假设我们有一个包含 3 个节点的链表,我们决定现在不需要这个链表。 我们可以使用循环遍历链表并释放为每个节点分配的内存。

请记住,我们不能期望通过从根节点调用 free() 函数来释放链表的整个结构。 为了实际理解它,我们使用了两个代码示例。

  1. 打印完整链表,释放所有节点分配的内存
  2. 打印当前节点,保存下一个节点的指针,释放当前节点的内存。 这意味着我们在一个循环中打印和释放分配的内存。

打印整个链表并释放分配的内存

为了实际学习这个场景,我们定义链表节点如下。 请注意,我们以递归方式定义结构,这是 C 编程允许的。

此外,我们使用 typedef struct 而不是 struct 只是为了编写更有条理和干净的代码。 typedef structstruct 之间的区别在这里有详细解释。

typedef struct node {
    int data;
    struct node* next;
}nodes;

使用 makeList() 函数填充所有节点。 在这里,链表中只有三个节点。

struct node* makeList(){
    nodes* headNode = NULL;
    nodes* secondNode = NULL;
    nodes* thirdNode = NULL;

    headNode = malloc(sizeof(nodes));
    secondNode = malloc(sizeof(nodes));
    thirdNode = malloc(sizeof(nodes));

    headNode->data = 1;
    headNode->next = secondNode;

    secondNode->data = 2;
    secondNode->next = thirdNode;

    thirdNode->data = 3;
    thirdNode->next = NULL;

    return headNode;
}

printList() 方法(如下)遍历链表并打印每个列表节点。 在这里,我们创建了引用 headNode 的 currentNode。

然后,我们使用 while 循环来检查 currentNode 是否为 NULL。 如果不是,则打印currentNode数据并将下一个节点的地址保存在currentNode中。

这个过程一直持续到 currentNode 等于 NULL。

void printList(nodes* headNode){
    nodes* currentNode = headNode;
    while (currentNode != NULL){
        printf("The current element is %d\n", currentNode->data);
        currentNode = currentNode->next;
     }
}

打印整个链表后,freeList() 函数(如下)释放为每个节点分配的内存。

freeList() 函数检查 headNode 是否为 NULL。 如果为 NULL,则列表为空,因此我们立即从该函数返回。

其次,将 headNode 保存在 currentNode 变量中,并使 headNode 指向我们列表中紧邻的下一个节点。 我们在 headNode = headNode->next; 中进行。

第三,我们使用 free(currentNode) 安全地释放分配的内存。 现在,headNode 指向剩余的列表并返回到第一步。

void freeList(nodes* headNode){
    nodes* currentNode;
    while (headNode != NULL){
        currentNode = headNode;
        headNode = headNode->next;
        free(currentNode);
    }
}

最后,我们使用 main() 方法调用如下函数并完成目标。

int main(){
    nodes* headNode = makeList();
    printList(headNode);
    freeList(headNode);
    return 0;
}

当我们组装所有代码块时,整个程序如下所示。

#include <stdio.h>

typedef struct node {
    int data;
    struct node* next;
}nodes;

struct node* makeList(){
    nodes* headNode = NULL;
    nodes* secondNode = NULL;
    nodes* thirdNode = NULL;

    headNode = malloc(sizeof(nodes));
    secondNode = malloc(sizeof(nodes));
    thirdNode = malloc(sizeof(nodes));

    headNode->data = 1;
    headNode->next = secondNode;

    secondNode->data = 2;
    secondNode->next = thirdNode;

    thirdNode->data = 3;
    thirdNode->next = NULL;

    return headNode;
}

void printList(nodes* headNode){
    nodes* currentNode = headNode;
    while (currentNode != NULL){
        printf("The current element is %d\n", currentNode->data);
        currentNode = currentNode->next;
    }
}

void freeList(nodes* headNode){
    nodes* currentNode;
    while (headNode != NULL){
        currentNode = headNode;
        headNode = headNode->next;
        free(currentNode);
    }
}

int main(){
    nodes* headNode = makeList();
    printList(headNode);
    freeList(headNode);
    return 0;
}

输出:

The current element is 1
The current element is 2
The current element is 3

打印当前节点,保存下一个节点的指针,并释放当前节点分配的内存

在这个代码示例中,我们正在打印当前节点,保存下一个节点的地址,并释放为当前节点分配的内存。

除了两件事之外,一切都与前面的示例相同。 首先,我们没有 freeList() 函数,其次,我们有 printAndFreeList() 而不是 printList()

printAndFreeList() 函数中,我们遍历列表,打印当前节点,保存链表其余部分的指针,并释放当前节点的内存。

这个过程一直持续到找到 NULL。

void printAndFreeList(nodes* currentNode){
    nodes* tempNode;
    while (currentNode != NULL){
        tempNode = currentNode;
        printf("The current element is %d\n", currentNode->data);
        currentNode = currentNode->next;
        free(tempNode);
    }
}

整个程序如下所示。

#include <stdio.h>

typedef struct node {
    int data;
    struct node* next;
}nodes;

struct node* makeList(){
    nodes* headNode = NULL;
    nodes* secondNode = NULL;
    nodes* thirdNode = NULL;

    headNode = malloc(sizeof(nodes));
    secondNode = malloc(sizeof(nodes));
    thirdNode = malloc(sizeof(nodes));

    headNode->data = 1;
    headNode->next = secondNode;

    secondNode->data = 2;
    secondNode->next = thirdNode;

    thirdNode->data = 3;
    thirdNode->next = NULL;

    return headNode;
}

void printAndFreeList(nodes* currentNode){
    nodes* tempNode;
    while (currentNode != NULL){
        tempNode = currentNode;
        printf("The current element is %d\n", currentNode->data);
        currentNode = currentNode->next;
        free(tempNode);
    }
}

int main(){
    nodes* headNode = makeList();
    printAndFreeList(headNode);
    return 0;
}

输出:

The current element is 1
The current element is 2
The current element is 3

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C 语言中使用 typedef enum

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。

C 语言中的静态变量

发布时间:2023/05/07 浏览次数:151 分类:C语言

本文介绍了如何在 C 语言中使用静态变量。在 C 语言中使用 static 变量在函数调用之间保存变量值

C 语言中生成随机数

发布时间:2023/05/07 浏览次数:64 分类:C语言

本文演示了如何在 C 语言中生成随机数。使用 rand 和 srand 函数在 C 语言中生成随机数

C 语言中的 i++ 与++i

发布时间:2023/05/07 浏览次数:83 分类:C语言

本文演示了如何在 C 语言中使用前缀增量与后缀增量运算符。C 语言中++i 和 i++ 记号的主要区别

C 语言中获取当前工作目录

发布时间:2023/05/07 浏览次数:182 分类:C语言

本文演示了如何在 C 语言中获取当前工作目录。使用 getcwd 函数获取当前工作目录的方法

C 语言中的位掩码

发布时间:2023/05/07 浏览次数:126 分类:C语言

本文介绍了如何在 C 语言中使用位掩码。使用 struct 关键字在 C 语言中定义位掩码数据

C 语言中的排序函数

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文演示了如何在 C 语言中使用标准库排序函数。使用 qsort 函数对 C 语言中的整数数组进行排序

C 语言中的 extern 关键字

发布时间:2023/05/07 浏览次数:114 分类:C语言

本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量

C 语言中的 #ifndef

发布时间:2023/05/07 浏览次数:186 分类:C语言

本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便