队列的链式存储实际上是一个带有头指针和尾指针的单链表(含有头结点)
/*队列的链式存储类型可描述为*/ 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; }