2016-09-28 113 views
0

實現在現有節點(key = oldkey)之後插入新節點(key = newKey)的函數。如果在節點中找不到newKey,則不執行任何操作。錯誤調試鏈接列表函數上的分段錯誤

這是我的節點構造:

struct Node { 
    int key; 
    Node* next; 
}; 

這是我的方法:

void insert_after(Node* head, int oldKey, int newKey){ 

    Node* currNode = NULL; 
    Node* nextNode = NULL; 
    Node* newNode = NULL; 

    if (head == NULL) { 
    return; 
    } 

    currNode = head; 
    newNode->key = newKey; 

    while (currNode != NULL) { 

    if (currNode->key == oldKey) { 

     // oldKey is anywhere but last node 

     if (currNode->next != NULL) { 
     nextNode = currNode->next; 
     newNode->next = nextNode; 
     currNode->next = newNode; 
     break; 
     } 

     // oldKey is at the last node 

     else { 
     currNode->next = newNode; 
     newNode->next = NULL; 
     break;  
     } 
    } 

    currNode = currNode->next; 
    } 

} 

提前感謝!

+4

可以簡化爲:Node * newNode = NULL; newNode-> key = newKey;' – melpomene

+0

建議:如果你不插入節點,警告呼叫者。當他們晚些時候去尋找並找不到時,他們會很生氣。即使這是他們的錯,他們也找不到它。人很奇怪。 – user4581301

+2

2nd'break'語句在'else'裏面,還是在'if'裏面呢? –

回答

0

您正在嘗試取消引用空指針:

currNode = head; 
newNode->key = newKey; // <-- newNode is NULL 

if (head == NULL) { 

此外,這是C++;不需要在範圍的開始處聲明所有變量。根據需要聲明和初始化變量以幫助避免這種情況。例如,這更明顯是錯誤的:

Node* newNode = NULL; // or "nullptr" if using C++11 
newNode->key = newKey; 
+0

是的謝謝你;問題是我沒有爲節點「newNode」分配內存。 – jamessxiao