2016-02-06 2 views
-2

Этот код копируется из C++-праймера плюс. Я думаю, что некоторые шаги в функции dequeue не нужны. Но в книге говорят, что это важно. Я не понимаю. Я надеюсь, что кто-то может показать мне более подробное объяснение. Вот определение очереди.Процедура удаления узла в классе очереди

typedef unsigned long Item; 
class Queue 
    { 
    private: 
     struct Node{ Item item; struct Node * next; }; 
     enum{ Q_SIZE = 10 }; 
     Node * front; 
     Node * rear; 
     int items;    // the number of item in the queue 
     const int qsize; 
     Queue(const Queue & q) :qsize(0){}; 
     Queue & operator=(const Queue & q){ return *this; } 
     Queue & operator=(const Queue & q){ return *this; } 
    public: 
     Queue(int qs = Q_SIZE); 
     ~Queue(); 
     bool isempty()const; 
     bool isfull()const; 
     int queuecount()const; 
     bool enqueue(const Item & item); 
     bool dequeue(Item & item); 
    }; 

bool Queue::dequeue(Item & item) 
{ 
    if (isempty()) 
     return false; 
    item = front->item; 
    Node * temp; 
    temp=front;    // is it necessary 
    front = front->next; 
    items--; 
    delete temp; 
    if (items == 0) 
     rear = NULL; //why it is not front=rear=Null ; 
    return true; 
} 
+0

Как и в стороне, это абсолютно страшная книга – ildjarn

ответ

0

Узлы в этой очереди хранятся в виде указателей. Чтобы на самом деле создать узел, некоторый код, например, Node* tmp = new Node(), вероятно, находится где-то в enqueue-Function.

С указателем front = front->next; указатель на первый элемент перемещается в следующий элемент в очереди. Но как насчет предыдущего front -node? Перемещая указатель, мы «забываем» его адрес, но мы не удаляем объект или не освобождаем память. Для этого мы должны использовать delete, поэтому адрес временно сохраняется для вызова delete. Это не приведет к утечке памяти.

О вашем втором вопросе: указатель front уже перенесен на front->next. Что могло бы быть, если в очереди был только один элемент? Вероятно, NULL, что должно быть обеспечено функцией enqueue. ("Примечание: Если вы руководите этим кодом, это хорошая идея, чтобы заменить NULL с nullptr).. Единственными переменным, которая не обновляется пока является rear

+0

Благодарим за помощь! – Ryan

0
temp = front; 

сохраняет указатель на передний элемент, поэтому он может быть удален после front был изменен.

Если очередь пуста, front = front->next; уже установил номер front, чтобы повторить ее не нужно.

+0

Благодарим за помощь! – Ryan

Смежные вопросы