队列的链式存储实际上是一个带有头指针和尾指针的单链表(含有头结点)

/*队列的链式存储类型可描述为*/
typedef   struct{                      //链式队列结点
    int data;
    struct LinkNode* next;
    }LinkNode;

typedef   struct{          //链式队列的头结点和尾结点
    LinkNode* front;
    LinkNode* rear;
    }LinkQueue;
 

 

链式队列的基本操作

(1)初始化

void  InitQueue(LinkQueue &Q){
    Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode) );        //建立头结点
    Q.rear->next = NULL;
}

(2)判断空

bool  IsEmpty(LinkQueue Q) {
    if(Q.front == Q.rear)    return true;
    else return false;
}

(3)入队

void EnQueue(LinkQueue &Q, int x){
    LinkNode*p = (LinkNode*)malloc( sizeof(LinkNode) );   //创建新节点,插入到链尾
    p->next = x;
    Q.rear ->next = p;
    p->next = NULL;
    Q.rear = p;
}

(4)出队

bool DeQueue( LinkNode &Q , int &x) {
    if(Q.front == Q.rear)    return false;    //空队
    LinkNode* p = Q.front->next;
    x = p->data;
    Q.front->next = p->next;          //头结点的指针指向下一个结点
    if(Q.rear == p)
        Q.rear = Q.front;                 //若原队列中只有一个结点,需要移动rear指针的位置
    free(p);
    return true;
}