200字
4.16-2
2026-04-16
2026-04-16

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 **********/

}

4.16-2
作者
Aeolus
发表于
2026-04-16
License
CC BY-NC-SA 4.0

评论