#include <stdio.h>
#include <stdlib.h>
/**
*zi
*/
typedef int QElemType;
typedef struct Qnode{
QElemType data;
struct Qnode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
}LinkQueue;
void InitQueue(LinkQueue *Q);
void EnQueue(LinkQueue *Q,QElemType e);
QElemType DeQueue(LinkQueue *Q);
int QueueEmpty(LinkQueue *Q);
void DestroyQueue(LinkQueue *Q);
void ViewQueue(LinkQueue *Q);
void Menu();
int main()
{
LinkQueue Q;
InitQueue(&Q);
Menu();
QElemType a;
int b;
scanf("%d",&b);
char ch;
int number;
int boo;
int i;
while(b){
switch (b){
case 1:
printf("请输入你想要插入的数:\n");
scanf("%d",&a);
EnQueue(&Q,a);
ch=getchar();
while(ch!='\n'&&ch!=EOF){
scanf("%d",&a);
EnQueue(&Q,a);
ch=getchar();
}
Menu();
scanf("%d",&b);
break;
case 2:
printf("请输入你想要删除数据的个数:\n");
scanf("%d",&number);
for(i=0;i<number;i++){
if(i<number-1){
printf("%d ",DeQueue(&Q));
}
else{
printf("%d",DeQueue(&Q));
printf("\n");
}
}
Menu();
scanf("%d",&b);
break;
case 3:
boo=QueueEmpty(&Q);
if(boo){
printf("NOTEMPTY\n");
}
else{
printf("EMPTY\n");
}
Menu();
scanf("%d",&b);
break;
case 4:
ViewQueue(&Q);
Menu();
scanf("%d",&b);
break;
case 5:
DestroyQueue(&Q);
Menu();
scanf("%d",&b);
break;
}
}
printf("OVER");
return 0;
}
void Menu(){
printf("--------请展示你的操作--------\n");
printf("输入1插入数据\n");
printf("输入2删除数据\n");
printf("输入3查看该链表是否为空\n");
printf("输入4查看该链表\n");
printf("输入5销毁链表\n");
printf("输入0结束该操作\n");
}
void InitQueue(LinkQueue *Q){
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q->front){
printf("OVERFLOW");
exit(0);
}
Q->front->next=NULL;
}
void EnQueue(LinkQueue *Q,QElemType e){
QNode *p=(QueuePtr)malloc(sizeof(QNode));
if(!p){
printf("OVERFLOW");
exit(0);
}
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
}
QElemType DeQueue(LinkQueue *Q){
if(Q->front==Q->rear){
printf("ERROR");
exit(0);
}
QElemType e;
QNode *p=Q->front->next;
e=p->data;
Q->front->next=p->next;
if(Q->rear==p){
Q->rear=Q->front;
}
free(p);
return e;
}
int QueueEmpty(LinkQueue *Q){
if(Q->front==Q->rear){
return 0;
}
else{
return 1;
}
}
void ViewQueue(LinkQueue *Q){
if(Q->front==Q->rear){
printf("EMPTY\n");
//exit(0);
}
QNode* p=Q->front->next;
while(p){
if(p!=Q->rear){
printf("%d ",p->data);
}
else{
printf("%d",p->data);
printf("\n");
}
p=p->next;
}
}
void DestroyQueue(LinkQueue *Q){
while(Q->front){
Q->rear=Q->front->next;
free(Q->front);
Q->front=Q->rear;
}
printf("SUCCESS\n");
}