Когда я запускаю код, я получаю сообщение об ошибке: «prev is null pointer».Однако, если я удаляю часть '= NULL' из объявления узла, я получаю ошибку компиляции, которая говорит: "prev is неинициализирован".
Хорошо, да.Хотя в нескольких местах вы пытаетесь присвоить prev->next
, нигде вы не назначаете самому prev
, если не хотите считать его инициализатор.Когда эта переменная равна NULL
или вообще не имеет определенного значения, она не указывает ни на один объект.При таких обстоятельствах отсутствует prev->next
.
Похоже, вы хотите использовать prev
для отслеживания узла, предшествующего текущему минимуму.Это представляет небольшую проблему, когда головным узлом вашего списка является текущий минимум.Это можно обойти, установив prev
в NULL
в этом случае и написав дополнительный код для этого особого случая, но проще и чище обойти проблему, введя искусственный предшественник:
struct LetterFrequencyPair head = { .next = root };
struct LetterFrequencyPair *prev = &head;
Обратите внимание, что нет необходимости выделять головной узел динамически.В этом случае вам не нужно каких-либо динамических выделений.В настоящее время ваш код теряет память, которую он выделяет для low
, на которую он изначально указывает, а выделение для lowest
и освобождение исходного низшего узла является расточительным.удаление превращает наш быть первым.Вам не нужна специальная обработка для этого в точке удаления;в этом случае он должен выпадать естественным образом в том случае, если head.next
установлено (через prev
), чтобы указывать на новый первый узел.В конце, однако, вы захотите скопировать его обратно:
root = head.next;
Если первый узел не тот, который был удален, то это назначение не имеет чистого эффекта.
У вас много других проблем с вашим кодом, которые выходят далеко за рамки вопроса, но с этого стоит начать.