排序链表(神秘段错误)

时间:2012-01-15 01:51:36

标签: c sorting pointers linked-list

我目前正在将C中的链表排序作为家庭作业。我不是在寻找代码片段作为答案,因为我理解自己搞清楚它的价值。我正在使用下面的函数接收段错误,如果有人至少可以告诉我原因,我将非常感激。我能想到的最好的是它在到达下一行时失败了:

  

if(head-> value> head-> next-> value){

编辑:将此行更改为if(head-> next!= NULL&& head-> value> head-> next-> value){并且不再接收段错误。但是,我的输出头指针给了我链表中的最后一个节点。 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 ;
}

4 个答案:

答案 0 :(得分:3)

当您输入do循环时,您知道head->next不是NULL,但是下一轮或者当您到达最终项目时呢?最后一项后面没有任何内容。

编辑:

假设您有3个项目,ABC,其中head == B,并且您想要交换项目B和{{ 1}}。您没有考虑到您还需要C

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

你应该找到一个gdb教程,这对于像这样的事情来说是一个非常强大的工具。

答案 3 :(得分:1)

一旦head成为链表中的最后一个元素,就会得到你的段错误 我不想编写代码,因为它是家庭作业,但添加一个条件来检查head-&gt; next是否为null。如果是,你会想要回到列表的头部。

您的冒泡排序需要多次通过链表进行排序。如果使用值5,4,3,2,1初始化链接列表并打印头和打印温度和打印头。你可能会看到5,4 5,3 5,2 5,1 segfault

你的分拣公式似乎有点偏。如果您有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,3,6
4,3,5,6
3,4,5,6
但是您的orig指针从未更新,因此您的输出将被截断为4,5,6。