2014-02-06 109 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);