#ifndef _LIST_QUEUE_H_
#define _LIST_QUEUE_H_
typedef int QElemType;
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
int initQueue(LinkQueue *queue);
int destoryQueue(LinkQueue *queue);
int clearQueue(LinkQueue *queue);
int queueEmpty(LinkQueue *queue);
int queueLength(LinkQueue *queue);
int getHead(LinkQueue *queue,QElemType *e);
int enQueue(LinkQueue *queue,QElemType e);
int deQueue(LinkQueue *queue,QElemType *e);
int queueTraverse(LinkQueue *queue, void (*func)(QElemType e));
#endif
#include <stdio.h>
#include <stdlib.h>
#include "list_queue.h"
int initQueue(LinkQueue *queue){
queue->front = queue->rear = (QueuePtr)malloc(sizeof(QNode));
if(queue->front == NULL)
return -1;
queue->front->data = 0;
queue->front->next = NULL;
return 0;
}
int destoryQueue(LinkQueue *queue){
while(queue->front){
queue->rear = queue->front->next;
free(queue->front);
queue->front = queue->rear;
}
return 0;
}
int clearQueue(LinkQueue *queue){
QueuePtr tmp = NULL;
queue->rear = queue->front->next;
while(queue->rear){
tmp = queue->rear->next;
free(queue->rear);
queue->rear = tmp;
}
queue->rear = queue->front;
queue->front->data = 0;
return 0;
}
int queueEmpty(LinkQueue *queue){
return queue->front == queue->rear;
}
int queueLength(LinkQueue *queue){
return queue->front->data;
}
int getHead(LinkQueue *queue,QElemType *e){
*e = queue->front->next->data;
return 0;
}
int enQueue(LinkQueue *queue,QElemType e){
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if(!p){
return -1;
}
p->data = e;
p->next = NULL;
queue->rear->next = p;
queue->rear = p;
return 0;
}
int deQueue(LinkQueue *queue,QElemType *e){
if(queue->front == queue->rear)
return -1;
QueuePtr p = queue->front->next;
*e = p->data;
queue->front->next = p->next;
queue->front->data = queue->front->data - 1;
if(queue->rear == p)
queue->rear = queue->front;
free(p);
return 0;
}
int queueTraverse(LinkQueue *queue, void (*func)(QElemType e)){
QueuePtr p = queue->front->next;
while(p != NULL){
func(p->data);
p = p->next;
}
}