1 链队列:队列的链式存储结构,线性表的单链表,尾进头出。
2 采用带 头结点的链表。front->头结点,头结点不存任何数据,所以出队时是出队头(头结点后的第一个节点)。
3 空队列时,front和rear都指向头结点。
链队列的结构为:
typedef int QElemType;/*这里假设QElemType的类型为 int*/
typedef struct QNode /*结点结构*/
{
QElemType data;
struct QNode *next;
}QNode,* QueuePtr;
typedef struct /*队列的链表结构*/
{
QueuePtr front,rear;/*队头,队尾指针*/
}LinkQueue;
入队操作,链表尾部插入结点:
/*插入元素e为Q的新队尾元素*/
Status EnyQueue(LinkQueue *Q,QElemType e)
{
QueuePtr s=(QueuePtr)malloc(sizeof(QNode);
if(!s) /*存储分配失败*/
exit(OVERFLOW);
s->data=e;
s->next=NULL;
Q->rear->next=s;/*把拥有元素e的新结点s赋值给原队尾结点的后继*/
Q->rear=s;/*把当前的s结点设置为队尾结点,rear指向s*/
return OK;
}
出队操作,头结点的后继结点出队
/*若列队不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR*/
Status DeQueue(LinkQueue *Q,QElemtype *e)
{
if( Q->front==Q->rear)
return ERROR;
p= Q->front->next;/*将欲删除的队头结点暂给p*/
*e=p->data;/*将欲删除的队头结点的值赋值给e*/
Q->front->next=p->next;/*将原队头结点后继p->next赋值给头结点后继*/
if(Q->rear==p)/*若队头是队尾,则删除后将rear指向头结点*/
Q->rear=Q->front;
free(p);
return OK;
}