#include<stdio.h>
#include<stdlib.h>
 
struct data {
  struct data *next;
  char key;
};
 
struct queue {
  struct data *top,*rear;
};

void enqueue(struct queue *q, char key);
char dequeue(struct queue *q);
void print_queue_list(struct queue q);

int main() {
  struct queue q;
  q.top = NULL;
  q.rear = NULL;
  
  enqueue(&q, 'a');

  print_queue_list(q);
  printf("\n");

  enqueue(&q, 'b');

  print_queue_list(q);
  printf("\n");

  dequeue(&q);

  print_queue_list(q);
  printf("\n");

  dequeue(&q);
}

void enqueue(struct queue *q, char key) {
  struct data *d;
  d = (struct data *) malloc(sizeof(struct data));
  d->key = key;
  d->next = NULL;
  if (q->top == NULL) {
    q->top = d;
    q->rear = d;
  } else {
    q->rear->next = d;
    q->rear = d;
  }
}

char dequeue(struct queue *q) {
  char key;
  struct data *d;
  d = q->top;
  key = d->key;
  if (q->top == q->rear) {
    q->top = NULL;
    q->rear = NULL;
  } else {
    q->top = d->next;
  }
  free(d);
  return key;
}
 
void print_queue_list(struct queue q) {
  while(q.top != NULL) {
    printf("%c\n", q.top->key);
    q.top = q.top->next;
  }
}