使用函数释放带有双指针的链表

时间:2016-10-12 18:45:04

标签: c function linked-list free double-pointer

我很难在单个函数中删除链接中的所有成员。如果我像你在下面看到的那样分解它,它工作正常,但这似乎非常低效,并想要找出正确的方法来做到这一点。为了释放我需要具有的所有节点的功能,首先释放除头部之外的所有节点,然后使用一个函数释放头部链接。这似乎很容易,但我遇到了麻烦。

感谢您的帮助!

int main() {

    struct node *head = NULL;
    createList(&head);

    //do stuff with list

    freeListMembers(head);
    freeListHead(&head);

    return 0;
}

int createList(struct node **head) {
    //create list
    return 0;
}

void freeListMembers(struct node *head){
    while(head->next != NULL){
        head->next = NULL;
        free(head->next);  
    }
    return;  
}

void freeListHead(struct node **head) {
    *head = NULL;
    free(*head); 
    return;
}

这是我想要工作的代码,但没有。我看到的问题是“* head-> next”的错误。其中sais“表达式必须具有指向struct或union类型的指针”

int main() {

    struct node *head = NULL;
    createList(&head);

    //do stuff with list

    freeAllListMembers(&head);

    return 0;
}

int createList(struct node **head) {
    //create list
    return 0;
}

void freeAllListMembers(struct node **head){ 
    while (head != NULL) {
        struct node *temp = *head->next;
        free(*head);
        *head = temp ;
    }
   return;  
}

2 个答案:

答案 0 :(得分:1)

从你的代码:

void freeListMembers(struct node *head){
    while(head->next != NULL){
        head->next = NULL;
        free(head->next);  
    }
    return;  
}

这是释放NULL,而不是你的节点*。

释放列表就像使用指向下一个节点的临时指针一样简单。

while (head) {
    node* next = head->next;
    free(head);
    head = next;
}

从你的编辑:

void freeAllListMembers(struct node **head){ 
    while (head != NULL) {
        struct node *temp = *head->next;
        free(*head);
        *head = temp ;
    }
   return;  
}

这有几个错误。它应该是while (*head != NULL)(*head)->next。第一个是逻辑错误,因为head总是非NULL,第二个是语法错误,因为你需要在访问下一个指针之前取消引用头指针。

答案 1 :(得分:0)

这会奏效。你只需将下一个头设置为null并释放头部。现在我们无法移动到第二个元素。因此我们无法释放节点。还要检查基本条件。我希望它有所帮助

void freeListmembers(node *head){
node *temp=head;
if(head==NULL)//Base condition
return;
while(head->next!=NULL){
temp=head;//Moved temp to head. we will move head to next and free the previous node
head=head->next;
free(temp);
}
free(head);
return;

}