1

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

我无法更改

无效销毁(节点 *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;
    }
}

提前致谢。

4

2 回答 2

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 正确终止。

于 2013-10-22T10:25:37.753 回答
1

问题是这条线

curr = head->next;

在这里,您curr指向下一个节点。您需要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

于 2013-10-22T10:03:36.570 回答