Ошибка сегментации || Access Violation Writing местоположение

Я хочу вставить узел в двусвязный список. Я сдал в должность, новый коэффициент многочлена и его мощность. У меня нет ошибок компиляции, но я получаю ошибку сегментации в 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;
}

Что я делаю не так и как мне это исправить?

1

Решение

Ну если 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;
1

Другие решения

pos->prev скорее всего, будет NULL или неинициализирован. Вы должны проверить свои данные перед их использованием …

1

Пожалуйста, проверьте, может ли в любом случае выполнения программы pos быть первым узлом в списке. Если это так, то это вызовет ошибку сегментации, когда вы обращаетесь к элементу указателя NULL.

Всегда учитывайте крайние случаи, когда вы программируете, и убедитесь, что вы поставили для них необходимые условия.

0

Интересно, почему вы реализуете двусвязный список самостоятельно? Вы могли бы определить struct или же class который содержит coefficient а также power члены и использовать его в качестве типа значения std::list, Это даст вам множество операций со списком (таких как вставка и удаление элементов) бесплатно. В качестве бонуса, std::list поставляется с соответствующими итераторами (вместо указателей положения), которые будут использоваться в стандартных алгоритмах.

Так как остальные ваши Polynomial класс отсутствует (это класс, а не просто пространство имен, не так ли?) трудно предоставить более конкретную помощь.

0

Ошибка сегментации обычно возникает, когда вы пытаетесь разыменовать нулевой указатель.

Хорошей практикой считается использование проверок NULL при работе с указателями. В этом случае кажется, что pos-> prev равен NULL, что вызывает ошибку сегментации.

0
По вопросам рекламы [email protected]