删除队列类中的节点的过程
The procedure of delete node in the queue class
这段代码是从 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,因此无需再次执行此操作。
相关文章:
- 反向给定链表中的K节点
- 递归函数计算序列中的平方和(并输出过程)
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- Boost Graph Library,修复节点大小
- C++A*算法并不总是在路径中具有目标节点
- 如何找到2个单链表的公共节点
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 是否删除在对象构造过程中创建的对象
- 为什么我的删除节点函数实际上没有删除节点?
- 我们可以删除链表中静态内存中的节点吗
- 如何在pugixml中获取节点的内部XML
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 如何在鼠标挂钩过程中检测拖动
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- Node中的子节点列表在C++中的BFS遍历过程中丢失
- 如何在节点GYP构建过程中包括Tesseract库
- 在比较过程中返回节点信息
- 删除队列类中的节点的过程