2016-04-01 10 views
-1

挿入時にソートするために二重リンクリストコードを修正しようとしました。ここに私が持っているものがあります。それはリストに挿入され、並べ替えられません。これでちょっと苦労しました。とても有難い。ソートされた二重リンクリストに挿入するC++

template <typename T> 
bool DoublyLinkedList<T>::insert(T data) 
{ 
    int i = 0; 
    Node<T> *tmp, *newNode; 
    bool check = false; 
    newNode = new Node<T>(data); 
    tmp = mHead; 

    if (newNode == NULL) 
     return false; 

    if (mHead == NULL) 
    { 
     mHead = newNode; 
     mTail = newNode; 
     mCount++; 
     return true; 
    } 

    while (tmp != NULL) 
    { 
     if (tmp->mNext == NULL) 
     { 
      if (tmp->mData <= data) 
      { 
       newNode->mPrevious = tmp; 
       tmp->mNext = newNode; 
       mTail = newNode; 
      } 
      else 
      { 
       newNode->mNext = tmp; 
       tmp->mPrevious = newNode; 
       mHead = newNode; 
      } 
     } 
     else if (tmp->mNext->mData >= data) 
     { 
      newNode->mPrevious = tmp; 
      newNode->mNext = tmp->mNext; 
      tmp->mNext->mPrevious = newNode; 
      tmp->mNext = newNode; 
      break; 
     } 

     tmp = tmp->mNext; 
    } 

    mCount++; 
    return true; 
} 
+0

理論は簡単です:挿入したいノードより大きな(またはソート順に応じて小さい)値を持つ最初のノードを探します。見つかったノードの前に新しいノードを追加します。実際には、少し難しいかもしれません。そのため、コードを書く前に紙に書いておきたいのです。現在のリストの先頭または末尾に新しい値を挿入する場合は、コーナーケースを覚えておいてください。 –

+0

あなたの問題については、(上のアドバイスを使用して)関数をやり直したくない場合は、デバッガの使い方を学ぶ必要があります。また、コードを一行ずつ進める方法もあります。あなたのような問題を見つけるのに役立ちます。 –

+0

デバッグを支援するには、どのような場合に正しく挿入されていないのですか?最初は?最後に?真ん中のどんな場合? – vu1p3n0x

答えて

0

私が間違っていない場合は、エラーはあなたの場合です。現在の実装では、 "data"をノード "AFTER" tmp "の値と比較し、設計上、何もリストの先頭に追加することはできません。

リスト[4,7]があり、値3のノードを入力した場合、最初の要素を完全に無視して2番目の要素と比較して、[4,3,7]となります。データをtmp-> next-> mDataではなくtmp-> mDataと比較し、それに応じてロジックを調整してください。

さらに、汎用データ型()を使用する場合、単純な「より大きい」または「より小さい」比較に頼るべきではありません。 6 < 7と言うのは自明ですが、ユーザー定義の構造体や列挙型を比較す​​ると、明確な順序がない場合があります。

関連する問題