2015-10-02 27 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