Я хочу вставить узел в двусвязный список. Я сдал в должность, новый коэффициент многочлена и его мощность. У меня нет ошибок компиляции, но я получаю ошибку сегментации в linux (g ++) и место записи нарушения прав доступа при запуске с Visual Studio.
Необработанное исключение в 0x00bd20ba в Program.exe: 0xC0000005: Место записи нарушения прав доступа 0xcdcdcdd9.
void Polynomial::insert( Term *pos, double newCoefficient, int power )
{
Term *newTerm = new Term; // create a new node to insert
// Link the new node to previous and next, given the position
newTerm->prev = pos->prev;
newTerm->next = pos;
newTerm->prev->next = newTerm; // Here's where I'm getting the error
newTerm->next->prev = newTerm;
// change the coefficient and power
newTerm->coefficient = newCoefficient;
newTerm->power = power;
}
Что я делаю не так и как мне это исправить?
Ну если pos
это первый узел, то pos->prev
должно быть NULL
, В этом случае заявление newTerm->prev->next = newTerm;
может произойти сбой, потому что нет такой вещи, как NULL->next
!
Вы должны проверить явно, если pos
это первый узел в списке, и место newNode
соответственно.
// Link the new node to previous and next, given the position
newTerm->prev = pos->prev;
newTerm->next = pos;
if(pos->prev) newTerm->prev->next = newTerm;
newTerm->next->prev = newTerm;
pos->prev
скорее всего, будет NULL или неинициализирован. Вы должны проверить свои данные перед их использованием …
Пожалуйста, проверьте, может ли в любом случае выполнения программы pos быть первым узлом в списке. Если это так, то это вызовет ошибку сегментации, когда вы обращаетесь к элементу указателя NULL.
Всегда учитывайте крайние случаи, когда вы программируете, и убедитесь, что вы поставили для них необходимые условия.
Интересно, почему вы реализуете двусвязный список самостоятельно? Вы могли бы определить struct
или же class
который содержит coefficient
а также power
члены и использовать его в качестве типа значения std::list
, Это даст вам множество операций со списком (таких как вставка и удаление элементов) бесплатно. В качестве бонуса, std::list
поставляется с соответствующими итераторами (вместо указателей положения), которые будут использоваться в стандартных алгоритмах.
Так как остальные ваши Polynomial
класс отсутствует (это класс, а не просто пространство имен, не так ли?) трудно предоставить более конкретную помощь.
Ошибка сегментации обычно возникает, когда вы пытаетесь разыменовать нулевой указатель.
Хорошей практикой считается использование проверок NULL при работе с указателями. В этом случае кажется, что pos-> prev равен NULL, что вызывает ошибку сегментации.