2012-12-13 7 views
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;    
      } 

     } 
    } 
} 
+1

시료를 훨씬 작게 만드십시오. 문제가 무엇인지 알기가 매우 어렵습니다 ... 코드를 검토하고 주석을 달고 싶다면 - 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 

이것이 올바르지 않으면 예상되는 동작은 무엇입니까? 분명히이 항목들 입니다. 모두 목록을 반복 할 때 표시되므로 원래 목록에 추가됩니다.

덧붙여서 나는 또한 클래스에 다음과 같은 ToString 함수를 추가했습니다. 디버깅이 쉬워집니다.


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))를 생각해보십시오 .- 아마도 루프 동안 하나의 일반으로 우아하게 결합 될 수있는 방법이 있을까요? 분석이 쉽고 오류가 발생하기 쉽습니다.

+0

자세한 답변 해 주셔서 감사합니다. 새 항목이 삽입 된 전체 목록으로 표시됩니다. 나는 혼란 스럽다는 것이 목록의 시작 부분에 항목을 추가한다는 것입니다. 내가 어떻게 고칠 수 있니? – CodingWonders90

+1

'else if (count! = 0)'아래의 else 문을 확인하십시오. * 정렬 된 * 순서로 삽입됩니다! 항상 목록 끝에 추가하고 싶다면 두 번째 경우를 항상 사용하고 싶을 것이다 :'last_tree.next_tree = new_tree; last_tree = new_tree; ' – ceyko

+0

크게 도움이되었습니다. 나는 링크 목록과 itme의 위치를 ​​표시에 관한 다른 질문이 있습니다. 다음을 확인하십시오 : [여기] (http://stackoverflow.com/questions/13863114/show-position-of-item-in-a-link-list) – CodingWonders90

관련 문제