2012-03-05 28 views
1
template <class T> 
bool LinkedList<T>::remove(const T object){ 
    Node<T> *cur = head; 
    while(cur->next != NULL){ 
    if(cur->next->value == object){ 
     Node<T>* temp = cur->next->next; 
     delete cur->next; 
     cur->next = temp; 
     s--; 
     return true; 
    } 
    cur = cur->next; 
    } 
    return false; 
} 

割り当て後にオブジェクトを削除します。値をプリントアウトすると、ノードが破損しているように見えます。これは、リンクされたリストからアイテムを削除する最善の方法ですか?リンクリストのノードを削除せずにノードを削除するにはどうすればよいですか?

+0

をおそらく関係ありません:これは頭にない削除するオブジェクトを想定しています。 –

+0

それは、(オブジェクトがリストの最初の項目である 'オブジェクト'を処理しないという事実を除いて)うまく見えます。おそらく、ノードのデストラクタが何か「賢い」をしているか、 'コード。 btw:何ですか? – John3136

+1

リストの先頭を処理するには、もっと多くの作業が必要です。オブジェクトが先頭であるときに作業しないこと以外は、リストが空で頭がNULLの場合はさらに劇的な方法で失敗します。 –

答えて

2

ノードデストラクターは単に「次の削除」です。

Oooops。各ノードがデストラクタ内の次のノードを削除すると、その時点からのリスト全体が削除されます。

Node<T>* temp = cur->next->next; // the node temp points to is clearly after cur 
    delete cur->next; // deletes everything after cur 
    cur->next = temp; // temp no longer points to a valid node 
+0

さらに悪い。ダストが 'delete cur-> next;から削除された後、削除したいノードからリストの最後まですべてのノードを削除すると、' temp'は解放されたメモリをポイントし、 'cur-> next = temp;'したがって、ワイルドポインタを割り当てる。解放されたメモリが再利用されるまでこれはちょっとした作業をします。それからUndefined Behaviorの土地を離れます。 –

+0

ハハオハイオ州の手のひら。私はノード内の次の削除を取り出し、すべてが0のメモリリークで修正されています。私は最初の要素を確認しなかったバグを修正しました。ありがとう。 – carboncomputed

0

作業バージョンは、より多くのようになります。

template <class T> 
bool LinkedList<T>::remove(const T object) { 

    // Iterate through the list. 
    for(Node<T> **cur = &head;; cur = &((*cur)->next)) { 
     // Check for list end. 
     if(!*cur) 
      return false; 
     // Check for match. 
     if((*cur)->value == object) 
      break; 
    } 

    // Knock out the node. 
    Node<T> *temp = (*cur)->next; 
    delete *cur; 
    *cur = temp; 

    // No idea what s does. 
    --s; 

    return true; 
} 
関連する問題