#include <stdio.h>
#include <stdlib.h>
int flag=0;
typedef struct Qnode
{
char data;
struct Qnode *next;
}Qnode,*QnodePtr;
typedef struct LinkQueue
{
QnodePtr front;
QnodePtr rear;
}LinkQueue;
void InitQueue(LinkQueue *Q)
{
Q->front=(QnodePtr)malloc(sizeof(Qnode));
Q->rear=Q->front;
Q->front->next=NULL;
}
void CreateQueue(LinkQueue *Q)
{
int i,len;
char ch;
QnodePtr p;
printf("请输入队列的长度:
");
scanf("%d",&len);
for(i=0;i<len;i++)
{
printf("请输入队列的元素:
");
scanf("%c",&ch);
p=(QnodePtr)malloc(sizeof(Qnode));
if((ch=getchar())!='
')
{
p->data=ch;
p->next=Q->rear->next;
Q->rear->next=p;
Q->rear=p;
}
else
i--;
}
flag=1;
}
void PushQueue(LinkQueue *Q,char e)
{
QnodePtr p=(QnodePtr)malloc(sizeof(Qnode));
p->data=e;
p->next=Q->rear->next;
Q->rear->next=p;
Q->rear=p;
}
char PopQueue(LinkQueue *Q)
{
char ch;
QnodePtr p;
ch=Q->front->next->data;
p=Q->front->next;
Q->front->next=p->next;
free(p);
return ch;
}
int LengthQueue(LinkQueue Q)
{
int len=0;
QnodePtr p=Q.front->next;
while(p)
{
len++;
p=p->next;
}
return len;
}
int EmptyQueue(LinkQueue Q)
{
if(Q.front->next==NULL)
return 1;
return 0;
}
void DisplayQueue(LinkQueue Q)
{
QnodePtr p=Q.front->next;
printf("此链队列的输出为:
");
while(p)
{
printf("%c ",p->data);
printf("
");
p=p->next;
}
}
void DestroyQueue(LinkQueue *Q)
{
QnodePtr p,q;
p=Q->front;
q=p->next;
while(q)
{
p=q;
q=p->next;
free(p);
}
Q->front->next=NULL;
Q->rear=Q->front;
flag=0;
}
void menu()
{
printf(" 链队列基本实验操作
");
printf("*********************************
");
printf("1 建立链队列! *
");
printf("2 链队列入队操作! *
");
printf("3 链队列出队操作! *
");
printf("4 求链队列长度! *
");
printf("5 判断队列是否为空! *
");
printf("6 显示队列! *
");
printf("7 销毁队列! *
");
printf("0 退出程序! *
");
printf("*********************************
");
}
int main()
{
LinkQueue Q;
int select;
char ch;
InitQueue(&Q);
while(1)
{
menu();
printf("请输入选择命令:
");
scanf("%d",&select);
switch(select)
{
case 1:
if(flag==1)
printf("链队列已经创建!
");
else
CreateQueue(&Q);
break;
case 2:
if(flag==0)
printf("链队列还未创建,无法入队操作!
");
else
{
printf("请输入要入队的元素:
");
scanf("%c",&ch);
if((ch=getchar())!='
')
PushQueue(&Q,ch);
}
break;
case 3:
if(flag==0)
printf("链队列还未创建,无法出队操作!
");
else if(EmptyQueue(Q))
printf("链队列为空,无法出队操作!
");
else
{
ch=PopQueue(&Q);
printf("链队列出队元素为:%c
",ch);
}
break;
case 4:
if(flag==0)
printf("链队列未创建!
");
else
printf("链队列的长度为:%d
",LengthQueue(Q));
break;
case 5:
if(flag==0)
printf("链队列未创建!
");
else if(EmptyQueue(Q))
printf("链队列为空!
");
else
printf("链队列不为空!
");
break;
case 6:
if(flag==0)
printf("链队列未创建!
");
else
DisplayQueue(Q);
break;
case 7:
if(flag==0)
printf("链队列未创建!
");
else
{
DestroyQueue(&Q);
printf("链队列已经被删除!
");
}
break;
case 0:
exit(1);
break;
default :
printf("输入命令有误,请重新输入!
");
break;
}
}
return 0;
}