删除队列类中的节点的过程

The procedure of delete node in the queue class

本文关键字:节点 过程 队列 删除      更新时间:2023-10-16

这段代码是从 c++ primer plus 复制而来的。我认为一些 取消排队功能中的步骤是不必要的。但是这本书 说这很重要。我不明白。我希望有人能给我看更详细的解释。下面是队列的定义。

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;
}

此队列中的节点存储为指针。要实际创建一个节点,像Node* tmp = new Node()这样的代码可能在enqueue-Function中的某个地方。

使用front = front->next;,指向第一个元素的指针将移动到队列中的下一个元素。但是以前的front节点呢?通过移动指针,我们"忘记"了它的地址,但我们不会删除对象或释放内存。我们必须使用delete来执行此操作,这就是为什么临时存储地址以调用删除的原因。不删除它会导致此处内存泄漏。

关于你的第二个问题:front指针已经移动到front->next。如果队列中只有一个元素,那会是什么?可能NULL,这应该由enqueue函数来保证。("注意:如果您正在管理此代码,最好将NULL替换为nullptr)。唯一尚未更新的变量是 rear .

temp = front;

保存指向 Front 元素的指针,以便在修改front后将其删除。

如果队列为空,则front = front->next;已将front设置为 null,因此无需再次执行此操作。