让我们说我有一些数据结构,其中结构有指向其他结构的指针,例如链表。列表中的每个元素都有一个指向列表中另一个元素的指针
struct node{
char* data;
node* next;
};
当释放分配给这个结构的内存时,我知道我需要首先专门释放数据,因为我必须专门为它分配内存。但接下来呢?它指向另一个节点,我相信释放它会释放下一个指向的实际节点。
清理时是否足以释放整个节点,或者是否有任何方法可以释放指针而不释放它指向的结构?
答案 0 :(得分:4)
这取决于你如何在内存中构建结构。任何malloc
都必须与free
保持平衡。一旦指向next
节点被释放,它就不再有效。
// create root
node* n1 = calloc(1, sizeof(node));
// create/link another node
n1->next = calloc(1, sizeof(node));
// destroy/unlink 2nd node
free(n1->next);
n1->next = NULL;
// destroy 1st node
free(n1);
答案 1 :(得分:3)
没有像释放指针这样的东西,你只能释放内存一个指针指向 - 所以如果你想删除一个链表的单个元素,您必须更新上一项的next
指针,以便在删除之前指向要删除的元素的next
(可能是NULL
)。
void deleteNode(struct node **list, struct node *element)
{
/* first node? */
if (element == *list)
{
*list = element->next;
free(element->data);
free(element);
/* now list points to the second element, if any */
}
else
{
/* find previous node */
struct node *p = *list;
while (p->next != element) p = p->next;
/* adjust next pointer */
p->next = element->next;
free(element->data);
free(element);
}
}
请注意,使用单链接列表不适用于具有随机删除的大型列表,因为您必须每次从头开始搜索列表。
为了删除整个链接列表,有一个迭代和递归方法,但我没有在这里显示代码,因为我理解你的问题,这不是你想要做的。 / p>