template struct QNode //结点 { DT data; //数据域,存储数据元素值 QNode* next;//指针域,指向下一个结点 }; template struct LinkQueue { QNode
* front; QNode
* rear; }; //【算法3.19】 template void InitQueue(LinkQueue
& Q)//创建空队列 { Q.front = new QNode
; //创建头结点 if (!Q.front) exit(1); //创建失败,结束运行 Q.front->next = NULL; Q.rear = Q.front; } //【算法3.20】 template void DestroyQueue(LinkQueue
& Q)//释放链队 { QNode
* p; while (Q.front)//从头结点开始,依次释放结点 { p = Q.front; Q.front = Q.front->next; delete p; } Q.rear = Q.front = NULL; } template void ClearQueue(LinkQueue
& Q) // 清空链队 { QNode
* p; while (Q.front->next) //从队头开始,依次释放结点 { p = Q.front->next; Q.front->next = p->next; delete p; } Q.front->next = NULL; // 空队 Q.rear = Q.front; } //【算法3.21】 入队 template bool EnQueue(LinkQueue
& Q, DT e) { QNode
* p; p = new QNode
; // 创建新结点 if (!p) return false; // 创建失败,结束运行 p->data = e; // 新结点赋值 p->next = NULL; // 链在队尾 Q.rear->next = p; Q.rear = p; return true; // 入队成功,返回true } //【算法3.22】 出队 template bool DeQueue(LinkQueue
& Q, DT& e) { QNode
* p; if (Q.front == Q.rear) return false; //队空,返回false p = Q.front->next; // 取出队元素 e = p->data; Q.front->next = p->next; //队首元素出队 if (Q.rear == p) //只有一个元素时出队, Q.rear = Q.front; // 修改队尾 delete p; return true; // 出队成功,返回true } //【算法3.23】 取队头元素 template bool GetHead(LinkQueue
Q, DT& e) { if (Q.front == Q.rear) return false; // 队空,返回false e = Q.front->next->data; return true; // 删除成功,返回true } //取队尾元素 template bool GetTail(LinkQueue
Q, DT& e) { if (Q.front == Q.rear) // 队空 return false; // 返回false e = Q.rear->data; // 获取队尾元素 return true; // 返回true } //测队空 template bool QueueEmpty(LinkQueue
Q) { if (Q.front == Q.rear) // 队空 return true; //返回true else //非空 return false; //返回false } //显示队列内容 template void DispQueue(LinkQueue
Q) { QNode
* p; p = Q.front->next; while (p) { cout << p->data << "\t"; p = p->next; } cout << endl; }