c-删除了链接列表中的每个节点



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

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

我试着测试一下,如果我的头现在为NULL,我会打印我的空消息,但现在它没有打印,这意味着数据没有被擦除。

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

在您的调用函数中,head仍然会指向第一个节点的内存位置,即使您的节点都已释放。要更改调用函数中的head,您有两个选项:

1) 设置head = deleteAllNodes(head);

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

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

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

  • 通过引用传递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();

相关内容

  • 没有找到相关文章

最新更新