1.链队的组成
(1)存储队列元素的数据节点
(2)指向队头和队尾指针的链队节点
2.链队的四要素
(1)队空条件:q->rear==NULL,无需考虑堆满
(2)入队操作:将新的数据节点插入到单链表表尾
(3)出队操作:删除单链表第一个数据节点
3.存储实现
(1)结构体定义
typedef struct QNode //链队中的数据节点类型
{
ElemType data;
struct QNode *next;
}QNode;
typedef struct //链队节点类型
{
QNode *front; //指向单链表队头节点
QNode *rear; //指向单链表队尾节点
}LiQueue;
(2)初始化队列
void InitQueue(Liqueue *&q)
{
q=new LiQueue;
q->front=NULL;
q->rear=NULL;
}
(3)销毁队列
void DestroyQueue(LiQueue *&q)
{
QNode *p=q->front,*r;
if(p!=NULL)
{
r=p->next;
while(r!=NULL)
{
delete p;
p=r;
r=p->next;
}
}
delete p;
delete q;
}
(4)入队
void enQueue(LiQueue *&q,ElemType e)
{
QNode *newNode=new QNode;
newNode->data=e;
newNode->next=NULL;
if(Queueempty(q))
{
q->rear=newNode; //当新插入的元素为链队列中第一个元素,需将队头和队尾指针都指向e
q->front=newNode;
}else{
q->rear->next=newNode;
q->near=newNode;
}
}
5.出队
bool deQueue(LiQueue *&q,ElemType &e)
{
QNode *del;
if(QueueEmpty(q)) //出队要先判空
{
return false;
del=q->front;
if(q->front==q->rear) //队列只有一个节点时,队头等于队尾,为空
{
q->front=q->rear=NULL;
}
else{
q->front=q->front->next; //多个节点时
e=del->data;
delete del;
return true;
}
}
(6)判空
bool QueueEmpty(LiQueue *q)
{
return(q->rear==NULL)
}