2009-05-27 6 views
1

私は、Cスタイルctordtorのリンクリストを持っています。C++キューの途中からノードを削除

このif文が真であることをテストしないと決めたとき、私はあまりにも不満を持ちました。 に無限ループを入れました。私はそれが本当にテストされない理由を理解していない。

LinkedListからノード(クラスオブジェクトのアドレス)を削除しようとしています。

誰かが私を助けてくれるのでしょうか?

Node *Current = first_; // I want this to be my only Node Ptr Varaible Declaration. 
if (NULL == first_) 
std::cout << "Cannot delete from an empty list: \n"; 


while (Current != NULL) 
{ 
    if (first_->data_ == node->data_) 
    { 
    //check to see if we are deleteing the head. 
    first_ = first_->next_; 
    --listLen_; 
    delete Current; 
    std::cout << "Head Deleted!\n"; 
    } 
    if (Current->data_ == node->data_) // FOR SOME REASON this is never true? 
    { 
    --listLen_; 
    node->data_ = NULL; 
    Current  = Current->next_; 
    node->data_ = Current; 
    } 
    else // we must not of found it. // else should match previous i 
    { 
    Current->prev_ = Current;// since we are not deleting the first node we are OK here. 
    Current  = first_->next_; 

    if (Current->next_ == NULL) // see if we are at the end of the list. 
    { 
     first_ = NULL; 
     last_ = Current->prev_; 

    } 
    } 
} 
return; 
+0

コードの書式が正しく設定されていません。 –

+0

コードの書式設定を修正しました。 –

+0

あなたの特定の質問は何ですか? –

答えて

0

ループを小さくしておくと、何が問題になったかを簡単に把握できます。データ比較が理にかなっているとします。

curr = first_; 
while(curr && (curr->data_ != node->data_)) { 
    curr = curr->next_; 
} 
if (!curr) return // didnt find it, nothing to remove 
if (curr == first_) 
    first_ = curr->next_ 
else    
    curr->prev_->next_ = curr->next_ 
curr->next_->prev_ = curr->prev_ // always fix next's prev 
delete curr 
0

nodeがから来ているか、どのようにdata_定義されたが、それはポインタ型である場合、あなたはおそらく内容、ではないアドレスを比較する必要があります。あなたはどこに表示されません。 data_が何かへのポインタとそれがoperator==が定義されているために指しているか、それはあなたが探している値が、その後、あなたの代わりにこれを行うことができたタイプに内蔵されていると仮定すると

if (*Current->data_ == *node->data_)
2

これは本当に書き直されるべきです。なぜなら、問題が多すぎます...なぜSTLコンテナを使用しないのですか?これは宿題の質問だと思う。

無限ループへの答えは次のノードにインクリメント他のケースである:

Current  = first_->next_; 

データは最初の二つのノードにで見つからない場合...ので、これは永遠にあなたのループを行います次のテストを常に最初の次のノードに設定し、リストに2つ以上のノードがある場合は、現在の値をNULLに設定しません。

+2

私は解決策を投稿しないようコミュニティの残りの人にアドバイスしたいと思います。本当に宿題があれば、何も学ばないでしょう。 – Chap

0

条件が常にあるため、最初の反復first_ == Currentに偽Current->data_ == node->data_に評価し、あなたが今までにそれを

を更新せずにCurrentを削除した場合ステートメントは常に秒後、真と評価される場合は、これまで二その後、trueと評価さfirst_->data_ == node->data_場合あまりにも多くの作業をしているように見えるリンクされたリストからノードを削除してください。

1

あなたが達成しようとしていることは完全にはわかりませんが、間違っていると確信しています。あなたは単にリンパ節転移> DATA_に一致する二重リンクリストから要素を削除しようとしている場合、それはこのように簡単です:

Node *Current = first_; 

while (Current != NULL) 
{ 
    if (Current->data_ == node->_data) 
    { 
    //If Current isn't the head of the list, set prev to next 
    if (Current != first_) 
     Current->prev_->next_ = Current->next_ 
    else 
    { 
     first_ = Current->next_; 
     if (first_ != NULL) 
     first_->prev_ = NULL; 
    } 

    //If Current isn't the tail of the list, set next to prev 
    if (Current->next_ != NULL) 
     Current->next_->prev_ = Current->prev_ 
    else if (Current->prev_ != NULL) 
     Current->prev_->next_ = NULL; 


    delete Current; 
    Current = NULL; 
    } 
    else 
    { 
    Current = Current->next_; 
    } 
} 
return; 
+0

正しいアイデアは+1ですが、ポインタのフィックスアップは正しくありません if(Current!= first _){ Current-> prev _-> next-> = Current-> next_; } else { first_ =現在→next_; if(最初の_!= NULL){ 最初の_-> prev_ = NULL; } } もう1つのifには、同様の修正が必要です。 – Dolphin

+0

あなたは間違いなしです。一定。 – Pesto

+0

削除したノードでクラッシュするあなたの新しい投稿では、文:current-> prev _-> next_ = current-> next_;クラッシュするでしょう。しかし、current-> next _-> prev_は何らかの理由ではありません。 Hehe、私は本当にLinkedListのコンセプトが好きで、あなたの助けに感謝します:) – user40120

0

そうでもない実際の問題のため、ここでの答えが、提案。

リスト内のエントリを削除するために、リンクされたリストを繰り返すことはありません。各エントリには有効な次と前のポインタが必要です。リストからエントリを削除する場合は、前のレコードポイントを次のレコードポイントに設定し、逆も同様です。空のリストには、先頭のレコードと末尾のレコードがあり、互いにポイントし、すべての有効なエントリがその間に挿入されている必要があります。

+0

あなたの空リストにはレコードがありますか? – jmucchiello

+0

空のリストには、お互いを指すだけの頭と尾のレコードがあります。レコードが追加されると、それらのレコードが間に挿入されます。たとえば、head - > record 1 - > tailのようになります。私はそれがはっきりしていると思ったが、私はそうは思わない。 :-)あなたが望むなら、もっと鮮明に編集してください。 – KPexEA

0

値渡しのノードを削除します。

void deleteBegin() 
{ 
Node* temp =Head; 
if(temp==NULL) 
    return; 
Head=Head->next; 
free(temp); 
} 
void deleteMiddle(int _data) 
{ 
Node* curr = Head; 
Node* prev = Head; 

if(curr==NULL) 
    return; 

if(curr->next==NULL) 
    { 
    deleteBegin(); 
    return; 
} 

while(curr->next!=NULL && curr->data!=_data) 
{ 
    prev=curr; 
    curr=curr->next; 
} 

if(curr->data == _data) 
{ 
    if(prev==curr) 
    { 
     deleteBegin(); 
     return; 
     } 
    prev->next = curr->next; 
    free(curr); 
} 
else 
{ 
    cout<<"Element Not Found\n"; 
    return; 
} 

} 
関連する問題