2015-10-26 50 views
-2

我正在使用搜索功能來搜索特定值的鏈接列表。當它發現我想要輸出其位置的價值時。我似乎無法通過第一個節點沒有得到一個錯誤。我認爲循環有問題,但我不確定是什麼。搜索功能 - 鏈接列表

int NumberList::search(double num) 
{ 
    ListNode *nodePtr; 
    nodePtr=head; 
    int i=0; 
    while (nodePtr->value!= NULL) 
    { 
     i=i+1; 
     if (nodePtr->value==num) 
      return i; 
     else 
      nodePtr=nodePtr->next; 
    } 
    return 0; 
} 
+3

如果什麼'nodePtr'是'NULL'? –

+1

你應該說你正在得到什麼錯誤 – pm100

+1

請在這裏請求這種錯誤診斷時發佈一個[MCVE]。否則你的問題是脫離主題。 –

回答

1

您的while循環不合適。您應該測試的是nodePtrNULL

while (nodePtr != NULL) 
{ 
    i = i + 1; 
    if (nodePtr->value == num) 
     return i; 
    else 
     nodePtr = nodePtr->next; 
} 

而且這與指針打交道時使用nullptr而不是NULL一個完美的理由。如果你有使用nullptr然後

while (nodePtr->value!= nullptr) 

會給你一個編譯器錯誤,因爲你不能比較一個doublenullptr

+0

nodePtr可能是一個哨兵節點,其中nodePtr-> value == NULL –

+0

謝謝!這有幫助!我不得不在我的班級中解決這個問題。 –

+0

@DieterLücking是的,但由於OP正在將'value'與'num'進行比較,我假設'value'是一個非指針類型。 – NathanOliver

0

while循環條件應該是:

while (nodePtr != NULL) 

因爲這個錯誤,你的很可能訪問節點誰的指針是NULL而通過取消引用此引起的未定義的行爲

0

您不顯示ListNode類型,但我猜valuedouble

while (nodePtr->value != NULL)

在這裏,我們檢查,如果doubleNULLNULL基本上是0)。但是您需要針對NULL測試nodePtr

注:考慮使用的nullptr代替NULLnullptr是一個空指針的類型安全值,將產生一個編譯錯誤。

error: invalid operands of types 'double' and 'std::nullptr_t' to binary 'operator=='

1

我不知道對應的類是如何定義的,但我認爲,在任何情況下,函數應該看看下面的方式

int NumberList::search(double num) 
{ 
    ListNode *nodePtr = head; 
    int i = 0; 

    while (nodePtr != NULL && nodePtr->value != num) 
    { 
     ++i; 
     nodePtr = nodePtr->next 
    } 

    return nodePtr != NULL ? ++i : 0; 
} 

這是很難比較恰好兩個浮點數。您應該使用比較方法,例如考慮epsilon。

也考慮到其他功能,例如,增加了節點列表中的功能也可以是錯誤的。:)

+0

提示#1:'num'是'double'。提示#2:比較浮點數... –

+0

@ AndreyBenkovsky我附加了我的文章。 –