队列的链式表示和实现
为了方便起见,给链队增加了一个头结点。
————队列的链式存储结构————
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
①初始化
Status InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=new QNode; //生成新结点作为头结点,队头和队尾指针指向该结点
Q.front->next=NULL; //头指针指针域置空
return OK;
}
②入队
注意他这里的rear和顺序存储结构里的不一样,它直接指向的是队尾元素的值,不是对尾元素的下一个位置
Status EnQueue(LinkQueue &Q,QElemType e)
{
p=new QNode; //生成新节点
p->data=e;
P->next=NULL;
Q.rear->next=p; //将新节点插入到队尾
Q.rear=p; //修改队尾指针
return OK;
}
③出队
Status DeQueue(LinkQueue &Q,QElemType &e)
{
if(Q.rear==Q.front) return ERROR;
e=Q.front->next->data; //e保存队头元素的值
p=Q.front->next; //p指向队头元素
Q.front->next=p->next; //修改头结点的指针域
if(Q.rear==p) Q.rear=Q.front; //最后一个元素被删,队尾指针指向头节点
delete p;
return OK;
}
④取队头元素
QElemType GetHead(LinkQueue Q)
{
if(Q.front==Q.rear) return ERROR;
return Q.front->next->data; //返回队头元素的值,对头指针不变
}