---------- MAIN.C #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> #include <string.h> #include <time.h> #include "queue.h" typedef struct { int a, b; } coord; void print(void *data) { coord *cc = data; printf("(%d, %d)->", cc->a, cc->b); fflush(stdout); } coord *coord_make(int x, int y) { coord *c = malloc(sizeof(coord)); c->a = x, c->b = y; return c; } void coord_free(void *data) { free(data); } int main(int argc, char *argv[]) { Queue snake; queue_init(&snake); coord *c[5]; int i; for(i = 0; i < 5; i++) c[i] = coord_make(i,rand()%10); queue_en(&snake, c[0]); queue_en(&snake, c[1]); queue_en(&snake, c[2]); queue_en(&snake, c[3]); queue_en(&snake, c[4]); queue_print(&snake, print); puts(""); queue_de(&snake); queue_en(&snake, c[3]); queue_print(&snake, print); puts(""); queue_destroy(&snake, coord_free); queue_print(&snake, print); return 0; } ---------- QUEUE.C #include "queue.h" void queue_init(Queue *q) { q->head = NULL; q->tail = NULL; q->size = 0; } void queue_destroy(Queue *q, void(*dump)(void *)) { void *data; while(!queue_isempty(q)) { data = queue_de(q); dump(data); } } bool queue_isempty(Queue *q) { return q->head == NULL; } static node make_node(void *data) { node n = malloc(sizeof(node)); n->data = data; n->next = NULL; return n; } static void free_node(node p) { free(p); } void queue_en(Queue *q, void *data) { node n = make_node(data); if(queue_isempty(q)) { q->head = n; q->tail = n; q->size ++; } else { q->tail->next = n; q->tail = n; } } void *queue_de(Queue *q ) { if(queue_isempty(q)) { return NULL; } else { void *data = q->head->data; node del = q->head; q->head = del->next; free_node(del); return data; } } void queue_print(Queue *q, void (*print)(void *)) { if(queue_isempty(q)) { printf("Queue is empty!\n"); } else { node save; for(save = q->head; save; save = save->next) print(save->data); } } ---------- QUEUE.H #ifndef _queue_h_ #define _queue_h_ #include <stdio.h> #include <stdlib.h> #include <stdbool.h> typedef struct node_t *node; struct node_t{ struct node_t *next; void *data; }; typedef struct { node head; node tail; ssize_t size; } Queue; void queue_init(Queue *q); void queue_dump(Queue *q, void(*dump)(void *)); bool queue_isempty(Queue *q); static node make_node(void *data); static void free_node(node p); void queue_en(Queue *q, void *data); void *queue_de(Queue *q); void queue_print(Queue *q, void (*print)(void *)); #endif // _queue_h_