2012-12-13 61 views
0

我正在使用链接列表。我已经将我的构造函数设置为带有一组已定义项目的名为ax的数组。我还决定有一个输入框,通过BtnAddTree_Click将新项目追加到列表ax。但不是追加到列表ax它创建了一个全新的单独列表。如何通过我的AddTree函数将项目附加到数组列表ax将一个项目追加到现有的列表

  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;    
      } 

     } 
    } 
} 
+1

Pease考虑使样品小得多。很难看出你的问题是什么...如果你想让你的代码被审查和评论 - codereview.stackexchange.com –

+0

为什么你需要附加所有的类代码? BtnAddTree_Click没有足够的方法吗? – Harry

回答

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 

如果这是不正确的预期行为是什么?很明显,这些项目都是都被添加到原始列表中,因为它们在遍历列表时存在。

顺便说一句,我还增加了以下功能ToStringListForTrees类;它使调试更容易。

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中有三个例子,在else if (count != 0)下 - 也许有一种方法可以将它们优雅地组合成一个常规while循环?它使分析变得更容易,并且(可能)更少出错。

+0

谢谢你的详细解答。它将显示为一个插入了新项目的整个列表。我觉得让我感到困惑的是,它将项目追加到列表的开头,没有结束。我该如何解决这个问题? – CodingWonders90

+1

检查'else if(count!= 0)'下面的else语句...它将它按*排序*顺序插入!如果你想总是把它添加到列表的最后,你总是会想使用第二种情况:'last_tree.next_tree = new_tree; last_tree = new_tree;' – ceyko

+0

你上次帮助我很大。关于链接列表和展示位置,我有不同的问题。请检查:[这里](http://stackoverflow.com/questions/13863114/show-position-of-item-in-a-link-list) – CodingWonders90

相关问题