出队操作时,就是头结点的后继结点出队,将头结点的后继改为它后面的结点,若链表除头结点外只剩一个元素时,则需将rear指向头结点,如图4-13-4所示。
    image.png
    图4-13-4
    p = Q->front->next; //保存首元素结点的位置
    front->next = front->next->next;//(头指针指向的头结点)的指针域 指向 头结点的后继后继结点
    Q->front->next = p->next;

    //尽量不要出现->next->next这样的后继后继,要换名处理才better

    代码如下:

    1. /* 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR */
    2. Status DeQueue(LinkQueue *Q, QElemType *e)
    3. {
    4. QueuePtr p;
    5. if (Q->front == Q->rear)
    6. return ERROR;
    7. /* 将欲删除的队头结点暂存给p,见上图中① */
    8. p = Q->front->next;
    9. /* 将欲删除的队头结点的值赋值给e */
    10. *e = p->data;
    11. /* 将原队头结点后继p->next赋值给头结点后继, */
    12. Q->front->next = p->next;
    13. /* 见上图中② */
    14. /* 若队头是队尾,则删除后将rear指向头结点,见上图中③ */
    15. if (Q->rear == p)
    16. Q->rear = Q->front;
    17. free(p);
    18. return OK;
    19. }