2012-01-15 116 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