#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
	char Character;
	struct node *Next;
}node;

typedef struct
{
	node *Head;
	node *Tail; 
}queue;

node *alloc_node(char c, node *Next)
{
  	node *NewNode = malloc(sizeof(node));
  	NewNode->Character = c;
  	NewNode->Next = Next;
      
	return NewNode;
}

// You could reuse the implementation of the singly linked list,
// but in this case we can optimize our operations,
// because we have pointers to the beginning end of the linked list.

// NOTE: this put elements on the end of the list
// Don't forget to initialize the Head pointer
void enqueue(queue *Queue, char c)
{
	// TODO: implement this
}

// NOTE: This returns the char, because we don't want to manage
// the memory in "user code"
// Don't forget to free the node, otherwise this queue has a leak.
char dequeue(queue *Queue)
{
	// TODO: implement this
	return 0;
}

// NOTE: in this example we only use this to check if the list is empty.
// To do that we could also track the element count, but the peak operation
// has also some other use cases.
node *peak(queue *Queue)
{
	// TODO: implement this
	return 0;
}

// you can implement the queue-operations without ever searching through the list.
int main(int argc, char **argv)
{
	queue Queue = {};
	char *String = "HelloWorld!";

	// The String should come out as it went in.
	while(*String)
	{
		enqueue(&Queue, *String++);
	}
	while(peak(&Queue))
	{
		printf("%c", dequeue(&Queue));
	}
	
}
