2009-08-21 8 views
0

私は何か正しいことをしたかもしれないと思う、headByRatingとheadByNameは両方とも同じアドレスを参照する。LinkedList Part

私は一日中働いてダイアグラスを描いていて、新しいことなどを試しています。

私は2つのリストポインタheadByRatingとheadByNameを持っています。 と2つのノードポインタnextByNameとnextByRating。

どういうわけか、名前と評価でこの情報を並べ替えることができる必要があります。 私はptrsのアドレスごとにそのことをやっていると思っていました。私は並べ替えしようとしていることを例として

2文:

 
//main.cpp 

list *wineries = new list(); 
wineries->insert(winery("Lopez Island Vinyard", "San Juan Islands", 7, 95)); 
wineries->insert(winery("Gallo", "Napa Valley", 200, 25)); 

ワイナリーctorのは、すべてが、この時点で割り当てられ、オブジェクトにされて結構です。

 
//list.cpp 
void list::insert(const winery& winery) 
{ 
     list *listPtr = new list(); // havent really used the list obj. yet. 

    node *current = new node(winery); // winery is now a node. 
    node *temp = current;  // temp knows about the nodes address. 

    while (temp->nextByName != NULL) 
    { 
       // check for null and reassign 
     temp = temp->nextByName; 
    } 
    node *new_node = new node(winery); // creating a new node. 
    new_node->item = winery; 
    new_node->nextByName = new_node; 
    new_node->nextByRating = new_node; 
} 
 
// list.h 
struct node 
{ 
    winery item; 
    node * nextByName; 
    node * nextByRating; 
}; 

class list 
{ 
    ... 
private: 
    node * headByName; 
    node * headByRating; 
}; 

これに対する良いアプローチは何ですか?私はこの権利をやっているとは思わない。

+3

ここでやろうとしていることは本当に分かりません。あなたはそれを読む誰もがあなたの心を読む能力を持っているかのようにこの質問を書いています。あなたは何をしようとしていますか、あなたを止めている問題は何ですか? –

+0

リンクされたリストをやろうとしています。ワイナリーオブジェクトには、名前、場所、評価、エーカーの4つの属性があります。メインからの最初のスニペットで見られるのは、ワイナリーオブジェクトの内容です。どうにか私は評価と名前を並べ替える必要があります。 – user40120

+0

あなたのコードの読者の視点から考える必要があるかもしれません。あなたは一般的にリンクされたリストをソートしようとはしませんし、あなたが持っているものにはいくつかの明らかなバグがあります。また、そこにあるものの意味を実際には説明していない。私はあなたのコードを簡単に理解できるものに単純化しようと努力することをお勧めします。 –

答えて

4

なぜ自分のリンクリストをローリングしていますか?なぜstd::listを使用しないのですか? ダブルソートの場合は、2つの別々のポインタリストが機能し、提供されたコンテナクラスを使用することができれば非常に簡単です。

また、ソートする必要がある場合は、リンクされたリストが最適ですか? std::vectorは並べ替えが容易であることが多く、std::setは順序自体を維持します。

0

それはあなたがここにいくつかの問題を抱えて次のようになります。

  1. をそれは常にtemp-ので、しばらく 文をスキップします> nextByName は常に新しい オブジェクトである現在の一時 ポイントので、NULLになります。
  2. あなたはあなたがnextByNameを作っていると nextByRatingメンバーが指すコンストラクタ
  3. にそれを送った後、あなたは をWineryにアイテムのメンバーを割り当てている
  4. 二回のワイナリーから
  5. をノード オブジェクトを作成していますそれ自体は

この方法からすべてを削除し、その場所に高レベルの擬似コードを書くことをお勧めします。次に、擬似コードの各行に対して小さなメソッドを作成します。インサートの中で呼び出されるより小さな論理的なメソッドは意味をなさないでしょう。

0

リストタイプを実験用にしたい場合はそれを行い、それ以外の場合はstd :: listを使用します。
新しい要素を挿入している間にリストをソートしておきたい場合は、順序付きリストを実装する必要があります。

リストから「ワイナリーフィールド」の依存関係を削除する方がよいでしょう。ノードはの次のノードの1つだけでなければなりません。あなたはツリーではなくリストを作っています。

// list.h 
struct node 
{ 
    winery item; 
    node * next; 
}; 

class list 
{ 
    ... 
private: 
    node * head; 
}; 

異なるワイナリーフィールドで1つのリストを並べることはできません。
ワイナリーレコードのコンテナとして機能するCWineryのような新しいタイプを作成します。
そこには、要素やソート方法などを格納するためのリストがあります。

0

複数のインデックスを持つリストを使用する必要がある場合は、ホイールを発明する代わりにboost::multi_indexを使用することを検討する必要があります。