//队列的一些基本操作
/*
1,构造一个空队列InitQueue(LinkQueue &Q)
2,销毁队列Q
3,将Q清为空队列
4,若队列Q为空队列,则返回TRUE,否则返回FALSE
5,返回Q元素的个数,即队列的长度
6,返回队列的队头元素
7,插入e为队列的新的队尾元素
8,删除队列的队头元素
9,依次输出队列中的每一个元素
*/
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status; //函数结果状态类型
typedef int QElemType; //数据元素类型
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;
//构造一个空队列Q
Status InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
if(!Q.front)
exit(OVERFLOW);
Q.front->next = NULL;
return OK;
}
//插入元素e为Q的新的队尾元素
Status EnQueue(LinkQueue &Q,QElemType e)
{
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));
if(!p)
exit(OVERFLOW);
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return OK;
}
//定义QueueLength(LinkQueue Q)函数,返回队列中元素的个数
Status QueueLength(LinkQueue Q)
{
int i = 0;
while(Q.front->next)
{
Q.front = Q.front->next;
i++;
}
return i;
}
//定义QueueEmpty(LinkQueue Q)函数,若队列为空,则返回TRUE,否则返回FLASE
Status QueueEmpty(LinkQueue Q)
{
if(Q.front == Q.rear)
{
printf("队列为空...
");
return TRUE;
}
else
{
printf("队列不为空...
");
return FALSE;
}
}
//若队列不为空,则用e返回Q的队头元素
Status GetHead(LinkQueue &Q,QElemType &e)
{
QueuePtr p;
if(Q.front == Q.rear)
return ERROR;
p = Q.front->next;
e = p->data;
return e;
}
//依次输出队列中的每一个元素
Status Foreach(LinkQueue &Q)
{
QueuePtr p;
if(!Q.front)
exit(OVERFLOW);
p = Q.front->next;
while(p)
{
printf("%3d",p->data);
p = p->next;
}
return OK;
}
//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;
//否则返回ERROR
Status DeQueue(LinkQueue &Q,QElemType &e)
{
QueuePtr p;
if(!Q.front)
exit(OVERFLOW);
p = Q.front->next;
e = p->data;
//printf("e=%d",e);
Q.front->next = p->next;
if(Q.rear == p)
Q.rear = Q.front;
free(p);
return e;
}
//清空一个队列
Status ClearQueue(LinkQueue &Q)
{
Q.front = Q.rear;
return OK;
}
//销毁一个队列Q
Status DestroyQueue(LinkQueue &Q)
{
while(Q.front)
{
Q.rear = Q.front->next;
free(Q.front);
Q.front = Q.rear;
}
return OK;
}
//主函数
int main()
{
LinkQueue q;
int n,i,e;
//调用InitQueue(LinkQueue &Q)函数,构造一个空队列
InitQueue(q);
printf("队列已创建好...");
printf("
");
//调用EnQueue(LinkQueue &Q,QElemType e)函数,插入新的队尾元素
printf("请输入入队列元素的个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("Please input a integer number:");
scanf("%d",&e);
EnQueue(q,e);
}
printf("
");
//调用QueueLength(LinkQueue Q)函数,输出队列中元素的个数
printf("队列中的元素个数(即队列的长度)是;%d",QueueLength(q));
printf("
");
//调用GetHead(LindQueue &Q,QElemType &e)函数,输出队头元素
printf("队头元素是:%d",GetHead(q,e));
printf("
");
//调用Foreach(LinkQueue &Q)函数,依次输出队列中的每一个元素
printf("遍历队列元素:");
Foreach(q);
printf("
");
//调用DeQueue(LinkQueue &Q,QElemType &e)函数,删除队头的元素,并打印出来
printf("被删除的队头元素是:%d",DeQueue(q,e));
printf("
");
//调用ClearQueue(LinkQueue &Q)函数,清空队列
ClearQueue(q);
printf("队列已被清空...");
printf("
");
//再次遍历队列
printf("再次遍历队列的结果是...");
Foreach(q);
printf("
");
//调用DestroyQueue(LinkQueue &Q)函数,销毁一个队列Q
printf("队列已被销毁...");
DestroyQueue(q);
printf("
");
return 0;
}