释放C中链表中节点的分配内存
在本文中,我们将看到如何在 C 语言中释放或释放为链表中的节点分配的内存。
释放C中链表中节点的分配内存
在本文中,我们使用 free()
函数来释放由 malloc()
函数保留或分配的内存。 这意味着无论何时我们调用 malloc() 函数,我们都必须在某个时刻调用相应的 free() 函数来释放内存。
在 C 编程中使用链表时,只要调用 malloc() 函数,就会为链表的每个节点分配一个内存。 因此,每当不再需要节点或完整链表时,我们通过调用 free() 方法释放分配的内存。
假设我们有一个包含 3 个节点的链表,我们决定现在不需要这个链表。 我们可以使用循环遍历链表并释放为每个节点分配的内存。
请记住,我们不能期望通过从根节点调用 free() 函数来释放链表的整个结构。 为了实际理解它,我们使用了两个代码示例。
- 打印完整链表,释放所有节点分配的内存
- 打印当前节点,保存下一个节点的指针,释放当前节点的内存。 这意味着我们在一个循环中打印和释放分配的内存。
打印整个链表并释放分配的内存
为了实际学习这个场景,我们定义链表节点如下。 请注意,我们以递归方式定义结构,这是 C 编程允许的。
此外,我们使用 typedef struct 而不是 struct 只是为了编写更有条理和干净的代码。 typedef struct 和 struct 之间的区别在这里有详细解释。
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
相关文章
在 C 语言中使用 typedef enum
发布时间:2023/05/07 浏览次数:181 分类:C语言
-
本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。
C 语言中的 extern 关键字
发布时间:2023/05/07 浏览次数:114 分类:C语言
-
本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量
C 语言中的 #ifndef
发布时间:2023/05/07 浏览次数:186 分类:C语言
-
本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。