#ifndef LINKQUEUE_H
#define LINKQUEUE_H
#include <stdio.h>
#include <stdlib.h>
#include "Status.h"
typedef int QElemType;
typedef struct QNode {
QElemType data;
struct QNode* next;
} QNode, * QueuePtr;
typedef struct {
QueuePtr front;
QueuePtr rear;
} LinkQueue;
Status InitQueue(LinkQueue* Q);
Status DestroyQueue(LinkQueue* Q);
Status ClearQueue(LinkQueue* Q);
Status QueueEmpty(LinkQueue Q);
int QueueLength(LinkQueue Q);
Status GetHead(LinkQueue Q, QElemType* e);
Status EnQueue(LinkQueue* Q, QElemType e);
Status DeQueue(LinkQueue* Q, QElemType* e);
Status QueueTraverse(LinkQueue Q, void(Visit)(QElemType));
#endif
#ifndef LINKQUEUE_C
#define LINKQUEUE_C
#include "LinkQueue.h"
Status InitQueue(LinkQueue* Q) {
if(Q == NULL) {
return ERROR;
}
(*Q).front = (*Q).rear = (QueuePtr) malloc(sizeof(QNode));
if(!(*Q).front) {
exit(OVERFLOW);
}
(*Q).front->next = NULL;
return OK;
}
Status DestroyQueue(LinkQueue* Q) {
if(Q == NULL) {
return ERROR;
}
while((*Q).front) {
(*Q).rear = (*Q).front->next;
free((*Q).front);
(*Q).front = (*Q).rear;
}
return OK;
}
Status ClearQueue(LinkQueue* Q) {
if(Q == NULL) {
return ERROR;
}
(*Q).rear = (*Q).front->next;
while((*Q).rear) {
(*Q).front->next = (*Q).rear->next;
free((*Q).rear);
(*Q).rear = (*Q).front->next;
}
(*Q).rear = (*Q).front;
return OK;
}
Status QueueEmpty(LinkQueue Q) {
if(Q.front == Q.rear) {
return TRUE;
} else {
return FALSE;
}
}
int QueueLength(LinkQueue Q) {
int count = 0;
QueuePtr p = Q.front;
while(p != Q.rear) {
count++;
p = p->next;
}
return count;
}
Status GetHead(LinkQueue Q, QElemType* e) {
QueuePtr p;
if(Q.front == NULL || Q.front == Q.rear) {
return ERROR;
}
p = Q.front->next;
*e = p->data;
return OK;
}
Status EnQueue(LinkQueue* Q, QElemType e) {
QueuePtr p;
if(Q == NULL || (*Q).front == NULL) {
return ERROR;
}
p = (QueuePtr) malloc(sizeof(QNode));
if(!p