From 02807414706093a18f4c8d4d4a4cf9b5fa60bbfb Mon Sep 17 00:00:00 2001
From: Orestis <orestis.malaspinas@pm.me>
Date: Mon, 6 Jan 2025 14:23:35 +0100
Subject: [PATCH] implementation done

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

diff --git a/slides/exemples/sorted_list.c b/slides/exemples/sorted_list.c
new file mode 100644
index 0000000..f4c7549
--- /dev/null
+++ b/slides/exemples/sorted_list.c
@@ -0,0 +1,123 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdbool.h>
+
+struct element {
+    int data;
+    struct element *next;
+};
+
+typedef struct element *list;
+
+list list_create() {
+    return NULL;
+}
+
+bool list_is_empty(list l) {
+    return l == NULL;
+}
+
+list list_push(list l, int val) {
+    struct element *e = malloc(sizeof(*e));
+    e->next = NULL;
+    e->data = val;
+    if (list_is_empty(l)) {
+        return e;
+    } else if (val < l->data) {
+        e->next = l;
+        return e;
+    } else {
+        struct element *crt = l;
+        while (NULL != crt && val > crt->next->data) {
+            crt = crt->next;
+        }
+        e->next = crt->next;
+        crt->next = e;
+        return l;
+    }
+}
+
+list list_extract(list l, int val) {
+    struct element *crt = l;
+    struct element *prec = l;
+    if (list_is_empty(l)) {
+        return l;
+    } else if (val == crt->data) {
+        l = crt->next;
+        free(crt);
+        return l;
+    } else {
+        while (crt->next != NULL && crt->data < val) {
+            prec = crt;
+            crt = crt->next;
+        }
+        if (val == crt->data) {
+            prec->next = crt->next;
+            free(crt);
+        }
+        return l;
+    }
+}
+
+struct element *list_search(list l, int val) {
+    struct element *crt = l;
+    while (crt->next != NULL && crt->data < val) {
+        crt = crt->next;
+    }
+    if (val == crt->data) {
+        return crt;
+    }
+    return NULL;
+}
+
+void list_destroy(list *l) {
+    struct element *crt = *l;
+    while (crt != NULL) {
+        struct element *e = crt;
+        crt = crt->next;
+        free(e);
+    }
+    *l = NULL;
+}
+
+void print_safe(struct element *e) {
+    if (e != NULL) {
+        printf("%d\n", e->data);
+    }
+}
+
+int main() {
+    list l = list_create();
+    l = list_extract(l, 2);
+    l = list_push(l, 10);
+    l = list_push(l, 0);
+    l = list_push(l, 2);
+    printf("first %d\n", l->data);
+    printf("second %d\n", l->next->data);
+    printf("third %d\n", l->next->next->data);
+    struct element *e = list_search(l, 2);
+    print_safe(e);
+    /*printf("two %d\n", e->data);*/
+    e = list_search(l, 10);
+    print_safe(e);
+    /*printf("ten %d\n", e->data);*/
+    e = list_search(l, 0);
+    print_safe(e);
+    /*printf("zero %d\n", e->data);*/
+    e = list_search(l, 3);
+    print_safe(e);
+    /*printf("absent %p\n", e);*/
+    e = list_search(l, 190);
+    print_safe(e);
+    /*printf("bigger %p\n", e);*/
+    e = list_search(l, -1);
+    print_safe(e);
+    /*printf("smaller %p\n", e);*/
+    l = list_extract(l, 2);
+    l = list_extract(l, 100);
+    printf("first %d\n", l->data);
+    printf("second %d\n", l->next->data);
+    l = list_extract(l, 0);
+    printf("first %d\n", l->data);
+    list_destroy(&l);
+}
-- 
GitLab