2014-03-12 90 views
1

我似乎無法找出問題所在的最後一個節點,我的代碼編譯和運行過去有問題的功能,如下圖所示,但是當我嘗試顯示所有節點的內容,我得到這個:刪除C++中的鏈表

LinkedList.exe中的0x50CE1F98(msvcp100d.dll)未處理的異常:0xC0000005:訪問衝突讀取位置0xFEEEFEEE。

//remove (and cleanup after) the node at the tail of the LinkedList (pHead) 
//return a pointer to the head node 
ListNode* removeEnd(ListNode* pHead) 
{ 
    ListNode* pCurr = pHead; 
    ListNode* pPrevPtr = NULL; 

    while (pCurr->pNextNode != NULL) 
    { 
     pCurr = pCurr->pNextNode; 
     pPrevPtr = pCurr->pNextNode; 
    } 


    pPrevPtr = NULL; 

    delete pCurr; 

    return pHead; 
} 

回答

0

我認爲應該是:

pPrevPtr = pCurr; 
pCurr = pCurr->pNextNode; 

不要忘記解除連結。之後簡單地將pPrevPtr設置爲NULL不會影響您的列表。你可能想:

if (pPrevPtr) pPrevPtr->pNextNode = NULL; 
+0

爲什麼取消鏈接? OP只想刪除最後一個,沒有提到關於解除鏈接 – 4pie0

+0

@lizusek他們很可能忘記提到這個 – martynas

+1

@lizusek爲什麼你會刪除節點,然後在列表中留下一個指向它的指針?這是非常麻煩的問題,我對你的評論感到驚訝。 – paddy

0
while (pCurr->pNextNode != NULL) 
{ 
    pPrevPtr = pCurr; 
    pCurr = pCurr->pNextNode; 
} 

而且,你爲什麼返回pHead?它是函數的參數,並且被返回不變。顯然你也應該取消鏈接已刪除的節點。

delete pCurr; 
if (pPrevPtr) pPrevPtr->pNextNode = NULL; 
1

它必須是:

while (pCurr->pNextNode != NULL) 
{ 
    pPrevPtr = pCurr; 
    pCurr = pCurr->pNextNode; 
} 
  1. 循環,直到你的pCurr到達終點(即下一個節點是NULL)
  2. 的pPrevPtr將成爲新的尾部
  3. 集pPrevPtr未來爲NULL(解引用老尾)
0

你的c ode有幾個錯誤。例如,pHead可以等於NULL,或者您在這裏錯誤地設置了pPrevPtr pPrevPtr = pCurr-> pNextNode;這裏pPrevPtr = NULL;

請嘗試下面的代碼。

ListNode* removeEnd(ListNode* pHead) 
{ 
    if (pHead) 
    { 
     ListNode* pCurr = pHead; 
     ListNode* pPrevPtr = NULL; 

     while (pCurr->pNextNode != NULL) 
     { 
      pPrevPtr = pCurr; 
      pCurr = pCurr->pNextNode; 
     } 

     delete pCurr; 
     if (pPrevPtr) pPrevPtr->pNextNode = NULL; 
     else pHead = pPrevPtr; 
    }  

    return pHead; 
}