2017-06-14 10 views
0

リストをフィルタリングしようとしています。リストは正しく作成され、記入されていますが、私は自分の書類から2回の記入を受けています。それはそうでなければなりません。今私はそれらをフィルタリングしようとしていると私はそれがかなりうまく考えられているが、正しく動作していないと思う。1つのリンクリストから値を削除する

Anmeldung* delete_object(Anmeldung* b){ 

    Anmeldung* tmp = b; 
    b = b->next; 
    delete(tmp); 

    return b; 
} 


void filter_list(Anmeldung* b){ 

    Anmeldung* tmp = b; 

    while(b!=NULL){ 
     std::string info = b->Matrikelnummer; 

     while(tmp!=NULL){ 

      if(tmp->Matrikelnummer == info){ 
       tmp = delete_object(tmp); 
      }else 
       tmp = tmp->next; 
     } 
     b = b->next; 
     tmp = b; 
    } 
} 

私はリストを繰り返し、すべての値をリスト全体と比較しようとしています。私が探している価値はMatrikelnummerです。もし2人の人が同じMatrikelnummerを持っていれば、その人は削除されます。

これは私の構造体Anmeldungです。

struct Anmeldung { 
    Anmeldung* next; 
    std::string Nachname;    // Name Teilnehmer 
    std::string Vorname;    // Vorname Teilnehmer 
    std::string Email;    // Email Adresse Teilnehmer 
    std::string Matrikelnummer;  // Matrikelnr. Teilnehmer 
    std::string Studienrichtung;  // Studienrichtung Teilnehmer 
    std::string Semester;    // Studiensemester Teilnehmer 
    std::string G1name;    // Name Wunschkandidat fuer Praktikumsgruppe 
    std::string G1vorname;   // Vorname Wunschkandidat 
    std::string Anmerkung;   // Freier Text 
}; 

私はwhileループが正しいとdelete_objectが間違っていると思いますが、私はどこか、どのように見ることができない。これは私の教授から提供されます。 コンテナリストなどを使用することはできません。私は構造体しか持っていません。だから二重リンクは何もない。

+0

私は 'tmp'をmy delete_objectまたは?に再割り当てします。だから、tmpには次のオブジェクトの値があるはずですか? 'Matrikelnummer'と同じ値を持つものだけではありません –

+0

"登録 "のドイツ語は英語の句"動物の糞 "のように聞こえるのは残念です... –

答えて

0

delete_object()に電話すると、渡されたオブジェクトは削除されません。の次のエントリをリンクリストで削除します。だからあなたのif()ステートメントが正しいノードを見つけていますが、の代わりにのノードを削除します。これを修正する必要があります(ただし、削除したノードの後ろにノードを戻すという一般的な考え方は維持してください)。

また無条件tmp = tmp->nextのあなたの論理が呼び出された場合delete_object()によって返されるノードをスキップにあなたを導くでしょう。 delete_object()を修正すると、続行したい次のノードも戻ってくるので、その文をelse節の中に入れるべきです。

+0

申し訳ありません!ですから、私の 'delete_object()'では 'tmp = b'と' b = b-> next'を書くべきでしょうか?しかし、それでも動作しません。私はどこかでポインタを失っています。私は終了コード11を得た。私は上に自分のコードを更新した。 –

0

filter_listにはまだAnmeldung* tmp = b;があります。つまり、if(tmp->Matrikelnummer == info){は常にtrueです。

+0

いいえ?私は 'tmp = tmp-> next;で繰り返すのですか? –

+0

あなたの関数が呼び出されるとき、 'if(tmp-> Matrikelnummer == info){'は 'tmp = tmp-> next'の前に処理されます。 @HenningWilmer – YuZ

+0

ああ、そうです。私はいつも終了コード11を取得しているので、私はそれを認識していない。 –

関連する問題