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

Вы должны проверить head быть NULL, прежде чем использовать его.

Ваш конструктор устанавливает head в NULL, а затем, когда вы звоните insertBasket первое, что она делает, это разыменования указателя head.

Я думаю, что вы можете избавиться от первого оператора if (и его содержимого) в своем insertBasket вообще - цикл должен делать то, что вы хотите. Вам просто нужно, чтобы затем проверить в конце, если prevPtr является NULL, если это так, установите head в newBasketPtr

+0

Итак, внутри функции insertBasket мне нужно сначала проверить, имеет ли голова значение null до того, как я запустил цикл? – user111200115160016510

+0

Вы уже установили currPtr в голову, а затем проверьте, является ли currPtr NULL, поэтому вам не нужна вторая проверка. Проблема заключается в вашем состоянии проверки, а не в состоянии цикла. –

+0

Если это оригинальное утверждение if не нужно, и я удаляю его, тогда где проблема? Поскольку вы сказали, что проблема была в первом условии if. Кроме того, если значение currPtr равно NULL, тогда его нужно установить равным newBasketPtr? – user111200115160016510