【问题标题】:Linked-list: bubble sorting pointers(C) [closed]链表:冒泡排序指针(C)[关闭]
【发布时间】:2012-02-10 15:27:43
【问题描述】:

我正在完成一项大学作业。我正在尝试用 C 编写一个链表排序。我不允许交换值 - 只能交换指针。

这是我的排序功能:

struct node *sort_list(struct node *head) {

bool swapped ;
struct node *cur = head, *first ;

if ( head == NULL || head->next == NULL ) return head ;
else {
    do {
        swapped = false ;
        while ( cur != NULL && cur->next != NULL ){
            if (cur->value > cur->next->value){
                cur = swap_with_next( cur ) ;
                swapped = true ;
            }
            cur = cur->next ;
        }   
    } while (swapped == true) ;

}
return head ;

}

还有交换功能:

 struct node *swap_with_next(struct node *n) {
      struct node *tmp ;
      tmp = n ;
      n = n->next ;
      tmp->next = n->next ;
      n->next = tmp ;
      return n ;
 }

问题:输出不正确:

input:  5->2->NULL
output: 5->NULL

input:  9->1->5->2->8->3
output: 9->5->8

任何帮助将不胜感激!

【问题讨论】:

  • 投票结束:使用调试器可以解决(或至少确定)问题。
  • swap_with_next 更新nn->next 中的指针,但不更新继续指向n 的前一个节点,即使它不再是下一个元素。

标签: c pointers data-structures linked-list


【解决方案1】:

好的,假设有 3 个节点 A、B 和 C(按此顺序)。您正在尝试交换 B 和 C。因此,您将指向 B 的指针传递给 swap 函数。现在,所有的指针操作都是正确的,但是,你错过了一件事。当您完成交换时,A 的下一个指针应该指向 C。你从来没有设置过这个。当你完成交换函数时,A 的 next 指针仍然指向 B,这显然是不正确的。这就是问题所在。

【讨论】:

  • 确实是个问题,但还有其他几个问题。谢谢你的提示。
【解决方案2】:

您正在传回一个很好的指针,但在交换中您正在操作指针的副本,而不是您要更改的“实际”指针。您正在尝试操作参数以在 swap 内部进行交换,但这只会更改在调用该函数时创建的该节点的副本。如果要在函数内部更改参数,则需要将参数作为指向指针的指针。

【讨论】:

    猜你喜欢
    • 2012-02-17
    • 2018-05-18
    • 2014-02-18
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 2022-01-06
    • 2013-04-22
    • 1970-01-01
    相关资源
    最近更新 更多