一、链队列的表示和实现
1.初始化
生成新结点作为头结点,将队头队尾指针指向此结点;头结点指针域置空。
Status InitQueue (LinkQueue &Q)
{
Q.front = Q.rear = new QNode; //生成新结点,队头队尾指针指向新结点
if(!Q.front) exit(OVERFLOW);
Q.front->next = NULL; //头结点指针域置空
return OK;
}
2.入队
用指针p指向入队元素,将新结点插入队尾,修改队尾指针为p。
Status EnQueue(LinkQueue &Q,QElemType e)
{
//插入元素e为Q的新队尾元素
p = new QNode; //为入队元素分配空间
p->data=e; //将新结点数据域置为e
p->next=NULL;
Q.rear->next=p;
Q.rear=p; //修改队尾指针
return OK;
}
3.出队
判断队列是否为空;用p指向队头元素临时保存队头元素的值;修改头结点指针域使其指向下一个结点;判断出队元素是否是最后一个元素,如果是,需重新赋值队尾指针指向头结点;最后释放队头元素的空间。
Status DeQueue (LinkQueue &Q,QElemType &e)
{
//删除Q的队头元素
if(Q.front == Q.rear) return ERROR;
p = Q.front->next; //p指向队头元素
e = p->data;
Q.front->next = p->next; //修改头结点指针域
if(Q.rear == p) Q.rear = Q.front;
delete p; //释放原队头元素空间
return OK;
}
二、循环队列的表示和实现
1.初始化
为队列分配空间,并将头指针front和尾指针rear置空。
2.求队列长度
非循环队列的尾指针与头指针差值为队列长度;循环队列差值可能为负,计算队列长度需将差值加队列最大长度再与最大长度求余可得。
int QueueLength(SqQueue Q)
{
//返回Q的元素个数,即队列的长度
return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}
2.入队
在队尾插入新元素后队尾指针加1
3.出队
在队尾插入新元素后队尾指针加1