2017-04-30 53 views
-4

我正在爲我的C++類寫一個雙向鏈表,並且在插入函數時遇到了問題。這個想法是將一個值插入到正確位置的一個排序列表中(即在一個較低的數字之後,一個更高的數字之前)。該函數的作用在於它將數字插入到正確的點中,但是當我嘗試分配指針以考慮新節點時,我遇到了seg錯誤。具體線路爲:在C++雙鏈表插入函數中獲取seg錯誤

nodePtr->previous = newNode; 

我使用相同的語法來分配從NODEPTR指針在沒有問題的其他景點,所以我不明白爲什麼賽格故障在這裏。

在此先感謝您的幫助。

編輯:它似乎已經試圖訪問先前的指針nodePtr已被設置爲nullptr後的問題。一個if語句檢查之前,手處理案件。

從.H:

struct ListNode { 
    double value; 
    struct ListNode *next; 
    struct ListNode *previous; 
}; 

ListNode *head; 

從在.cpp:

void NumberList::insertNode(double num) 
{ 
ListNode *newNode; 
ListNode *nodePtr; 
ListNode *previousNode; 
newNode = new ListNode; 
newNode->value = num; 

if(!head) 
{ 
    head = newNode; 
    newNode->next = nullptr; 
} 
else 
{ 
    nodePtr = head; 
    previousNode = nullptr; 
    while (nodePtr != nullptr && nodePtr->value < num) 
    { 
     previousNode = nodePtr; 
     nodePtr = nodePtr->next; 
     if (nodePtr != nullptr) 
      nodePtr->previous = previousNode; 
    } 
    if (previousNode == nullptr) 
    { 
     head = newNode; 
     newNode->next = nodePtr; 
    } 
    else 
    { 
     nodePtr->previous = newNode;/*This is the line that seg faults.*/ 
     previousNode->next = newNode; 
     newNode->next = nodePtr; 
     newNode->previous = previousNode; 
    } 
} 
} 
+0

沒有哪我看你初始化任何指針:他們不默認爲NULL開始,也不會指向可重用的對象默認情況下。 –

+0

我試圖初始化nodePtr->之前的nullptr,但seg故障仍然發生,所以我刪除它。 –

+2

關於其他指針的帽子? 'head','next','previous'和'nodePtr'?所有這些應該被初始化爲nullptr。使用調試器瀏覽代碼,並在給出正確的值之前查看正在使用哪些內容。 –

回答

0

當你將在列表nodePtr年底將成爲null,然後行

nodePtr->previous = newNode; // seg fault 

將導致SEG故障。你必須處理這種情況。

檢查nodePtrnull或不訪問之前...

if(nodePtr) 
    nodePtr->previous = newNode; 
+1

這解決了我的問題,非常感謝。 –

0

需要初始化你的頭的指針指向執行任何操作之前,要nullptr。否則,您試圖將指針取消引用到錯誤的內存地址,這會導致分段錯誤。

當初始化頭,嘗試 ListNode *head = nullptr;

+0

'head'已經初始化爲'newNode'!這不是問題 –

+0

雖然看起來'頭部'具有靜態存儲持續時間。當程序啓動時它將被初始化爲零。 –

+0

'if(!head) { head = newNode; newNode-> next = nullptr; }'在這裏處理該案件 –