#include<stdio.h>

#include<stdlib.h>

#define QUEUE_MAX_SIZE 100

typedef int Status;

typedef int QElemtype;

typedef struct QNode{

QElemtype data;

struct QNode *next;

}*QueuePtr;

typedef struct{

QueuePtr front;

QueuePtr rear;

}LinkQueue;


Status InitQueue(LinkQueue &Q){

Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));

if(!Q.front) return 0;

Q.front->next=NULL;

return 1;

}


Status DestoryQueue(LinkQueue &Q){

while(Q.front){

Q.rear=Q.front->next;

free(Q.front);

Q.front=Q.rear;

}

return 1;

}


Status ClearQueue(LinkQueue &Q){

while(Q.front){

Q.rear=Q.front->next;

Q.front->data=NULL;

Q.front=Q.rear;

}

return 1;

}


Status IsQueueEmpty(LinkQueue &Q){

if(Q.front==Q.rear)return 1;

return 0;

}


Status QueueLength(LinkQueue &Q){

QNode *p;

int i=0;

p=Q.front;

while(p->next){

p=p->next;

i++;

}

return i;

}


Status GetHead(LinkQueue &Q,QElemtype &e){

if(Q.front==Q.rear) return 0;

e=Q.front->next->data;

return 1;

}


Status EnQueue(LinkQueue &Q,QElemtype e){

QueuePtr p;

p=(QueuePtr)malloc(sizeof(QNode));

if(!p) return 0;

p->data=e;p->next=NULL;

Q.rear->next=p;

Q.rear=p;

return 1;

}


Status DeQueue(LinkQueue &Q,QElemtype &e){

QueuePtr p;

p=Q.front->next;

if(Q.front==Q.rear) return 0;

e=p->data;

Q.front->next=p->next;

if(Q.rear==p) Q.rear=Q.front;

free(p);

return 1;

}


Status PrintQueue(LinkQueue &Q){

QNode *p;

p=Q.front;

while(p->next){

p=p->next;

printf("%d\n",p->data);

}

return 1;

}


int main(){

LinkQueue q;

InitQueue(q);

int set,isclose;

QElemtype e;

while(1){

set=0;

printf(" 1.队尾插入元素\n 2.删除队头元素并输出\n 3.输出队列的长度\n 4.销毁队列\n 5.得到队头元素 \n 6.查询该队列是否为空 \n 7.输出整个队列中的所有元素\n 8.建立队列(在销毁后重建)\n");

scanf("%d",&set);

switch(set){

case 1:printf("请输入元素\n");scanf("%d",&e);if(EnQueue(q,e)) printf("插入成功\n");else printf("插入失败\n"); break;

case 2:if(DeQueue(q,e))printf("%d\n",e);else printf("队列里无元素\n");break;

case 3:printf("%d\n",QueueLength(q));break;

case 4:if(DestoryQueue(q)) printf("销毁成功\n");break;

case 5:if(GetHead(q,e)) printf("%d\n",e);break;

case 6:if(IsQueueEmpty(q)) printf("队列为空\n"); else printf("队列不为空\n");break;

case 7:PrintQueue(q);break;

case 8:if(InitQueue(q));printf("建立成功\n");break;

}

printf("结束输入0\n");

scanf("%d",&isclose);

if(!isclose) break;

}

return 0;

}