循环链表表示队列,只设一个队尾结点。因为是循环链表,队尾结点的下一个就是头结点,所以可以从队尾结点得知头结点的位置。
判断队空的:队尾指针指向头结点
一、初始化
bool InitQueue(LinkQueue Q){
Q->next=Q; //头结点指针指向自己实现循环链表
Rear=Q; //队尾指针指向头结点,表示队空
return OK;
}
二、判断队列是否为空
bool JudgeQueue(LinkQueue Q){
if(Rear==Q){ //判断队列是否为空
printf("Queue is Empty\n");
return EMPTY;
}
printf("Queue is not empty\n"); //否则队列不空
return NOTEMPTY;
}
三、入队
bool EnQueue(LinkQueue Q,ElemType e){
LinkQueue p;
p=(LinkQueue)malloc(sizeof(Queue)); //申请一块空间来存放新数据
if(p==NULL)
return ERROR;
p->data=e; //将新数据存入
p->next=Rear->next; //将新结点连到尾结点之后
Rear->next=p;
Rear=p; //尾指针指向新的尾结点
return OK;
}
四、出队
bool DeQueue(LinkQueue Q,ElemType *e){
if(Rear==Q){ //判断队列是否为空
printf("Queue is Empty\n");
return ERROR;
}
LinkQueue p;
p=Rear->next->next; 记录先首元结点(队列的第一个元素所在的结点)
*e=p->data; //取值
Rear->next->next=p->next; //首元结点的指针域赋值给头结点
if(Rear==p) //如果只有一个结点(即队列的尾结点就是p)
Rear=Q; //使尾指针指向头结点,表示队空
free(p); //释放p
return OK;
}
下面是测试代码:
#include<stdio.h>
#include<stdlib.h>
typedef enum{ERROR,OK,EMPTY,NOTEMPTY} bool;
typedef int Status;
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
}Queue,*LinkQueue;
LinkQueue Rear;
bool InitQueue(LinkQueue Q){
Q->next=Q;
Rear=Q;
return OK;
}
bool JudgeQueue(LinkQueue Q){
if(Rear==Q){
printf("Queue is Empty\n");
return EMPTY;
}
printf("Queue is not empty\n");
return NOTEMPTY;
}
bool EnQueue(LinkQueue Q,ElemType e){
LinkQueue p;
p=(LinkQueue)malloc(sizeof(Queue));
if(p==NULL)
return ERROR;
p->data=e;
p->next=Rear->next;
Rear->next=p;
Rear=p;
return OK;
}
bool DeQueue(LinkQueue Q,ElemType *e){
if(Rear==Q){
printf("Queue is Empty\n");
return ERROR;
}
LinkQueue p;
p=Rear->next->next;
*e=p->data;
Rear->next->next=p->next;
if(Rear==p)
Rear=Q;
free(p);
return OK;
}
int main(){
LinkQueue Q = NULL;
Q=(LinkQueue)malloc(sizeof(Queue));
bool flag;
flag=InitQueue(Q);
if(flag==ERROR)
printf("Init RROR\n");
else if(flag==OK)
printf("Init OK\n");
JudgeQueue(Q);
ElemType e;
for(int i=0;i<4;i++){
scanf("%d",&e);
flag=EnQueue(Q, e);
if(flag==OK)
printf("Enter OK\n");
else
printf("Enter ERROR\n");
}
JudgeQueue(Q);
for(int i=0;i<4;i++){
flag=DeQueue(Q, &e);
if(flag==ERROR){
printf("Queue is EmPty\n");
continue;
}
if(flag==OK){
printf("%d\n",e);
}
JudgeQueue(Q);
}
}