我有一个歌曲库链接列表,我试图删除它,但是当我测试它时,我的数据仍然存在并且没有释放。
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;
}
答案 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();