bool CLQ_IsEmpty(LNode* rear)
// 判断队列是否为空。
{
// 请在Begin-End之间补充代码,完成队列是否为空的判断。
/********** Begin 1 *********/
if (rear == rear->next) {
return true;
}
return false;
/********** End **********/
}
int CLQ_Length(LNode* rear)
// 返回队列长度,rear指向尾结点。
{
// 请在Begin-End之间补充代码,获取队列长度。
/********** Begin 2 *********/
int count = 0;
LNode* p = rear->next->next; // 从第一个真正的数据节点开始
while (p != rear->next) { // 当没有绕回遇到头结点时,继续遍历
count++;
p = p->next;
}
return count;
/********** End **********/
}
void CLQ_In(LNode* & rear, T x)
// 入队列, 新结点加入链表尾部。rear指向尾结点。
{
// 请在Begin-End之间补充代码,完成新结点入队操作。
/********** Begin 3 *********/
LNode* p = (LNode*)malloc(sizeof(LNode));
p->data = x;
p->next = rear->next; // 1. 新结点的 next 指向头结点 (rear->next 就是头结点)
rear->next = p; // 2. 原来的尾结点的 next 指向新结点
rear = p; // 3. 更新尾指针 rear,使其指向新的尾结点
/********** End **********/
}
bool CLQ_Out(LNode* & rear, T& item)
// 出队列。空队列时,返回值为false。rear指向尾结点。
{
// 请在Begin-End之间补充代码,完成结点出队操作。
/********** Begin 4 *********/
if (CLQ_IsEmpty(rear)) {
return false;
}
LNode* p = rear->next->next; // p 指向要出队的队头节点
item = p->data; // 保存数据
rear->next->next = p->next; // 头结点的 next 指向 p 的下一个节点 (即跳过 p)
if (p == rear) { // 特判:如果出队的是队列中最后一个元素
rear = rear->next; // 尾指针必须重新指向头结点,否则 rear 会变成野指针
}
free(p); // 释放节点内存
return true;
/********** End **********/
}