0

私はリンクリストを扱っています。ax既に定義されているアイテムのセットで名前が付けられた配列を取るようにコンストラクターを設定しました。BtnAddTree_Clickまた、新しいアイテムをリストに追加する入力ボックスを用意することにしましたax。ただし、リストに追加する代わりにax、まったく新しい別のリストを作成します。ax関数を使用して配列リストにアイテムを追加するにはどうすればよいAddTreeですか?

            public ListForTrees(IEnumerable<fruit_trees> trees)
            {
                foreach (fruit_trees t in trees)
                {
                    this.AddTree(t);
                }
            }



            public void AddTree(fruit_trees new_tree)
            {
                fruit_trees current = first_tree;

                if (count == 0)
                {
                    first_tree = new_tree;
                    last_tree = new_tree;
                    count = 1;
                }

                else if (count != 0)
                {
                    if (new_tree.tree_price <= first_tree.tree_price)
                    {
                        new_tree.next_tree = first_tree;
                        first_tree = new_tree;
                    }
                    else if (new_tree.tree_price >= last_tree.tree_price)
                    {
                        last_tree.next_tree = new_tree;
                        last_tree = new_tree;
                    }
                    else
                    {
                        while (new_tree.tree_price > current.next_tree.tree_price)
                        {
                            current = current.next_tree;
                        }
                        new_tree.next_tree = current.next_tree;
                        current.next_tree = new_tree;
                    }
                    count++;
                }
            }

        }

        ListForTrees mainlist = new ListForTrees();

        private void BtnGo_Click(object sender, EventArgs e)
        {
            fruit_trees[] ax = {   new fruit_trees("cherry", 48, 12.95, 3),
                                             new fruit_trees("pine", 36, 9.95, 8),
                                             new fruit_trees("oak", 60, 14.95, 2),
                                             new fruit_trees("peach", 54, 19.95, 3),
                                             new fruit_trees("pear", 36, 11.85, 2),
                                             new fruit_trees("apple", 62, 13.45, 5)
                                         };

            mainlist = new ListForTrees(ax);
            fruit_trees current = mainlist.first_tree;
            while (current != null)
            {                   
                current = current.next_tree;             
            }

        }
    }
}
4

1 に答える 1

2

新しい別のリストを作成していないようです。私はあなたのコードで次のコードをテストしました:

public class TreeTester
{
  public static void Main(string[] args)
  {
    var list = new ListForTrees(
        new[] { new fruit_trees("tree10",10,10,10), new fruit_trees("tree2",2,2,2) });

    list.AddTree( new fruit_trees("tree3",3,3,3) );     // middle
    list.AddTree( new fruit_trees("tree1",1,1,1) );     // first
    list.AddTree( new fruit_trees("tree50",50,50,50) ); // last
    list.AddTree( new fruit_trees("tree5",5,5,5) );     // middle
    Console.Write(list);
  }
}

そして、正しいと思われる次の出力を得ました。

tree1 1 1 1
tree2 2 2 2
tree3 3 3 3
tree5 5 5 5
tree10 10 10 10
tree50 50 50 50

これが正しくない場合、予想される動作は何ですか? これらの項目すべて元のリストに追加されていることは明らかです。なぜなら、これらの項目はリストを反復処理するときに存在するからです。

ところで、次のToString関数もListForTreesクラスに追加しました。デバッグが容易になります。

public override string ToString()
{
  string s = "";
  for (var tree=first_tree; tree!=null; tree = tree.next_tree)
    s += tree + "\n";
  return s;
}

編集:どこが間違っているのかを理解しようとする際に、コードを少しクリーンアップすると役立つ場合があることにコメントする必要があります。たとえば、ListForTrees(fruit_trees new_tree)コンストラクターは呼び出しとまったく同じことを行いAdd(new_tree)ます。また、Add にある 3 つのケースについて考えてみてください。else if (count != 0)おそらく、それらを 1 つの一般的な while ループにエレガントに組み合わせる方法があるでしょうか? これにより、分析が容易になり、(潜在的に) エラーが発生しにくくなります。

于 2012-12-13T06:08:06.570 に答える