From 682fb98c41eda7d51a183ffe5305af1e2ff41d76 Mon Sep 17 00:00:00 2001
From: Orestis <orestis.malaspinas@pm.me>
Date: Mon, 16 Dec 2024 14:33:51 +0100
Subject: [PATCH] added queue

---
 slides/exemples/queue.c | 109 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 109 insertions(+)
 create mode 100644 slides/exemples/queue.c

diff --git a/slides/exemples/queue.c b/slides/exemples/queue.c
new file mode 100644
index 0000000..f6f2d54
--- /dev/null
+++ b/slides/exemples/queue.c
@@ -0,0 +1,109 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <assert.h>
+
+struct element {
+    int data;
+    struct element *next;
+};
+
+struct queue {
+    struct element *head;
+    struct element *tail;
+};
+
+void queue_init(struct queue *fa) {
+    fa->head = NULL;
+    fa->tail = NULL;
+}
+
+bool queue_is_empty(struct queue fa) {
+    return (fa.head == NULL && fa.tail == NULL);
+}
+
+int queue_tail(struct queue fa) {
+    assert(!queue_is_empty(fa) && "Careful the queue is empty.");
+    return fa.tail->data;
+}
+int queue_head(struct queue fa) {
+    assert(!queue_is_empty(fa) && "Careful the queue is empty.");
+    return fa.head->data;
+}
+
+void queue_enqueue(struct queue *fa, int val) {
+    struct element *elem = malloc(sizeof(*elem));
+    elem->data = val;
+    elem->next = NULL;
+    if (queue_is_empty(*fa)) {
+        fa->tail = elem;
+        fa->head = elem;
+    } else {
+        fa->tail->next = elem;
+        fa->tail = elem;
+    }
+}
+
+int queue_dequeue(struct queue *fa) {
+    if (queue_is_empty(*fa)) {
+        assert(false && "Empty queue, impossible to dequeue.");
+        // do something
+        return -1;
+    } else if (fa->head != fa->tail) {
+        struct element *tmp_elem = fa->head;  // 1
+        int tmp_val = fa->head->data;         // 2
+        fa->head = fa->head->next;            // 3
+        free(tmp_elem);                       // 4
+        return tmp_val;                       // 5
+    } else {
+        struct element *tmp_elem = fa->head;  // 1
+        int tmp_val = fa->head->data;         // 2
+        fa->head = NULL;                      // 3
+        fa->tail = NULL;                      // 3
+        free(tmp_elem);                       // 4
+        return tmp_val;                       // 5
+    }
+}
+
+void queue_destroy(struct queue *fa) {
+    while (!queue_is_empty(*fa)) {
+        queue_dequeue(fa);
+    }
+}
+
+int main() {
+    struct queue fa;  // mémoire est allouée
+    queue_init(&fa);
+    printf("is fa empty? %s\n", queue_is_empty(fa) ? "yes" : "no");
+
+    printf("enqueuing 10\n");
+    queue_enqueue(&fa, 10);
+    printf("enqueuing 20\n");
+    queue_enqueue(&fa, 20);
+    printf("enqueuing 30\n");
+    queue_enqueue(&fa, 30);
+    printf("is fa empty? %s\n", queue_is_empty(fa) ? "yes" : "no");
+
+    int v1 = queue_dequeue(&fa);
+    printf("v1 contains? %d\n", v1);
+    printf("head contains? %d\n", queue_head(fa));
+    printf("tail contains? %d\n", queue_tail(fa));
+    int v2 = queue_dequeue(&fa);
+    int v3 = queue_dequeue(&fa);
+    printf("v2 contains? %d\n", v2);
+    printf("v3 contains? %d\n", v3);
+    printf("is fa empty? %s\n", queue_is_empty(fa) ? "yes" : "no");
+
+    printf("enqueuing 10\n");
+    queue_enqueue(&fa, 10);
+    printf("enqueuing 20\n");
+    queue_enqueue(&fa, 20);
+    printf("enqueuing 30\n");
+    queue_enqueue(&fa, 30);
+    printf("is fa empty? %s\n", queue_is_empty(fa) ? "yes" : "no");
+    printf("destroying\n");
+    queue_destroy(&fa);
+    printf("is fa empty? %s\n", queue_is_empty(fa) ? "yes" : "no");
+
+    return EXIT_SUCCESS;
+}
-- 
GitLab