2015-11-20 5 views
2

У меня есть связанный список со списком песен, который я пытаюсь удалить, однако, когда я его тестирую, мои данные все еще там, а не освобождены.Удалены все узлы в связанном списке

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; 
} 
+1

вы никогда не измените переменную головы. Вы берете копию указателя на голову, а затем NULL на первой итерации deleteAllNodes – Alexguitar

ответ

2

В функции вызова, head будет по-прежнему указывает на ячейку памяти первого узла, даже если ваши узлы освобождаются. Для того, чтобы изменить head в вызывающей функции, у вас есть два варианта:

1) Установите head = deleteAllNodes(head);

2) передать указатель на head, и изменить deleteAllNodes(Node *head) в deleteAllNodes(Node **head). Затем в функции вы можете установить *head = NULL.

+0

спасибо, что я просто понял это! – SoundSync

0

Чтобы правильно манипулировать головой, нам нужно передать указатель на память вызывающего абонента (указатель на голову) вместо его копии. попробуйте Node * deleteAllNode (Node ** head) и при вызове функции попробуйте deleteALLNode (& head).

0

Вы должны использовать одно из следующих решений:

  • пройти вар по ссылке:

    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(); 
Смежные вопросы