/**********************链队列********************/
#include"stdio.h"
#include"stdlib.h"
#define ERROR 0
#define OK 1
#define FALSE 0
#define TRUE 1
typedef int ElemType;
typedef int Status;
typedef struct QNode
{
ElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front,rear;
}LinkQueue;
/*********************Operator***************/
void InitQueue(LinkQueue *Q) //初始化队列
{
Q->front=Q->rear=NULL;
}
void ClearQueue(LinkQueue *Q) //清空队列
{
QueuePtr p;
while(Q->front!=Q->rear)
{
p=Q->front->next;
Q->front->next=p->next;
if(p==Q->rear) //当删除的是最后一个元素时,令头尾指针指向相同
Q->rear=Q->front;
free(p);
}
if(Q->front)
free(Q->front);
}
void DestroyQueue(LinkQueue *Q) //销毁队列
{
ClearQueue(Q);
free(Q);
}
Status EmptyQueue(LinkQueue Q) //判断队列是否为空
{
if(Q.front==NULL&&Q.rear==NULL)
return TRUE;
return FALSE;
}
int QueueLength(LinkQueue Q) //返回队列的长度
{
int count=0;
QueuePtr p;
while(Q.front!=Q.rear)
{
p=Q.front;
Q.front=p->next;
count++;
}
return count;
}
Status EnQueue(LinkQueue *Q, ElemType e) //入队操作
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
exit(ERROR);
p->data=e;
p->next=NULL;
if(EmptyQueue(*Q)) //让front与rear同时指向第一个结点
Q->front=Q->rear=p;
else
{
Q->rear->next=p;
Q->rear=p;
}
return OK;
}
Status DeQueue(LinkQueue *Q,ElemType *e) //出队操作,将队头元素返回给e
{
QueuePtr p;
if(EmptyQueue(*Q))
return ERROR;
p=Q->front->next;
*e=p->data;
Q->front->next=p->next;
if(p==Q->rear) //当删除的是最后一个元素时,令头尾指针指向相同
Q->rear=Q->front;
free(p);
return OK;
}
void PrintQueue(LinkQueue Q) //打印队列
{
QueuePtr p;
p=Q.front;
do
{
printf("%6d",p->data);
p=p->next;
}while(p!=Q.rear->next);
printf("\n");
}
main(void)
{
LinkQueue *Q;
ElemType *e;
Q=(LinkQueue*)malloc(sizeof(LinkQueue));
e=(ElemType*)malloc(sizeof(ElemType));
InitQueue(Q);
EnQueue(Q,12);
EnQueue(Q,13);
EnQueue(Q,14);
EnQueue(Q,15);
EnQueue(Q,16);
EnQueue(Q,17);
printf("hello\n");
PrintQueue(*Q);
DeQueue(Q,e);
PrintQueue(*Q);
printf("%6d\n",*e);
ClearQueue(Q);
printf("asid\n");
PrintQueue(*Q); //运行时此处为空链表 输出为随机地址
printf("asid\n");
}