Прежде чем перейти к put()
, вам нужно правильно настроить существующий конструктор и деструктор!
Если вы собираетесь установить ->Pred
или ->Succ
узла, тогда узел должен сначала существовать . Голова и хвост - это указатели на узел ... не экземпляры узла, поэтому нет узлов, с которыми можно работать:
Вопросы были бы другими, если бы Голова и Хвост сами были Узлами, но тогда они были бы объявлены как:
Node Head; // head node of chain (front)
Node Tail; // tail node of chain (back)
... вместо:
Node * Head; // Pointer to head of chain (front)
Node * Tail; // Pointer to tail of chain (back)
Это технически возможно сделать, но не ясно, почему реализация очереди с пустыми и неинициализированными вообще требовала бы существования каких-либо узлов. Если вы создавали необычный класс очереди, в котором всегда было как минимум два элемента (по какой-то причине), вы могли бы рассмотреть такие странности. Но ваше задание явно не требует этого.
Правило, за которое вы хотите стрелять, состоит в том, что пустая очередь (например, только что построенная) имеет ноль Node
с. Просто установите указатели Head и Tail на NULL, и все готово:
template <typename EType> PQueue::PQueue() {
Head = NULL;
Tail = NULL;
}
Между прочим, существует специальный синтаксис для инициализации членов ... и, хотя в данном случае не имеет значения, инициализируете ли вы с помощью операторов присваивания в коде, в некоторых случаях, таких как инициализация базового класса, вам необходимо сделать это так:
template <typename EType> PQueue::PQueue() :
Head (NULL),
Tail (NULL)
{
}
Таким образом, если правило (или "инвариант" ) состоит в том, что пустые очереди имеют нулевые головы и хвосты, то вызов reset()
должен привести вас в состояние, в котором голова и хвост имеют значение NULL. Но если голова и хвост НЕДЕЙСТВИТЕЛЬНЫ, то почему вы удаляете их в деструкторе? Это технически безопасно:
Безопасно ли удалять нулевой указатель?
Но не будет иметь никакого эффекта. Вызов reset () должен быть достаточным для реализации работы деструктора по освобождению всех выделенных узлов любых непустых очередей ... и reset () должен быть достаточно умным, чтобы ничего не делать, если очередь пуста:
template <typename EType> PQueue::~PQueue() {
reset();
}
Что касается моего совета по переходу на put()
... ну ... похоже, вам нужно немного попотеть в книгах и понять фундаментальные проблемы языка и структур данных. Работайте через простые связанные списки ... без шаблонов ... и просто получите один рабочий:
http://en.wikipedia.org/wiki/Linked_list