2016-03-07 186 views
-3

下面我有一個帶搜索功能的鏈接列表。該功能不僅搜索列表中的元素,還設置之前節點的地址,稍後將用於刪除功能。如果在列表中找到該值,則將返回該節點的地址,否則前一個節點爲空,並且該函數返回null。我收到分段錯誤,我不確定原因。有人可以向我解釋爲什麼?謝謝。搜索鏈接列表

struct IntNodeType { 
    int value; 
    IntNodeType * next; 

    IntNodeType (int v=0, IntNodeType * p=NULL):value(v),next(p) 
    { 

    } 
}; 

IntNodeType * Search (IntNodeType * firstNodePtr, int value, 
       IntNodeType * & prevNode) 
{ 

     IntNodeType * cur; 
     IntNodeType * prev; 

     cur = firstNodePtr; 
     prev = prevNode; 

     while (cur!=NULL) 
     { 
       if (cur->value==value) 
       { 
         prev -> next = cur; 
         return cur; 
       } 
       cur = cur->next; //update p with the current node's next field 
     } 

     prevNode = NULL; 
     return NULL; 

} 
+1

你的搜索功能修改列表似乎很奇怪。你確定你的設計? –

+0

'prev - > next = cur;'可能是一個問題。沒有檢查以確保'p​​rev'不是'NULL'。請發佈[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 –

回答

0

有三種情況:該功能:

  1. 你正在努力尋找的價值是在第一個節點,這可以用一個簡單的if語句if(curr->value==value){return curr;}進行測試。這種情況不是我在這裏所要求的,因爲它沒有指向它的前一個節點,除非在問題中另有說明。

  2. 該值位於列表中間。在這種情況下,你應該聲明你所做的兩個指針,但是,prev指針應該指向第一個節點,並且curr應該指向pre> next curr=pre->next。現在在循環中,如果找到值return curr;否則將每個指針移動到下一個節點pre=pre->nextcurr=curr->next

  3. 該值未找到,並且在代碼中正確執行。

現在回到您的代碼。您應該確保pre節點未設置爲NULL,因爲嘗試設置其下一個節點時會導致錯誤。此外,pre和curr都應該同時遍歷,因此在設置pre->next時不會丟失節點之間的連接。