我目前正在整理一个C语言的链表作为家庭作业。我不是在寻找一个代码片段作为答案,因为我知道自己找出它的价值我收到一个segfault使用下面的功能,如果有人能告诉我为什么,我会非常感谢我能想到的是,当到达以下行时,它正在失败:
if(头->值->头->下一个->值){
编辑:将此行更改为if(head->next!=空&&head->值>头->下一个->值){am不再接收segfults但是,我的输出头指针给了我链接列表中的最后一个节点停下来。
我不太确定从这里走到哪里,哪怕是朝着正确的方向轻轻一推也会非常感激。
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 ;
}
最佳答案
一旦head成为链表中的最后一个元素,就得到segfault。
我不想写代码,因为这是家庭作业,但添加一个条件来检查head->next是否为空如果是的话,你会想回到列表的开头。
冒泡排序需要通过链接列表多次传递才能对其进行排序。如果使用值5、4、3、2、1和打印头以及打印温度和打印头初始化链接列表你可能会看到5,4 5,3 5,2 5,1段断层
你的分类公式也有点不对劲如果你有像2,3,1这样的数据您的代码将看到2和3,swapped将变为true,函数将返回true。
您可能想使用一个内部循环来循环,这样外部循环的每次迭代都会导致1通过链表。如果在经过整个链接列表之后没有交换,则对数据进行排序。
do{
for 1 pass through linked list (this can be a for or while loop)
swap if necessary; set swapped to true
}while(swapped is true)
希望这有帮助。
编辑
之后
tmp = head;
添加
head = head->next
if(tmp == orig)
orig = head;
你需要保持你的头部指针。
在5,4,3,6的情况下它会按如下方式分类
四、五、三、六
四、三、五、六
三、四、五、六
但原始指针从未更新,因此输出将被截断为4、5、6。
关于c - 排序链接列表(神秘段),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8866960/