队列既可以用链表实现,也可以用顺序表实现。跟栈相反的是,栈一般用顺序表来顺序表来实现,而队列常用链表来实现,简称为链队列。
typedef struct QNode
{
ElemType data;
struct QNode *node;
}QNode, *QueuePrt;
typedef struct
{
QueuePrt front, rear; //队头,尾指针
}LinkQueue;
将队头指针指向链队列的头结点,而队尾指针指向终端节点。头结点不是必要的。
创建一个队列要完成两个任务,一是在内存中创建一个头结点,二是将队列的头指针和尾指针都指向这个生成的头结点,因为此时是空队列。
initQueue(LinkQueue *q)
{
q->front=q->rear=(QueuePtr)malloc(sizeof(QNode));
if(!q->fronot)
exit(0);
q->front->next=NULL;
}
入队列操作:
insertQueue(LinkQueue *q, ElemType e)
{
QueuePtr p;
p=(QueuPtr)malloc(sizeof(QNode));
if(p==NULL)
exit(0);
p->data=e;
p=>next=NULL;
q->rear->next=p;
q->rear=p;
}
出队列是将队列中的第一个元素移出,队头指针不发生变化,改变头结点的next指针即可。如果原队列只有一个元素,就应该处理一下对尾指针。
DeleteQueue(LinkQueue *q,ElemType *e)
{
QueuePtr p;
if(q->front == q->rear)
return;
p=q->front->next;
*e=p->data;
q->front->next=p->next;
if(q->rear==p)
q->rear=q->front;
free(p);
}
由于链队列建立在内存的动态区,因此当一个队列不再有用时应当把它及时销毁掉。
DestroyQueue(LinkQueue *q)
{
while(q->front)
{
q->rear=q->front->next;
free(q->front);
q->front=q->rear;
}
}