//Author:张佳琪
#include <stdio.h>
#include <stdlib.h>
typedef int QElemType;
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
void init(LinkQueue *q)
{
q->front=q->rear=(QueuePtr)malloc(sizeof(QNode));
q->front->next=NULL;
}
void insert(LinkQueue *q,QElemType x)
{
QueuePtr temp=(QNode *)malloc(sizeof(QNode));
if(temp!=NULL)
{
temp->data=x;
temp->next=NULL;
q->rear->next=temp;
q->rear=temp;
}
}
void create(LinkQueue *q)
{
init(q);
QElemType x;
while(scanf("%d",&x))
{
if(x==0)
break;
insert(q,x);
}
}
void deleteq(LinkQueue *q,QElemType *e)
{
if(q->rear==q->front)
return;
QueuePtr temp=q->front->next;
if(temp==q->rear)
{
q->rear=q->front;
}
*e=temp->data;
q->front->next=temp->next;
free(temp);
}
void clear(LinkQueue *q)
{
if(q->rear==q->front)
return;
QueuePtr temp=q->front->next;
while(temp!=NULL)
{
QueuePtr pr=temp;
temp=temp->next;
free(pr);
}
q->rear=q->front=NULL;
}
int get_length(LinkQueue *q)
{
if(q->front==q->rear)
return 0;
QueuePtr temp=q->front;
int i=0;
while(temp!=q->rear)
{
i++;
temp=temp->next;
}
return i;
}
int is_empty(LinkQueue *q)
{
if(q->rear==q->front)
return 1;
else
return 0;
}
void show(LinkQueue *q)
{
if(q->rear==q->front)
return;
QueuePtr temp=q->front->next;
while(temp!=NULL)
{
printf("%d ",temp->data);
temp=temp->next;
}
printf("\n");
}
int main()
{
LinkQueue L;
QElemType x;
int i;
while(1)
{
printf("======menu======\n");
printf("1.初始化并创建\n");
printf("2.出队\n");
printf("3.入队\n");
printf("4.清空\n");
printf("5.遍历输出\n");
printf("6.求队长\n");
printf("输入1-6:");
scanf("%d",&i);
switch(i)
{
case 1:
{
create(&L);
break;
}
case 2:
{
deleteq(&L,&x);
printf("%d\n",x);
break;
}
case 3:
{
printf("输入元素:");
scanf("%d",&x);
insert(&L,x);
break;
}
case 4:
{
clear(&L);
break;
}
case 5:
{
show(&L);
break;
}
case 6:
{
printf("%d\n",get_length(&L));
break;
}
}
}
}