/*武汉大学,物理科学与技术学院,材料物理,盛华平*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef char ElemType;
typedef struct queueNode/*链式队列结点的类型定义*/
{
ElemType data; /*数据域*/
struct queueNode *next; /*指针域*/
}QueueNode;
typedef struct //链式队列的类型定义
{
QueueNode *front; //队头指针
QueueNode *rear; //队尾指针
}LinkQueue;
//链式队列的初始化
void QueueInitial(LinkQueue *pQ)
{//指针pQ所指向的链式队列初始化为有表头结点链表
pQ->front=(QueueNode *)malloc(sizeof(QueueNode));
if(pQ->front==NULL)
{
printf("内存分配失败!/n");
exit(1);
}
pQ->rear=pQ->front;
pQ->front->next=NULL; //头结点指针域置空
}
//链式队列判空
int IsEmpty(LinkQueue *pQ)
{//链队为空时返回1,否则返回0
return pQ->front==pQ->rear;
}
//元素进队
void EnQueue(LinkQueue *pQ,ElemType e)
{//将元素e插入到队尾
QueueNode *p;
p=(QueueNode *)malloc(sizeof(QueueNode));
if(p==NULL) //内存分配失败
{
printf("内存分配失败!/n");
exit(1);
}
p->data=e;
p->next=NULL; //设置为尾结点
pQ->rear->next=p; //尾部插入
pQ->rear=p; //尾指针后移
}
//元素出队
ElemType DeQueue(LinkQueue *pQ)
{//若队列元素不为空,则删除队头元素,并返回它的值
QueueNode *first;
ElemType temp;
if(IsEmpty(pQ)) //队列为空,退出
{
printf("空对!/n");
exit(1);
}
first=pQ->front->next; //first指向队列头结点
temp=first->data; //暂存队头元素值
pQ->front->next=first->next; // 摘下队头结点
if(pQ->rear==first) //只有一个结点时,修改尾指针
pQ->rear=pQ->front;
free(first);
return temp;
}
//取队头元素值
ElemType GetFront(LinkQueue *pQ)
{//若队列不为空,则返回队头元素的值
QueueNode *first;
if(IsEmpty(pQ))
{
printf("空对!/n");
exit(1);
}
first=pQ->front->next;//first指向队头元素
return first->data;//返回队头元素值
}
//队列置空
void MakeEmpty(LinkQueue *pQ)
{//清楚队列中所有元素,仅保留头结点
QueueNode *p,*q;//p为当前结点指针
p=pQ->front->next;//p指向第一个元素结点
while(p!=NULL) //当没有到达队尾时
{
q=p;
p=p->next; //当前节点指针后移
free(q);
}
pQ->front->next=NULL; //头结点指针域置空
pQ->rear=pQ->front; //队头与队尾指针指向头结点
}
//销毁队列
void Destroy(LinkQueue *pQ)
{//销毁链队所有结点的存储空间
QueueNode *p,*q;//p为当前结点指针
p=pQ->front;//p指向表头结点
while(p!=NULL)
{
q=p;
p=p->next;//当前结点指针后移
free(q);
}
pQ->rear=pQ->front=NULL;//对头与队尾指针置空
}
void main()
{
int m,n,i,j;char e,f;
printf("链式队列的实现/n/n");
LinkQueue Q;
LinkQueue *pQ=&Q;
pQ->front=pQ->rear=NULL;
for(;;)
{
printf("/n/n");
printf("请选择您要执行的操作1~9:/n");
printf("1:初始化队列/n");
printf("2:判空/n");
printf("3:元素进队/n");
printf("4:出队一个元素/n");
printf("5:输出出队序列/n");
printf("6:取队头元素/n");
printf("7:队列置空/n");
printf("8:销毁队列/n");
printf("9:退出/n");
scanf("%d",&m);
while(m<1||m>9)
{
printf("输入有误,请输入1~9之间的数字!/n");
scanf("%d",&m);
}
switch(m)
{
case 1: QueueInitial(pQ);
printf("初始化成功! ");break;
case 2: if(pQ->front==NULL)
{ printf("请先初始化队列!/n"); break; }
if(IsEmpty(pQ))
printf("队列为空!");
else
printf("队列非空!");
break;
case 3: if(pQ->front==NULL)
{ printf("请先初始化队列!/n");break; }
printf("请输入要进队的元素个数:");
scanf("%d",&i);
for(j=0;j<i;j++)
{
printf("请输入第%d个元素:/n",j+1);
//f=getchar();
e=getchar();
while(e>'z'||e<'a')
e=getchar();
//scanf("%c",&e);
EnQueue(pQ,e);
}
break;
case 4: if(pQ->front==NULL)
{ printf("请先初始化队列!/n"); break; }
printf("出队元素为:%c",DeQueue(pQ));
break;
case 5: if(pQ->front==NULL)
{ printf("请先初始化队列!/n");
break; }
printf("出队序列为:/n");
while(pQ->rear!=pQ->front)
printf("%c/t",DeQueue(pQ));
break;
case 6: if(pQ->front==NULL)
{ printf("请先初始化队列!/n");
break; }
printf("队头元素为:%c",GetFront(pQ));
break;
case 7: if(pQ->front==NULL)
{ printf("请先初始化队列!/n");break; }
MakeEmpty(pQ);
break;
case 8: if(pQ->front==NULL)
{ printf("请先初始化队列!/n"); break; }
Destroy(pQ);
break;
case 9: return;
}
}
}