【发布时间】:2012-02-10 14:58:24
【问题描述】:
我目前正在将 C 中的链表排序为家庭作业。我不是在寻找代码 sn-p 作为答案,因为我了解自己弄清楚它的价值。我使用下面的函数收到一个段错误,如果有人至少能告诉我原因,我将不胜感激。我能想到的最好的结果是到达以下行时它失败了:
if ( head->value > head->next->value ) {
编辑:将此行更改为 if (head->next != NULL && head->value > head->next->value){ 并且不再接收段错误。但是,我的输出头指针给了我链表中的最后一个节点。暂停。
我不完全确定从这里往哪里走,即使是在正确方向上的最轻微的推动也会非常感激。
struct node *sort_list(struct node *head) {
bool swapped ;
struct node * tmp , * orig ;
orig = head ;
if ( head == NULL || head->next == NULL ) return head ;
else {
do {
swapped = false ;
if ( head->next != NULL && head->value > head->next->value ) {
tmp = head ;
head = head->next ;
tmp->next = head->next ;
head->next = tmp ;
swapped = true ;
}
head = head->next ;
} while ( swapped == true && head != NULL ) ;
}
return orig ;
}
【问题讨论】:
-
我没有立即看到问题,但如果我是你,我会创建一个
swap(...)函数,该函数接受交换代码并将其放入自己的函数中。然后您可以测试该功能,直到您确信它可以工作。一旦你有了它,你就可以专注于你的排序逻辑。就目前而言,您必须首先弄清楚是您的排序逻辑还是交换逻辑搞砸了。 -
花时间学习如何使用调试器是值得的。这样就不需要问这样的问题(以及许多其他问题),而且你会更快地完成更多工作。
-
不是学习调试器的问题,只是我需要更好地使用它。我的路还很长!
-
虽然我认为您目前得到的答案很有用而且可能是正确的,但将来最好通过包含导致代码失败的 测试用例 来处理这些问题。单项列表,不需要交换的双项列表,确实需要交换的双项列表,一些完全颠倒的三项列表,大多已排序,并且已经排序等。这些案例中的一小部分可以改变世界。
标签: c sorting pointers linked-list