链队列是用链表作为存储结构的队列。队列的特点是先入先出,后入后出。这里采用带头结点的链表结构,并设置一个头指针front和一个尾指针rear始终指向头节点和队尾结点。
#include<stdio.h>
#include<stdlib.h>
typedef struct Node /*定义队列结点结构*/
{
int data; /*数据域*/
struct Node *next; /*指针域*/
}LinkQueueNode;
typedef struct
{
LinkQueueNode *front; /*队头指针*/
LinkQueueNode *rear; /*队尾指针*/
}LinkQueue;
void InitQueue(LinkQueue *Q) /*初始化队列函数*/
{
Q->front=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
if(Q->front!=NULL) /*确保分配头节点成功*/
{
Q->rear=Q->front;
Q->front->next=NULL;
printf("Init Queue Successfully!\n");
}
else
{
printf("Error!Can not Init Queue!\n");
}
}
void EnterQueue(LinkQueue *Q,int x) /*进入队列函数*/
{
LinkQueueNode *NewNode;
NewNode=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
if(NewNode==NULL) /*溢出*/
{
printf("Can not Enter Queue!\n");
}
else
{
NewNode->data=x; /*赋值*/
NewNode->next=NULL;
Q->rear->next=NewNode;
Q->rear=NewNode; /*改变队尾指针*/
printf("Enter Queue Successfully!\n");
}
}
void DeleteQueue(LinkQueue *Q) /*出队列函数*/
{
LinkQueueNode *p;
if(Q->front==Q->rear) /*判断队列是否为空*/
{
printf("Queue is Empty!\n");
}
else
{
p=Q->front->next;
Q->front->next=p->next; /*改变队头指针*/
if(Q->rear==p) /*如果队列就一个结点,出队列后队列为空*/
{
Q->rear=Q->front;
}
printf("%d\n",p->data);
free(p); /*出队列后,删除该结点*/
printf("Out of Queue Successfully!\n");
}
}
int main()
{
LinkQueue Q;
InitQueue(&Q);
EnterQueue(&Q,1);
EnterQueue(&Q,2);
EnterQueue(&Q,3);
DeleteQueue(&Q);
DeleteQueue(&Q);
DeleteQueue(&Q);
DeleteQueue(&Q); /*队列中3个结点,第4次出队列队列应为空*/
return 0;
}
运行结果:
小结: 这里只包括了链队列的基础操作:初始化、入队、出队。入队操作采用类似于链表的尾插法。通过改变队尾指针来插入队列。值得注意的是,出队列操作中,需判断队列中是否只有一个元素。如果只有一个元素,则需在出队列后将队尾指针指向头节点。