销毁完整的链表(c编程)

时间:2013-10-22 10:01:16

标签: c

我是C编程的初学者,我对指针有点困惑。我正在尝试创建一个删除链接列表的所有元素的函数。但是我的代码会删除除头部以外的所有元素。

我无法改变

  

void destroy(node * h)

由于作业标题引起的参数。

void destroy(set_element* head){
    set_element* temp ;
    set_element* curr = head;

    if(head){
        curr = head->next;
        head->next = NULL;

        while(curr !=NULL){
            temp = curr->next;
            free(curr);
            curr = temp;
        }
        head =NULL;
    }
}
提前谢谢。

2 个答案:

答案 0 :(得分:1)

问题在于这一行

curr = head->next;

在此,您curr指向 next 节点。您需要将curr直接指向head

该功能的更简单版本可能是例如这样:

void destroy(set_element **head)
{
    set_element *next;
    for (set_element *curr = *head; curr; curr = next)
    {
        next = curr->next;
        free(curr);
    }

    *head = NULL;
}

请注意,我通过引用传递head指针,否则对NULL的赋值只会更改指针的本地副本。

答案 1 :(得分:1)

如果您要做的只是删除整个链接列表(包括头节点)并且不关心调用者是否留有悬空指针,这会变得非常简单:

void destroy(set_element* head)
{
    set_element* temp;
    while (head)
    {
        temp = head;
        head = head->next;
        free(temp);
    }
}

在来电方面调用:

destroy(head);

也就是说,如果要修改调用者传入指针,则无法使用此函数签名执行此操作。与C中的所有其他内容(数组不能承受)一样,参数按值传递,如果需要修改调用者数据,则参数必须是指针,传入的值是地址:

void destroy(set_element** headp)
{
    set_element* temp;
    while (*headp)
    {
        temp = *headp;
        *headp = temp->next;
        free(temp);
    }
}

在调用者方面调用

destroy(&head);

这两个都假设您的列表已正确终止为NULL。