#include <stdio.h>

typedef struct node {
	struct node *next;
	struct node *prev;
	int value;
} Node;

typedef struct queue {
	Node *head;
	Node *tail;
} Queue;

Node *enqueue(int _val, Queue *_queue) {
	// create the node to add to the queue
	Node *newNode = (Node *)malloc(sizeof(Node));
	newNode->value = _val;
	
	// Add it to the end of the list
	newNode->next = _queue->tail;
	if(_queue->tail != NULL) _queue->tail->prev = newNode;
	_queue->tail = newNode;
	
	// if queue was empty, this new node is the Head too
	if(_queue->head == NULL)
		_queue->head = newNode;
	
	// return reference to the created node
	return newNode;
}

int dequeue(Queue *_queue) {
	Node *oldHead = _queue->head;
	_queue->head = _queue->head->prev;
	int toReturn = oldHead->value;
	free(oldHead);
	return toReturn;
}

int isEmpty(Queue *_queue) {
	if(_queue->head == NULL)
		return 1;
	return 0;
}

int peek(Queue *_queue) {
	return _queue->head->value;
}

int main() {
	// Create a queue to mess around with
	Queue *myQueue = (Queue *)malloc(sizeof(Queue));
	
	// Add some values to the queue
	enqueue(5, myQueue);
	enqueue(4, myQueue);
	enqueue(3, myQueue);
	enqueue(2, myQueue);
	enqueue(1, myQueue);
	enqueue(0, myQueue);
	
	// Look at the front element
	printf("Peek: %d\n", peek(myQueue));
	
	// Display all of them and remove them from the queue
	while(!isEmpty(myQueue))
		printf("Dequeue: %d\n", dequeue(myQueue));
	
	return 0;
}