1. 链队是一个没有头结点的单链表, 它的front和rear都有具体元素。队空不是front==rear, 而是
    rear==NULL,front==rear可能是只有一个元素。
  2. 存储结构就是在单链表的基础上加上一个结构体 LiQueue,内含两个指针 。

链队的存储结构

typedef int ElemType;
struct QNode {
    ElemType data;
    struct QNode *next;
};
struct LiQueue {
    QNode *front;
    QNode *rear;
};

初始化队列的算法

void InitQueue(LiQueue *&lqu) {
    lqu=(LiQueue *)malloc(sizeof(LiQueue));
    lqu->front=lqu->rear=NULL;
}

判断队空的算法

int QueueEmpty(LiQueue *lqu) {
    return (lqu->rear==NULL);
}

进队的算法

void EnQueue(LiQueue *&lqu,ElemType x) {
    QNode *p;
    p=(QNode *)malloc(sizeof(QNode));
    p->data=x;
    p->next=NULL;
    if(lqu->rear==NULL)
        lqu->front=lqu->rear=p;
    else {
        lqu->rear->next=p;
        lqu->rear=p;
    }
}

出队的算法

int DeQueue(LiQueue *&lqu,ElemType &x) {
    QNode *p;
    if(lqu->rear==NULL)
        return 0;
    p=lqu->front;
if(lqu->front==lqu->rear) //队列中只有一个节点时
    lqu->front=lqu->rear=NULL;
else
    lqu->front=lqu->front->next;
x=p->data;
free(p);
return 1;
}