2012-07-07 82 views
0

當我遍歷鏈表時,我對程序的行爲感到困惑。爲什麼鏈接列表函數在值升序時崩潰?

我正在寫一個應該檢查是否整數鏈表按升序排列,返回1,如果是,否則爲0的功能。這是我到目前爲止:

int isasc(NodePtr top){ 

    NodePtr curr=top; 

    if(top=NULL) return 0; 

    while(curr!=NULL){ 

     if(curr->num > curr->next->num){ 
      return 0; 
     } 
     curr=curr->next; 
    } 
    return 1 ; 
} 

它的工作原理當列表不是升序,但崩潰時,它是。你有什麼想法出了什麼問題?

+3

你怎麼知道'curr-> next'不是'NULL'? – 2012-07-07 17:58:43

+0

一個理論問題:是一個空的列表升序還是降序?下一個問題:爲什麼要在進入循環之前需要NULL測試?爲什麼調用者會用空列表調用這個函數? – wildplasser 2012-07-07 18:40:36

回答

1

它在某些時候curr->next崩潰,因爲是NULL。您的代碼僅適用於無序的情況,因爲該功能在到達列表末尾之前會被仁慈地終止。

要修復程序,檢查curr->next不是NULL取消引用它。

3

您還可以:

if(top=NULL) return 0; 

這是分配給NULLtop的條件爲FALSE處理。

+0

啊,很好。 – chrisaycock 2012-07-07 18:03:46

3

有幾件事情,奇怪的是,此代碼。它崩潰的原因是因爲您正在訪問​​而未檢查curr->next是否爲NULL

也有一些其他的事情,沒有任何意義。指針top不使用,它也不會比NULL設置NULL和語句將始終評估爲NULL,這是假的。

而是做:

int isasc(NodePtr curr) 
{ 
    if(curr == NULL) return 0; 

    while(curr->next != NULL) 
    { 
     if(curr->num > curr->next->num) 
      return 0; 

     curr = curr->next; 
    } 

    return 1; 
} 
+0

您可以在循環中刪除'curr!= NULL'檢查,因爲您已經驗證它不會在'if'檢查中爲'NULL',並且事實上我們不會在'while' curr-> next'是'NULL'。 – jxh 2012-07-07 18:20:14

+1

這是真的,謝謝! – 2012-07-07 18:21:56