これは有効なLinkedListデストラクタですか?まだ混乱しています。
これを正しく理解していることを確認したいと思います。
LinkedList::~LinkedList()
{
ListNode *ptr;
for (ptr = head; head; ptr = head)
{
head = head->next
delete ptr;
}
}
したがって、ループの開始時に、ポインターptrは、リストの最初のノードであるヘッドのアドレスを保持するように設定されます。次に、headは次の項目に設定されます。これは、この最初の削除が行われると、リストの最初になります。 ptrが削除され、最初のノードも削除されます。ループの最初の反復では、ポインターは再び先頭に設定されます。
私が気になるのは、最後のノードに到達することです。条件は「頭」です。 nullでないことを確認する必要がありますが、機能するかどうかはわかりません。
助けてくれてありがとう。
非常に単純化しないでください。過度にコンパイルされたwhile
- loopが正しいかどうかを慎重に分析する代わりに、エレガントなfor
- loopを使用しますか?
ListNode* current = head;
while( current != 0 ) {
ListNode* next = current->next;
delete current;
current = next;
}
head = 0;
デバッガーを介して実行することも、頭蓋骨内部のウェットウェアを介して実行することもできます。どちらも問題なく動作することを示しています。たとえば、リストから始めましょう:
head(47) -> [47]single_node -> [NULL]end-of-list.
ステートメントでそのリストを実行します。
ptr = head
はptr
を47に設定します。head
はゼロ以外なので、ループに入ります。head = head->next
はhead
をNULLに設定します。delete ptr
はsingle_node
を削除します。ptr = head
はptr
をNULLに設定します。head
がNULL(0)になったため、ループを終了します。これで、リスト内の唯一のエントリが削除され、head
がNULLに設定されました。それだけで十分です。
長いリストや空のリストでも同様のことができますが、それでも問題ありません(1要素のリストと50要素のリストの間に実際の違いはありません)。
余談ですが、私はポインタをブール値として扱うのはあまり好きではありません。次のように記述します。
for (ptr = head; head != NULL; ptr = head)
それは私の意見ではコードをより良く読み、あなたは本当にあなたがパフォーマンスを犠牲にすることはありません(あなたが頭の悪いコンパイラを持っていない限り)。しかし、それは好みの問題です。
あなたのコメントを再:
私が気になるのは、最後のノードに到達することです。条件は「頭」です。 nullでないことを確認する必要がありますが、機能するかどうかはわかりません。
それが動作します。ゼロの値はfalseとして扱われるため、そのポイントの前にループ本体を終了した(またはリストが空の場合は本体に入らなかった)だけで、headがNULLの場合にhead-> nextを逆参照することはありません。 )。
他のポインター値はすべてtrueとして扱われ、ループ本体に入るか継続します。
条件は「頭」です。 nullでないことを確認する必要がありますが、機能するかどうかはわかりません。
はい。「head」自体は「head!= null」と同じですが、混乱したとしても、意味のない入力ショートカットを使用するのはなぜですか。あと6回のキーストローク(そして同じマシンコードを生成)なので、長い形式を選択してください。
さらに、for()
構文を使用しているため、コードは必要以上に複雑です。 while()
を使用しないのはなぜですか?あなたのコードはずっときれいになります。
最後に、私はあなたがこれを学習課題として行っていることを理解していますが、list <>は標準ライブラリにあることに注意してください---リンクされたリストは公式に「解決済みの問題」です。
テスト済み
クラスリストのデストラクタ
List::~List()
{
Node *n = this->front, *current = NULL; //initialization part
while(n) //start cleanup of nodes of the list
{
current = n;
n=n->next;
delete(current);
}
front = end = NULL;
}
これは、リンクリストのデストラクタを使用してメモリを解放/削除するためのより良いアプローチです。
List()::~List()
{
for( Link* ptr= Head; Head; Head= Head->next)
{
delete ptr;
}
}
あなたのコードは正しいかもしれません、あなたはそれを例えばで実行してみるべきですvalgrind、それが何を言っているかを見てください。ただし、次のように記述します。
for (ListNode *current = head, *next; current; current = next) {
next = current->next;
free(current);
}