2012-01-15 77 views
1

我目前正在对C中的链接列表进行排序以作为家庭作业。我不是在寻找一个代码片段作为答案,因为我明白了自己想出来的价值。我正在使用下面的函数接收段错误,如果有人能告诉我为什么,我会非常感激。我能想出的最好的是,它是达到以下线的时候失败:排序链接列表(mystery段错误)

如果(头戴式>值>头戴式>下一步 - >值){

编辑:改变了这一行到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 ; 
} 
+1

我没有看到问题的副手,但如果我是你,我会做一个'交换(...)'函数,它的交换代码,并将其放在其自身的功能。然后,您可以测试该功能,直到您确信它可以正常工作。一旦你有了,你可以专注于你的分类逻辑。就目前而言,你必须首先弄清楚你的排序逻辑或交换逻辑是否搞乱了。 – corsiKa 2012-01-15 01:57:16

+1

学习如何使用调试器是您值得投资的时间。这样可以避免提出这样的问题(以及其他许多问题),并且您可以更快地完成更多工作。 – 2012-01-15 01:58:47

+0

不是学习调试器的问题,而是我需要更好地使用它。我有一条漫长的道路在我前面! – mmmeff 2012-01-15 02:01:54

回答

1

一旦头成为链接列表中的最后一个元素,就会出现段错误。
我不想编写代码,因为它是作业,但添加一个条件来检查head-> next是否为空。如果是这样,您需要将头重新设置到列表的头部。

你冒泡排序将通过链表需要多遍以排序。如果使用值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
但是你的原稿的指针从来没有更新,所以你的输出将被截断对其进行排序到4,5,6。

+0

lmk如果这固定排序错误。看来你已经修复了seg故障。 – JustinDanielson 2012-01-15 02:22:15

+0

我已经重写了我的算法,但我仍然得到不正确的输出。在排序后,如何处理挂在指向第一个节点的指针上? – mmmeff 2012-01-15 02:32:07

+0

检查编辑,你需要维护你的代码中的原始指针。 – JustinDanielson 2012-01-15 02:41:58

3

当你进入do循环,你知道head->next不是NULL,但对于接下来的时间圆,或当你到达最后一个项目?最后的项目后面没有任何东西。

编辑:

假设你有顺序3项,ABC,其中head == B,你想交换的物品BC。您没有考虑到您还需要执行A->next = C

+0

编辑原创。我仍然收到不当的产出;见OP。 – mmmeff 2012-01-15 02:02:18

1

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

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

+0

已修改原件。我仍然收到不当的产出;见OP。 – mmmeff 2012-01-15 02:02:27

1

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

,你应该找到一个gdb教程,它是这样的事情令人难以置信的强大的工具。

+0

编辑原创。我仍然收到不当的产出;见OP。 – mmmeff 2012-01-15 02:02:34

+0

gdb很棒,但他可能会离另一个学期 – JustinDanielson 2012-01-15 02:17:31

+1

上周我第一次参加gdb讲座。但它仍然很新。 – mmmeff 2012-01-15 02:30:41