#include<stdio.h>
typedef enum{false,true} bool;
typedef int Elementype;
typedef struct LinkNode{
Elementype data;
struct LinkNode *next;
}*LinkNode;
typedef struct{
LinkNode front,rear;
}*LinkQueue;
void InitQueue(LinkQueue Q)//初始化队列
{
Q->front=Q->rear=(LinkNode)malloc(sizeof(LinkNode));//申请头结点,因此建立的是带头结点的链表
Q->front->next=NULL;
}
bool IsEmpty(LinkQueue Q)//判定队列空
{
if(Q->front==Q->rear)
return true;
else
return false;
}
void EnQueue(LinkQueue Q,Elementype x)//入队
{
LinkNode s=(LinkNode)malloc(sizeof(LinkNode));
s->data=x;
s->next=NULL;
Q->rear->next=s;
Q->rear=s;
}//链表结构的队列一般不会满,就没加判满操作,这里的入队是入的链尾。
bool DeQueue(LinkQueue Q,Elementype x)//出队列,队列头才能出队列,说实话,我不太喜欢这么简单的思考,毕竟现实社会还有插队的是吧,哈哈。
{
if(IsEmpty(Q))
return false;
else
{
LinkNode p=Q->front->next;
x=p->data;
printf("出队列的数字是:%d\n",x);
Q->front->next=p->next;
if(Q->rear==p)
{
Q->rear==Q->front;//Q->front一直在头结点位置,如果链表只有一个节点,删除后,Q->rear必须与Q->front相同,以满足IsEmpty的条件。
}
free(p);
return true;
}
}
void PrintQueue(LinkQueue Q)
{
LinkNode p;
p=Q->front->next;
printf("还在队列中的数字是:");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}
int main()
{
LinkQueue Q;
Q=(LinkQueue)malloc(sizeof(LinkQueue));
InitQueue(Q);
Elementype x;
while(true)
{
scanf("%d",&x);
if(x==999) //当输入999,就不入队列了
break;
EnQueue(Q,x);
}
int QueueFront;
DeQueue(Q,QueueFront);//这里的QueueFront没多大用处,主要为了满足DeQueue有两个参数的标准
PrintQueue(Q);
}
希望明年考研前能复习好吧。