codintuni/queue.c
Johannes Randerath 8081cf3951
Queue
2024-05-15 14:49:46 +02:00

82 lines
1.4 KiB
C

#include <stdlib.h>
#include <ctype.h>
#include <stdbool.h>
#include <stdio.h>
typedef struct node {
void *content;
struct node *next;
}Node;
typedef struct queue {
Node *first;
Node *last;
size_t w;
}Queue;
Queue *new_queue(size_t w) {
Queue *q = malloc(sizeof(Queue));
q->first = NULL;
q->last = NULL;
q->w = w;
return q;
}
bool is_empty(Queue *q) {
return !q->first;
}
void enqueue(void *content, Queue *q) {
Node *n = malloc(sizeof(Node));
n->content = content;
n->next = NULL;
if (is_empty(q))
q->first = n;
else
q->last->next = n;
q->last = n;
}
void *dequeue(Queue *q) {
if (is_empty(q))
return NULL;
void *r = q->first->content;
Node *n = q->first;
q->first = q->first->next;
free(n);
if (is_empty(q))
q->last = NULL;
return r;
}
void destroy(Queue *q) {
while (!is_empty(q)) {
free(dequeue(q));
}
free(q);
}
int main() {
Queue *q = new_queue(sizeof(int));
int *a = malloc(sizeof(int));
int *b = malloc(sizeof(int));
int *c = malloc(sizeof(int));
int *d = malloc(sizeof(int));
*a=1;
*b=2;
*c=3;
*d=-1;
enqueue(a, q);
printf("%d\n", *((int*)dequeue(q)));
enqueue(b, q);
enqueue(c, q);
enqueue(d, q);
while(!is_empty(q)) {
printf("%d\n", *((int*)dequeue(q)));
}
destroy(q);
return 0;
}