2011-04-06 78 views
2

我沒有在2年內採取了CS類我想不通爲什麼這個簡單的鏈表是腐敗:爲什麼這個C鏈表損壞?

int exists(linkedlist *list, int val) { 
    if(list == NULL) 
     return 0; 

    if(list->value == val) 
     return 1; 
    return exists(list->next, val); 
} 

當我嘗試執行exists(list,33);列表中的第一個值被改寫爲33.我被迫使用迭代的方法,並得到程序的工作,但是這個錯誤,因爲這似乎是一個有效的解決方案。爲什麼它不起作用?

(注:創建節點我總是設置list->next = NULL;

+7

你確定你的代碼顯示'lists-> value == val' not'lists-> value = val'嗎? – nmichaels 2011-04-06 13:48:14

+1

完全不相關的注意:列表參數應該是const。 – unwind 2011-04-06 13:51:57

+4

@unwind:不完全無關,我懷疑。 :) – 2011-04-06 13:54:13

回答

5

確定第二if語句是

if(list->value == val) 

,而不是

if(list->value = val) 

這是我能看到的唯一的事情那會改變價值。

+2

當你不打算修改參數時使用'const'的好理由! – GrahamS 2011-04-06 13:51:36

+0

但他沒有修改參數。在這種情況下,我不認爲'const'會有幫助。 – TMN 2011-04-06 15:25:25

+0

@TMN:如果他犯了@B Mitch在這裏提出的錯誤,那麼他的確在修改參數。如果參數是const(即'int exists(const linkedlist * list,int val)'),那麼這個錯誤永遠不會發生,因爲編譯器會抱怨。 – GrahamS 2011-04-06 17:33:38

1

什麼不正確?代碼看起來非常好。

嘗試運行您的程序valgrind,檢查您可能會丟失的內存錯誤。

0

順便說一下,你的鏈表有多長?

在這裏可能不是你的問題,但要注意你的遞歸方法意味着你可能會在很長的列表中產生堆棧溢出。

+0

只有幾個元素。也許這是dev-cpp編譯的方式?我得到了名單的腐敗。 其中列表用於打印爲1,2,3.在運行上述功能檢查val = 22之後,它將打印爲22,2,3 – user613592 2011-04-06 14:33:36

+0

是的,我認爲@B Mitch和@nmichaels的答案標識了正確問題的根源。遞歸的東西只是你應該考慮的其他東西。 – GrahamS 2011-04-06 14:53:30