出队操作时,就是头结点的后继结点出队,将头结点的后继改为它后面的结点,若链表除头结点外只剩一个元素时,则需将rear指向头结点,如图4-13-4所示。
图4-13-4
p = Q->front->next; //保存首元素结点的位置
front->next = front->next->next;//(头指针指向的头结点)的指针域 指向 头结点的后继后继结点
Q->front->next = p->next;
//尽量不要出现->next->next这样的后继后继,要换名处理才better
代码如下:
/* 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR */
Status DeQueue(LinkQueue *Q, QElemType *e)
{
QueuePtr p;
if (Q->front == Q->rear)
return ERROR;
/* 将欲删除的队头结点暂存给p,见上图中① */
p = Q->front->next;
/* 将欲删除的队头结点的值赋值给e */
*e = p->data;
/* 将原队头结点后继p->next赋值给头结点后继, */
Q->front->next = p->next;
/* 见上图中② */
/* 若队头是队尾,则删除后将rear指向头结点,见上图中③ */
if (Q->rear == p)
Q->rear = Q->front;
free(p);
return OK;
}