【问题标题】:Bubble Sort C - Linked List冒泡排序 C - 链表
【发布时间】:2013-02-26 01:27:25
【问题描述】:

这就是我在使用小型冒泡排序功能时遇到的问题。我可以对值进行排序,但是我总是在 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);
  }

}

【问题讨论】:

  • 我们需要查看 swap 和 linecmp 的定义,看起来你没有正确处理下一个 ptr
  • 添加了新功能。所以指针没有正确指向下一个节点?

标签: c bubble-sort


【解决方案1】:

你的问题出在Swap Function:移除一个节点会使之前计算的节点失效

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

【讨论】:

  • @user2085247 这有帮助吗?
猜你喜欢
  • 2012-07-19
  • 2011-09-04
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
相关资源
最近更新 更多