如何使用双指针清除链表?

时间:2013-02-04 03:52:29

标签: c pointers linked-list

您好我正在尝试创建一个清除*first将指向的链接列表的函数,然后应释放节点**first并将指针*first设置为{{ 1}}。

我无法抓住双指针而无法使其正常工作。

2 个答案:

答案 0 :(得分:3)

您必须在删除节点之前移至下一个列表元素。否则,您正在访问已释放的内存。

while( *first != NULL )
{
    temp = *first;
    *first = temp->next;
    free(temp);
}

请注意,因为您正在废弃整个列表,*first最终将为NULL。因此,您可以使用单指针(就像temp)遍历列表,然后在结尾处设置*first = NULL。这节省了额外的指针间接,在这种情况下可能会浪费CPU。

[edit] 我的意思是:

struct node *curr = *first;
struct node *prev;            

while( curr != NULL )
{
    prev = curr;
    curr = curr->next;
    free(prev);
}

*first = NULL;

一般来说,我发现你指向的指针越少,代码就越容易理解。

答案 1 :(得分:0)

node* remove_node(node **double_pointer,int search_value)
//pass head of your node as a parameter to double pointer
{while(*double_pointer && **(double_pointer).value!=search_value)
{
double_pointer=&((**double_pointer)->next);
}
if(**double_pointer!=null)
{//lines below are to delete the node which contains our search value
node* deleted_node=*double_pointer;
*double_pointer=*double_pointer->next;
return deleted node;
}}