//单链队列--队列的链式存储结构
#define QElemType int
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front,rear;
}LinkQueue;
void InitQueue(LinkQueue *Q)
{
(*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode));
if(!(*Q).front)
exit(OVERFLOW);
(*Q).front->next=NULL;
}
void DestroyQueue(LinkQueue *Q)
{
while((*Q).front)
{
(*Q).rear=(*Q).front->next;
free((*Q).front);
(*Q).front=(*Q).rear;
}
}
void ClearQueue(LinkQueue *Q)
{
QueuePtr p,q;
(*Q).rear=(*Q).front;
p=(*Q).front->next;
(*Q).front->next=NULL;
while(p)
{
q=p;
p=p->next;
free(q);
}
}
bool QueueEmpty(LinkQueue Q)
{
if(Q.front->next==NULL)
return true;
else
return false;
}
int QueueLength(LinkQueue Q)
{
int i=0;
QueuePtr p;
p=Q.front;
while(Q.rear!=p)
{
i++;
p=p->next;
}
return i;
}
bool GetHead(LinkQueue Q,QElemType *e)
{
QueuePtr p;
if(Q.front==Q.rear)
return false;
p=Q.front->next;
*e=p->data;
return true;
}
void EnQueue(LinkQueue *Q,QElemType e)
{
QueuePtr p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
exit(OVERFLOW);
p->data=e;
p->next=NULL;
(*Q).rear->next=p;
(*Q).rear=p;
}
int DeQueue(LinkQueue *Q,QElemType *e)
{
QueuePtr p;
if((*Q).front==(*Q).rear)
return 0;
p=(*Q).front->next;
*e=p->data;
(*Q).front->next=p->next;
if((*Q).rear==p)
(*Q).rear=(*Q).front;
free(p);
return 1;
}
//队列的顺序存储(循环队列)
#define MAX 5
typedef struct
{
QElemType *base;
int front;
int rear;
}SqQueue;
void InitQueue(SqQueue *Q)
{
(*Q).base=(QElemType *)malloc(MAX*sizeof(QElemType));
if(!(*Q).base)
exit(OVERFLOW);
(*Q).front=(*Q).rear=0;
}
void DestroyQueue(SqQueue *Q)
{
if((*Q).base)
free((*Q).base);
(*Q).base=NULL;
(*Q).front=(*Q).rear=0;
}
void ClearQueue(SqQueue *Q)
{
(*Q).front=(*Q).rear=0;
}
bool QueueEmpty(SqQueue Q)
{
if(Q.front==Q.rear)
return TRUE;
else
return FALSE;
}
int QueueLength(SqQueue Q)
{
return(Q.rear-Q.front+MAX)%MAX;
}
int GetHead(SqQueue Q,QElemType *e)
{
if(Q.front==Q.rear)
return 0;
*e=Q.base[Q.front];
return 1;
}
int EnQueue(SqQueue *Q,QElemType e)
{
if((*Q).rear+1)%MAX==(*Q).front
return 0;
(*Q).base[(*Q).rear]=e;
(*Q).rear=((*Q).rear+1)%MAX;
return 1;
}
int DeQueue(SqQueue *Q,QElemType *e)
{
if((*Q).front==(*Q).rear)
return 0;
*e=(*Q).base[(*Q).front];
(*Q).front=((*Q).front+1)%MAX;
return 1;
}