c-对链表进行排序(神秘segfault)



我目前正在用C对链表进行排序,作为家庭作业。我不是在寻找一个代码片段作为答案,因为我明白自己弄清楚它的价值。我收到了一个使用下面功能的segfault,如果有人能告诉我原因,我将不胜感激。我能想到的最好的办法是,当它到达以下线路时失败了:

如果(头->值>头->下一个->值){

编辑:将此行更改为if(head->next!=NULL&&head->value>head->next->value){并且不再接收segfault。但是,我的输出head指针给了我链表中的最后一个节点。HALP.

我不完全确定接下来该何去何从,即使是朝着正确的方向轻轻一推,我也会非常感激。

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

当您进入do循环时,您知道head->next不是NULL,但下一轮或到达最终项目时呢?最后一个项目之后没有任何东西。

编辑:

假设您按顺序有3个项目,ABC,其中head == B,并且您希望交换项目BC。你没有考虑到你也需要做A->next = C

一旦head成为链表中的最后一个元素,就得到了segfault
我不想写代码,因为这是家庭作业,但添加一个条件来检查head->next是否为null。如果是的话,你会想把head设置回列表的头。

您的冒泡排序需要多次通过链表进行排序。如果您使用值5,4,3,2,1和打印头以及打印温度和打印头初始化链表。您可能会看到5,4 5,3 5,2 5,1分段故障

此外,你的排序公式似乎有点偏离。如果你有2,3,1这样的数据。您的代码将看到2和3,交换后将变为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,3,6
4,3,5,6
3,4,5,6
但是你的orig指针从未更新过,所以你的输出将被截断为4,5,6。

这很可能是由NULL指针取消引用引起的。

您没有在循环中检查head->next是否为NULL。在第一次迭代之后,head变为head->next,并且您的条件(if (head->value > head->next->value))是取消引用head以访问valuenext->value

head->next可能为空。您正在检查它是否在循环之前,但while条件不执行该检查。

你应该找到一个gdb教程,它是一个非常强大的工具。

相关内容

  • 没有找到相关文章

最新更新