队列(Queue)的用途十分广泛,可以说在计算机中,一切与时间有关、执行有先后顺序的事件都与队列有关。队列分为链式队列和静态队列两种,前者通过链表实现,而后者通过数组模拟。本文着重讨论链式队列的基本操作。
#include <stdio.h>
#include <stdlib.h>
//定义结点
typedef struct Node
{
int num;
struct Node * pNext;
}NODE,*PNODE;
//定义队列结构体
typedef struct Queue
{
PNODE front; //指向队列的第一个有效节点
PNODE rear; //指向队列的最后一个有效节点的后一个节点(为了便于队列为空的判断)
}QUEUE;
//创建队列
void queueInit(QUEUE * q)
{
q->front = q->rear = (PNODE)malloc(sizeof(NODE));
if (q->front == NULL)
{
printf("动态内存分配失败,程序终止!\n");
exit(-1);
}
return;
}
//因为链式队列不存在满的问题,所以没有判断是否已满的函数
//判断队列是否为空
bool queueIsEmpty(QUEUE * q)
{
if( q->front == q->rear ) //当front和rear指向结点相同时,队列为空
return true;
else
return false;
}
//遍历队列
void traverseQueue(QUEUE * q)
{
if( queueIsEmpty(q) )
{
printf("队列为空,无法遍历!\n");
return;
}
PNODE p = q->front;
while (p->pNext != NULL)
{
printf("%d ", p->num);
p = p->pNext;
}
printf("\n");
}
//进队
void inQueue(QUEUE * q,int val) //val为进队结点的值
{
q->rear->num = val; //进队时,先将值赋给rear,再创建一个空节点,将rear向后移
PNODE pNew;
pNew = (PNODE)malloc(sizeof(NODE));
if ( pNew == NULL )
{
printf("动态内存分配失败,程序终止!\n");
exit(-1);
}
q->rear->pNext = pNew;
q->rear = pNew;
q->rear->pNext = NULL;
}
//出队
bool outQueue(QUEUE * q)
{
PNODE p;
if( queueIsEmpty(q) )
{
printf("队列为空,无法出队!\n");
return false;
}
p = q->front;
printf("出队成功!出队的值为:%d\n",p->num);
q->front = q->front->pNext;
free(p);
p = NULL;
return true;
}
int main()
{
QUEUE Q;
queueInit(&Q);
inQueue(&Q, 1);
traverseQueue(&Q);
inQueue(&Q, 2);
traverseQueue(&Q);
inQueue(&Q, 3);
traverseQueue(&Q);
outQueue(&Q);
traverseQueue(&Q);
outQueue(&Q);
traverseQueue(&Q);
outQueue(&Q);
traverseQueue(&Q);
outQueue(&Q);
return 0;
}
main函数中用于测试的代码运行结果如下: