2014-02-06 108 views
0

我正在爲我的介紹性C++類做一個插入排序,它似乎在工作,但我不斷在重新排序列表中排序。插入排序問題

在主

Storage s; 
for (int i = 0; i < 20000; ++i) 
{ 
    cout << "adding " << iss[i] << " to sorted list" << endl; 
    s.Add(iss[i]); 
} 

和Storage.cpp

void Storage::Add(int num) 
{ 
    it = mylist.begin(); 
    if (mylist.empty()) 
    { 
     Node tem(num); 
     mylist.push_front(tem); 
    } 
    else 
    { 
     while (it != mylist.end()) 
     { 
      if (num < (*it).GetNumber()) 
      { 
       Node temp(num); 
       mylist.insert(it, temp); 
      } 
      it++; 
      if (it == mylist.end()) 
      { 
       Node te(num); 
       mylist.push_back(te); 
      } 
     } 
    } 
    it = mylist.begin(); 
    while (it != mylist.end()) 
    { 
     cout << (*it).GetNumber() << ','; 
     it++; 
    } 
    cout << endl << mylist.size() <<endl; 
} 

Node只存儲正被添加到列表中,以及所述時間,這是內部Node計算的數量。

我不明白爲什麼我得到重複,在此先感謝幫助。

+1

你試過調試嗎?嘗試瀏覽代碼並觀察發生了什麼。 – crashmstr

回答

1

看看你的while循環。

while (it != mylist.end()) // Here 
    { 
     if (num < (*it).GetNumber()) // Here 
     { 
      Node temp(num); 
      mylist.insert(it, temp); // and here 
     } 
     it++; 
     if (it == mylist.end()) 
     { 
      Node te(num); 
      mylist.push_back(te); // And here 
     } 

你有沒有學過關於break的知識?添加完成後,您將繼續循環,並在最後添加它。

+0

剛看到我自己,整天看着同樣的代碼,簡直不敢相信我錯過了! – user3280133

+0

好吧,我在我的回答中說過同樣的事情...... – Wajahat

+0

@Wajahat是的,你同時做了一個答案,說得更清楚。如果我們的答案被接受了,那會很好,不是嗎?也許都得到upvoted? – m24p

1

在while循環的第二個條件中,您總是在列表末尾添加一個導致重複的新節點。

0

我認爲這個問題是在這個循環

while (it != mylist.end()) 
    { 
     if (num < (*it).GetNumber()) 
     { 
      Node temp(num); 
      mylist.insert(it, temp); 
     } 
     it++; 
     if (it == mylist.end()) 
     { 
      Node te(num); 
      mylist.push_back(te); 
     } 
    } 

如果列表中的一個元素,則其++後,迭代器將等於結束(),您將添加一個新的元素。之後,當前的迭代器結束變爲無效。 我會用下面的方法重寫它

while (it != mylist.end() && !(num < (*it).GetNumber())) it++; 
    Node temp(num); 
    if (it == mylist.end()) mylist.push_back(temp); 
    else mylist.insert(it, temp);