2013-08-07 7 views
2

Просто хочу знать, если есть какие-либо недоработки/несоответствия/утечки памяти в этой реализации удаления связанного списка:Могу ли я удалить связанный список?

// Function to delete the entire linked list 
void deleteList(Node** head) { 

    Node* current = *head; 
    Node* next; 

    while (current != 0) { 

     next = current->next; 
     delete current; 
     current = next; 

    } 

    *head = 0; 
} 

Edit:

struct Node { 

    int data; 
    Node* next; 
    Node(int data) : data(data){} 

}; 
+4

Будет сложно ответить на это с уверенностью без определения «Node» –

+2

@TimothyJones: Я подниму ваше «тяжелое» на «невозможно». –

+0

@TimothyJones отредактировал – Oleksiy

ответ

1

Было бы C++ если вы указатель указателя поворота по указателю, а не указателем:

void deleteList(Node * & head) 
{ 
    // (...) 

    head = nullptr; // NULL in C++ pre-11 
} 

Кроме того, чтобы код был немного более аккуратным, Вы можете переместить декларацию next внутри цикла:

while (current != 0) 
{ 
    Node * next = current->next; 
    delete current; 
    current = next; 
} 

Мои только заботы о утечка памяти будет касаться правильно освободив содержимого узлов, но так как вы храните простой Int, не должно быть никаких проблем нет.

Предполагая, что ваш список имеет действительные указатели на узлы и что указатель на головку тоже действителен, все остальное кажется прекрасным.

+0

В общем, перед удалением и пометить ошибку в общем случае я имел «if current! = This». – Galigator

+0

В чем преимущество использования ссылки вместо указателя? – gravitas

+1

@RSinghS Вы не можете передать нулевой объект, не можете передать немедленное значение (lvalue) и гораздо более явно информировать читателя исходного кода, что вы хотите изменить переданную переменную (это не означает, что * очевидно в случае указателя). Читать далее: http://stackoverflow.com/questions/7058339/c-when-to-use-references-vs-pointers – Spook

Смежные вопросы