簡體   English   中英

冒泡排序C-鏈表

[英]Bubble Sort C - Linked List

所以這是我的小氣泡排序功能遇到的問題。 我能夠對值進行排序,但是在3個節點之后我總是會截斷。 一個例子是:

排序以下內容:

3 2 54 5 4

我總是得到(從最小的頭):

2 3 4

就是這樣,僅此而已。

 void sortByLine (struct lnode** head) {
      int count = 1;
  while(count){
      struct lnode *temp =*head;
    count = 0;
    while(temp != NULL){
        struct lnode *next = nodeGetNext(temp);
        if(next != NULL){           
           if((lineCmp(temp,next)) > 0 ){
            swap(head, next,temp);
            count = 1;
           }
        }
        temp = nodeGetNext(temp);
    }
}

}

線路Cmp功能:

int lineCmp (struct lnode* n1, struct lnode* n2) {
  int node1 = nodeGetLine(n1);
  int node2 = nodeGetLine(n2);

  if(node1 == node2){
      return 0;
  }
  else if(node1 > node2){
      return 1;
  }
  else
      return -1;

}

交換功能:

 void swap (struct lnode** head, struct lnode* n1, struct lnode* n2) {
    struct lnode *prevn1 = nodeGetPrev(*head, n1);   
    struct lnode *prevn2 = nodeGetPrev(*head, n2);

  struct lnode *nextn1 = nodeGetNext(n1);
  struct lnode *nextn2 = nodeGetNext(n2);   

  if(prevn2 == n1 && prevn1 == NULL){
      evictNode(head, n2);
      pushNode(head, n2);
  }
  else if(prevn1 == n2 && prevn2 == NULL){
      evictNode(head, n1);
      pushNode(head, n1);
  }
  else if(prevn1 == n2 && nextn1 == NULL){
      evictNode(head, n1);
      insertNode(head, prevn2 , n1);   
  }
  else if(prevn2 == n1 && nextn2 == NULL){
      evictNode(head, n2);
      insertNode(head, prevn1, n2);
  }   
  else{
  evictNode(head, n1);
  evictNode(head, n2);   
  insertNode(head, prevn2 , n1);   
  insertNode(head, prevn1 , n2);
  }

}

您的問題出在交換功能中:刪除節點會使先前計算出的節點無效

 void swap (struct lnode** head, struct lnode* n1, struct lnode* n2) {
    struct lnode *prevn1 = nodeGetPrev(*head, n1);   
    struct lnode *prevn2 = nodeGetPrev(*head, n2);

  struct lnode *nextn1 = nodeGetNext(n1);
  struct lnode *nextn2 = nodeGetNext(n2);   

  if(prevn2 == n1 && prevn1 == NULL){
      evictNode(head, n2);
      pushNode(head, n2);
  }
  else if(prevn1 == n2 && prevn2 == NULL){
      evictNode(head, n1);
      pushNode(head, n1);
  }
  else if(prevn1 == n2 && nextn1 == NULL){
      evictNode(head, n1);
      insertNode(head, prevn2 , n1);   
  }
  else if(prevn2 == n1 && nextn2 == NULL){
      evictNode(head, n2);
      insertNode(head, prevn1, n2);
  }   
  else if (n1==prevn2)
  {
       evictNode (head, n1);
       insertNode(head, n2, n1);  
  }
  else if (n2==prevn1)
   {
       evictNode (head, n2);
       insertNode(head, n1, n2);  
   } 
  else {
   evictNode(head, n1);
   evictNode(head, n2);   
   insertNode(head, prevn1, n2);
   insertNode(head, prevn2, n1);
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM