struct elem {
 char *data; /* 可変長のデータへのポインタ */
 struct elem *next;
};

typedef struct {
 struct elem *head;
 struct elem *tail;
} queue;

int queue_init(queue *q)
{
 struct elem *dummy_head = malloc(sizeof(struct elem));
 if (dummy_head == NULL) {
  return -1;
 }
 dummy_head->next = NULL;
 q->head = q->tail = dummy_head;

 return 0;
}

int is_empty(queue *q)
{
 return q->head == q->tail;
}

int enq(queue *q, char *item)
{
 struct elem *new_elem = malloc(sizeof(struct elem));
 if (new_elem == NULL) {
  return -1;
 }
 new_elem->data = item;
 new_elem->next = NULL;
 
 q->tail->next = new_elem;
 q->tail = new_elem;

 return 0;
}

char *deq(queue *q)
{
 struct elem *first;
 char *value;

 if (is_empty(q)) {
  return NULL;
 }
 first = q->head->next;
 value = first->data;
 q->head->next = first->next;
 free(first);

 return value;
}