2016-11-03 31 views
-1
void List::insertBack(ListItemType newItem) 
    { 
     ListNode *p; 
     ListNode *q; 
     if (head == NULL) 
     { 
      p = new ListNode; 
      p -> item = newItem; 
      p -> next = head; 
      head = p; 
     } 
     else 
     { 
      p = new ListNode; 
      q -> next = p; 
      q = head; 
      while (q-> next != NULL) 
       { 
        q = q->next; 
       }; 
      p -> item = newItem; 
      p -> next = NULL; 
     } 
    } 

我正試圖在C++中鏈接列表的末尾添加一個節點。我對這個概念有點新,所以對我來說有些複雜,當我看到其他答案時,我不會按照他們的目標行事?我做錯了什麼導致分段錯誤?當在末尾添加節點到鏈接列表時,C++中的分段錯誤

+2

ListNode * q; [SNIP] q - > next = p; <<<< q沒有設置,崩潰! – willll

+0

解決此類問題的正確工具是您的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+0

我投票結束這個問題作爲題外話,因爲你沒有表現出努力使用調試器來調查你的代碼的執行,並且SO不是一個調試服務。 –

回答

3

的分配:

q -> next = p; 

還爲時過早。您還沒有初始化q,它指向一些隨機值。您應該將作業移動到您找到想要放置的節點之後p

0

您正在嘗試訪問q->next,然後才首先分配q。你的實現應該是這樣的,而不是:

void List::insertBack(ListItemType newItem) 
{ 
    ListNode *p = new ListNode; 
    p->item = newItem; 
    p->next = NULL; 

    if (head == NULL) 
    { 
     head = p; 
    } 
    else 
    { 
     ListNode *q = head; 
     while (q->next != NULL) 
      q = q->next; 
     q->next = p; 
    } 
} 

話雖這麼說,如果你一個tail指針添加到您的List類,插入到後面將大大簡化,更有效:

void List::insertBack(ListItemType newItem) 
{ 
    ListNode *p = new ListNode; 
    p->item = newItem; 
    p->next = NULL; 

    if (head == NULL) 
     head = p; 

    if (tail != NULL) 
     tail->next = p; 
    tail = p; 
} 
相關問題