#include <stdio.h>
#include <malloc.h>
/******************************
Queue* q = newLinkedQueue();
q->inQueue(q, 3);
q->inQueue(q, 4);
q->inQueue(q, 5);
printf("%d\n",q->deQueue(q));
printf("%d\n",q->deQueue(q));
*********************************/
typedef struct QueueNodeType
{
	int data;
	struct QueueNodeType* nextNode;
}QueueNode;
typedef struct QueueType
{
	QueueNode* head;
	QueueNode* tail;
	void (*inQueue) (struct QueueType* self, int data);
	int (*deQueue) (struct QueueType* self);
	void (*clear) (struct QueueType* self);
}Queue;
void appendQueue(Queue* self, int data);
int popQueue(Queue* self);
void clearQueue(Queue* self);
Queue* newLinkedQueue()
{
	Queue* q =  (Queue*)malloc(sizeof(Queue));
	q->head = NULL;
	q->tail = NULL;

	q->inQueue = appendQueue;
	q->deQueue = popQueue;
	q->clear = clearQueue;
	return q;
}
QueueNode* newQueueNode(int data)
{
	QueueNode* node = (QueueNode*) malloc(sizeof(QueueNode));
	node->nextNode = NULL;
	node->data = data;

	return node;
}
void appendQueue(Queue* self, int data)
{
	if( self->head == NULL )
	{
		self->head = newQueueNode(data);
		self->tail = self->head;
	}
	else
	{
		self->tail->nextNode = newQueueNode(data);
		self->tail = self->tail->nextNode;
	}
}
int popQueue(Queue* self)
{
	int retn = self->head->data;
	void* temp = self->head;

	self->head = self->head->nextNode;

	free(temp);
	return retn;
}
void clearQueue(Queue* self)
{
	while(self->head != NULL)
	{
		self->deQueue(self);
	}
}
void deleteLinkedQueue(Queue* q)
{
	q->clear(q);
	free(q);
}
int main(void)
{
	Queue* q = newLinkedQueue();
	q->inQueue(q, 3);
	q->inQueue(q, 4);
	q->inQueue(q, 5);
	printf("%d\n",q->deQueue(q));
	printf("%d\n",q->deQueue(q));
}