队列的链式存储结构及实现
队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们简称为链队列。
typedef intQElemType; /*QElemType类型根据实际情况而定,int*/
typedef structQNode /*结点结构*/
{
QElemType data;
struct QNode *next;
} QNode,*QueuePtr;
typedef struct /*队列的链表结构*/
{
QueuePtr front,rear; /*队头队尾指针*/
} LinkQueue;
队列的链式存储结构 –入队操作
入队操作时,其实就是在链式尾部插入结点。
代码如下:
/*插入元素e为Q的新的队尾元素*
Status EnQueue(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;
}
队列的链式存储结构—出队操作
出队操作时,就是头结点的后继结点出队,将头结点的后继改为它后面的结点,若链表除头结点外只剩一个元素时,则需将rear指向头结点。
代码如下:
/*若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR*/
StatusDnQueue(LinkQueue *Q, QElemType e)
{
QueuePtr p;
if(Q->front == Q->rear)
return ERROR;
p=Q->front->next;
*e =p->data;
Q->front->next = p->next;
if(Q->rear == p)
Q->rear = Q->front;
free(p);
return OK;
}