在C中学习关于链表的教程。我已经编译了这段代码并通过valgrind运行它。它显示了4个分配和0个释放,我理解。我需要知道如何正确地调用free()
来解除分配。
代码示例:llist2.c
// linked list: inserting at the n'th position
#include "stdio.h"
#include "stdlib.h"
typedef struct Node
{
int data;
struct Node* next;
} Node;
Node* head;
void Insert(int data, int n)
{
Node* temp1 = malloc(sizeof(Node));
temp1->data = data;
temp1->next = NULL;
if(n==1) { // list is empty, set next to head, initially NULL.
temp1->next = head;
head = temp1;
return;
}
Node* temp2 = head;
for(int i = 0; i < n-2; i+=1) {
temp2 = temp2->next;
}
temp1->next = temp2->next;
temp2->next = temp1;
}
void Print() {
Node* temp = head;
while(temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
int main (int argc, char *argv[])
{
head = NULL;
Insert(2,1);
Insert(3,2);
Insert(4,1);
Insert(5,2);
Print();
return 0;
}
答案 0 :(得分:2)
完成使用已分配的内容后,您应该取消分配。按照列表并取消分配。
例如,您可以在调用Deallocate()
后调用此函数Print()
。
void Deallocate() {
Node* temp = head;
while(temp != NULL) {
Node* next = temp->next;
free(temp);
temp = next;
}
head = NULL;
}
请注意,你不能这样做
void Deallocate_bad() {
Node* temp = head;
while(temp != NULL) {
free(temp);
temp = temp->next; /* undefined behavior */
}
head = NULL;
}
因为您在取消分配temp->next
后无法访问temp
。
答案 1 :(得分:2)
您需要创建一个功能来释放您的列表。
void freelist(Node* head)
{
Node *next,*curr;
curr = head;
while (curr != NULL)
{
next = curr -> next;
free(curr);
curr = next;
}
}
你最后可以在main中调用它。
int main (int argc, char *argv[])
{
// Other code
freelist(head);
head = NULL;
return 0;
}