void llist::deleteFront(el_t& OldNum) {
if (isEmpty()) {
throw underflow()
}
Если список пуст, мы выкидываем исключение (оно уведомит разработчика о том, что вызывающий код неправильно вызвал deleteFront()
в уже пустом списке);
else if (Count == 1) {
В случаеесть один узел, который мы делаем следующим образом:
OldNum = Front->Elem;
Мы возвращаем элемент из только что удаленного узла вызывающей стороне, поскольку параметр Oldnum
является ссылкой (&
), которую мы можем сохранить элементпо этой ссылке и вызывающий будет иметь доступ к нему после завершения функции;
Node *Second; // <- this is useless!!
Объявление указателя для нового узла, но он не используется, поэтому эта строка фактически ничего не делает (вы можете удалить его);
delete Front;
Front = NULL; //missing!!
Мы удаляем только существующий узел Front
и занимаемую им память (вместе с полем elem
и всеми другими, если они есть) освобождаются;обратите внимание, что вы должны добавить Front = NULL;
для правильной аннулирования указателя Front
, который теперь указывает на ничто;
Count--;
}
Мы уменьшаем Count
на 1
(до 0
) и заканчиваем.
else {
В последнем случае, когда существует более 1 узла:
OldNum = Front->Elem;
Мы возвращаем элемент точно так же, как и в предыдущем случае;
Node *Second;
Second = Front->Next;
Этот мынеобходимо временно «запомнить» следующий узел с именем Second
(который будет первым с этого момента);
delete Front;
Теперь мы удаляем узел First
, его память освобождается;
Front = Second;
Поскольку указатель Front
всегда должен указывать на первый узел, мы переназначаем его с помощью Second
(именно поэтому мы его запомнили);
Count--;
}
Мыуменьшить Count
на 1
и завершить;Однако, как отметил Игорь, все это может быть уменьшено до:
if (isEmpty()) {
throw underflow()
}
else {
OldNum = Front->Elem;
Node *Second;
Second = Front->Next;
delete Front;
Front = Second;
Count--;
}
Случай else
будет обрабатывать также случай с одним узлом. Только значение NULL
будет передано из Front->Next
в указатель Front
.