Часто при реализации связанных списков, деревьев или других связанных структур данных часто полезно разделить реализацию на инкапсулирующий объект (LinkedList, Tree и т. Д.) И объект узла (LinkedListNode, TreeNode и т. Д.), Который позволяет один для реализации методов за пределами рассматриваемых узлов. Проблема с выталкиванием из узла состоит в том, что извлеченный узел становится недействительным. Инкапсуляция узлов в какой-либо более крупной структуре данных позволяет этой структуре данных выполнять извлечение извне, удаляя старый узел.
Еще одна вещь, которую следует рассмотреть, - это как будет вести себя поп, если для него не осталось предметов. Должно ли это бросить исключение? Должно ли это просто привести к неопределенному поведению?
В типичном связанном списке инкапсулирующий класс, как правило, поддерживает указатель на первый элемент, целочисленный счетчик числа элементов и, необязательно, указатель на последний элемент (для вставки с постоянным временем в конец списка) , Для реализации стека вам нужен только один указатель на начало списка.
Локальные переменные уничтожаются автоматически; однако, ваш указатель является локальной переменной, а не элементом, на который он указывает. Элемент, на который указывает ваш указатель, не будет освобожден без явного удаления.
В вашем поп-коде вы фактически удаляете слишком много элементов. Должно быть:
int result = head->nodeNum; // extract the result
LinkNode* tmp = head; // save this so we can delete it
head = head->next; // move the head forward to the next item
delete tmp; // deallocate previous head
return result;
Кроме того, не забудьте проверить, что голова не нулевая, прежде чем пытаться выскочить.