2015-10-02 105 views
0

在這段代碼中,當我試圖插入鏈表的前面時,我一直遇到分段錯誤。我認爲這與頭部沒有適當地改變有關。在這個程序中,籃子是節點。我使用的調試器指向函數的最後一行作爲問題,但我不完全確定它來自哪裏。節點的分段錯誤

include <cstdlib> 
#include <iostream> 
#include <ctime> 
#include "BasketList.h" 

using namespace std; 

Basket::Basket(int _datum, Basket * _next): 
    egg_num(_datum), nextBasket(_next) 
{} 


int Basket::getEggs() const 
{ 
    return egg_num; 
} 


Basket const* Basket::getNextBasket() const 
{ 
    return nextBasket; 
} 


BasketList::BasketList() : 
head (NULL) 
{} 

void BasketList::insertBasket(int eggs) 
{ 
    Basket *currPtr = head; 
    Basket *prevPtr = NULL; 
    Basket *newBasketPtr; 

    if(eggs < head->egg_num) 
    { 
    currPtr->nextBasket = head; 
    head = currPtr; 
    } 


    while(currPtr != NULL && eggs > currPtr->egg_num) 
    { 
     prevPtr = currPtr; 
     currPtr = currPtr->nextBasket; 
    } 

    newBasketPtr = new Basket(eggs, currPtr); 
    prevPtr->nextBasket = newBasketPtr; 

} 
+1

你能否給我們一個[最小完整示例](http://stackoverflow.com/help/mcve)?這會爲我們節省很多繁瑣的工作。 – Beta

+0

prevPtr在第一次插入時幾乎肯定是NULL。 – dbeer

回答

0

你需要測試headNULL你使用它之前。

你的構造函數設置headNULL,那麼當你調用insertBasket它做的第一件事就是廢棄的指針head

我認爲你可以擺脫你的insertBasket中的第一個if語句(及其內容) - 循環應該做你想要的。你只需要在最後檢查prevPtr是否爲NULL,如果是這樣,請設置headnewBasketPtr

+0

因此,在我執行循環之前,我需要首先檢查head是否爲null? – user111200115160016510

+0

您已經將currPtr設置爲頭,然後檢查currPtr是否爲NULL,因此您不需要再次檢查。問題在於如果測試條件,而不是循環條件。 –

+0

如果原來的if語句是不必要的,我將它刪除,那麼現在的問題在哪裏?既然你說這個問題是在第一個條件。此外,如果currPtr確實等於NULL,那麼它需要被設置爲等於newBasketPtr? – user111200115160016510