2014-09-22 4 views
0

학위가 노드에 포함되어있는 다항식 링크 된 목록을 정렬하려고합니다. 예를 들어 다항식 5x^2 + 5x + 5의 poly.term.degrees는 2,1,0이됩니다. 불행히도 다항식을 추가하는 메서드를 가지고 있지만 반대 식 (5 + 5x + 5x^2)으로 반환합니다.이 작업을 완료하지 못하면이 과제를 수행 할 수 없으므로 다음과 같은 정렬 방법을 사용해야합니다. 그것. 몇 번 시도했지만 그것의 걸림쇠를 얻을 수없는 것 -이 메서드를 통해 연결된 목록의 머리를 전달하면 지나가고 나머지 노드를 삭제하는 머리 만 반환합니다. 아무도 나를 도울 수 있습니까?이 연결된 목록을 정렬 하시겠습니까?

또는 addToFront 대신 다항식을 추가하는 동안 addToRear 메서드를 사용할 수도 있지만 하나의 작업을 얻지 못하는 것 같습니다 ... 진행중인 정렬 방법과 진행중인 addToRear를 모두 게시했습니다. 의견을 보내 주시면 감사하겠습니다.

private void sort(Node head)          // CURRENTLY BROKEN!!!!!!!!!! 
{ 
    Node temp; 
    Node curr = head; 
    while(curr.next != null) 
    { 
    if(curr.term.degree < curr.next.term.degree) //either degree is smaller or greater 
     {//swap 
      temp = curr; //save first element 
      curr = curr.next; //set first element to second 
      temp.next = curr.next; //set next of first to third 
      curr.next = temp; //set second element to the first that we saved before 
     } 
    curr = curr.next; //move to next element 
    } 
} 


private void addToBack(float coeff, int deg, Node head) 
{ 
    if(head==null) 
    { 
     // System.out.println("List empty, creating new node"); 
     Node n = new Node(coeff,deg,head); 
     head = n; 
     System.out.println(head.term.coeff); 
    } 
    else 
    { 
     Node n = new Node(coeff,deg,head); 
     Node temp = head; 
     while(temp.next!=null) 
     { 
      System.out.println("a"); 
      temp.next=temp; 
     } 
     head = n; 
    } 
} 
+0

정렬을 수행하거나 되돌릴 필요가 있습니까? 나중에 더 간단합니다. 또한 링크 된 목록의 구현에 붙어 있습니까? 대신 라이브러리 구현이나 간단한 배열을 사용할 수 있습니까? – Aivean

+0

반전은 괜찮습니다.하지만 정렬은 더 좋을 것이라고 생각합니다. 불행히도이 할당은 연결된 목록으로 제한되며 명시 적으로 작업해야하며 더 쉽게 변환 할 수있는 크레딧을주지는 않습니다. (나는이 시간을 아무 소용이 없다. – hendersawn

+0

단순히 'while (curr! = null)'? –

답변

0

몇 가지 오류를 지적 할 것입니다.

  1. 버블 정렬의 일부 수정에는 두 개의 중첩 루프가 있어야합니다. 외부 루프는 while (changes)이고, 내부 루프는 요소를 반복합니다. 두 요소를 바꿀 때 changes = true을 만듭니다.

  2. 스와핑 요소가 노드를 바꿔 쓰지 않으려는 경우 해당 값 (term)을 바꿉니다. 그것은 그만큼 쉽게 :

    두 개의 오류가 addToBack에서 Term temp = curr.term; curr.term = curr.next.term; curr.next.term = temp;

  3. 는, 첫째, 당신은 당신이 (head = n;)를 할당 한 후 그 머리를 외부 방법을 변경됩니다 기대하는 것, 그러나 이것은 사실이 아니다, 로컬 사본 만 변경합니다. 둘째, else 분기에서 head = n; 대신 temp.next = n; 대신 당신이 같은 장소에서 목록을 구성하는 고려할 수 있습니다 addToBack 별도의 방법을 쓰는

: 요소가리스트의 말미에 추가됩니다

head = elementSource.next(); 
tail = head; 
while (elementSource.hasNext()) { 
    tail.next = elementSource.next(); 
    tail = tail.next; 
} 

참고. 여기에 일러스트레이션상의 이유로 실제 요소 소스 대신 elementSource을 사용했습니다.

0
if(curr.term.degree < curr.next.term.degree) //either degree is smaller or greater 
    {//swap problem should be here while swapping 
     node temp; 
     temp=curr; 
     curr=curr.next;//curr changes here 
     temp.next=curr; //maintaining the link 
    } 
curr = curr.next; //move to next element 
관련 문제