我有一个结构如下:
struct Node{
int *arr;
int *sol;
struct Node *Next;
};
我正在以这种方式创建Node:
Node* MyNode = (Node *)malloc(sizeof (struct Node));
MyNode->arr = malloc(sizeof(int)*N);
MyNode->sol= malloc(sizeof(int)*N);
然后我将MyNode添加到链接列表中。如何为列表中的元素释放内存 这是对的:
pop(){
free(first->arr);
free(first->sol);
first=first->Next;
}
答案 0 :(得分:4)
要使任何struct
成为linked-list
中的某个节点,您需要self-referential structure variable
,并将其声明为struct Node *next;
struct Node{
int *arr;
int *sol;
struct Node *next;
}
要为链表的节点分配内存,您需要以下内容:
/* allocate memory for a node */
struct Node * MyNode = (struct Node *)malloc((int)sizeof(struct Node));
if (MyNode == NULL) {
printf("ERROR: unable to allocate memory \n");
return 1;
}
/* allocate memory for the content of a node */
MyNode->arr = (int *) malloc((int)sizeof(int) * N);
if (MyNode->arr == NULL) {
printf("ERROR: unable to allocate memory \n");
return 1;
}
MyNode->sol = (int *) malloc((int)sizeof(int) * N);
if (MyNode->sol == NULL) {
printf("ERROR: unable to allocate memory \n");
return 1;
}
/* add the new node to a list by updating the next variable */
MyNode->next = ...
如果您不确定在链接列表中删除节点需要执行的操作,可以使用temp
变量以更简单的方式执行相同操作。
pop()
{
struct Node * temp = first;
first = first->next;
free(temp->arr);
free(temp->sol);
free(temp);
}
free
的缩略图规则 - 对于每个malloc()
,应该有free()
OTOH,要删除链接列表中的节点,请参阅this链接。
答案 1 :(得分:3)
差不多,你需要释放节点本身:
pop(){
Node* old_first = first;
free(first->arr);
free(first->sol);
first=first->Next;
free(old_first);
}
答案 2 :(得分:1)
pop(){
free(first->arr);
free(first->sol);
Node* temp = first; //<========
first=first->Next;
free (temp); //<=======
}
答案 3 :(得分:1)
它已接近但不正确 - 您应该拥有与free
一样多的malloc
s。你忘了释放Node
本身。
要解决此问题,请添加临时:
Node *next = first->next;
free(first->arr);
free(first->sol);
free(first);
first = next;