2017-06-14 62 views
0

所以我一直在嘗試過濾我的列表。該列表已正確創建並填充,但我從文檔中獲取了兩次條目。它應該是這樣的。現在我正在嘗試將它們過濾出來,並且我認爲我有一個很好的想法,但它不能正常工作。從單個鏈接列表中刪除值

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如果兩個人得到相同的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'與我的delete_object或?所以tmp應該具有以下對象的值?沒有一個具有相同價值的'Matrikelnummer' –

+0

很遺憾,德語單詞「註冊」聽起來像英語短語「動物糞」... –

回答

0

當您撥打delete_object()時,您不會刪除正在傳遞的對象,您會刪除鏈接列表中的下一個條目。因此,您的if()聲明找到了要刪除的正確節點,但是您繼續刪除之後的節點。你應該修復這個問題(但是要保留在刪除節點後返回節點的一般想法)。

而且你無條件tmp = tmp->next的邏輯會導致你跳過如果調用由delete_object()返回的節點。您應該將該語句放在else子句中,因爲一旦您修復了delete_object(),它就會返回您希望爲您繼續的下一個節點。

+0

好吧,我明白了!所以在我的'delete_object()'我應該寫'tmp = b'和'b = b-> next'?但是,這仍然行不通。我在某處丟了指針。我得到了退出碼11.我更新了我的代碼。 –

0

尚未查看詳細信息,但在filter_list中,您有Anmeldung* tmp = b;,這意味着if(tmp->Matrikelnummer == info){始終爲真。

+0

不是嗎?我正在迭代'tmp = tmp-> next;'通過我的列表右鍵? –

+0

當你的函數被調用時,'if(tmp-> Matrikelnummer == info){'會在'tmp = tmp-> next'之前被處理,對吧? @HenningWilmer – YuZ

+0

哦,你是對的。我甚至沒有意識到,因爲我總是得到退出代碼11 .. –