删除链表中的每个节点

时间:2015-11-20 17:01:12

标签: c linked-list

我有一个歌曲库链接列表,我试图删除它,但是当我测试它时,我的数据仍然存在并且没有释放。

deleteAllNodes(head);
if (head == NULL)
    printMusicLibraryEmpty();

我试图测试一下如果我的头现在为空,我会打印我的空信息,但是现在它不打印,这意味着数据没有被删除。

Node *deleteAllNodes(Node *head) {
while (head != NULL) {
    Node *firstNode = head;
    songNameDeleted(firstNode -> songName);
    head = head -> link;
    free(firstNode);
    firstNode = NULL;
}
return NULL;
} 

3 个答案:

答案 0 :(得分:2)

在您的调用函数中,即使您的节点全部被释放,head仍将指向第一个节点的内存位置。要在调用函数中更改head,您有两个选择:

1)设置head = deleteAllNodes(head);

2)将指针传递给head,然后将deleteAllNodes(Node *head)更改为deleteAllNodes(Node **head)。在函数中,您可以设置*head = NULL

答案 1 :(得分:0)

为了正确操作头部,我们需要将指针传递给调用者的内存(指向头部的指针)而不是它的副本。 在调用函数时尝试Node * deleteAllNode(Node ** head) 尝试deleteALLNode(& head)。

答案 2 :(得分:0)

您应该使用以下解决方案之一:

  • 通过引用传递var:

    Node *deleteAllNodes(Node **head) 
    {
        while (head != NULL) {
            Node *firstNode = *head;
            songNameDeleted(firstNode -> songName);
            *head = *head->link;
            free(firstNode);
            firstNode = NULL;
        }
        return NULL;
    }

功能调用:

deleteAllNodes(&head); //pass var by reference
if (head == NULL)
    printMusicLibraryEmpty();
  • 函数返回头值:

    Node *deleteAllNodes(Node *head) {
        while (head != NULL) {
            Node *firstNode = head;
            songNameDeleted(firstNode -> songName);
            head = head -> link;
            free(firstNode);
            firstNode = NULL;
        }
        return head;
    }

功能调用:

head = deleteAllNodes(head); //value returned by function
if (head == NULL)
    printMusicLibraryEmpty();