From be61151177a90300afcd96062b4f5f73483ef021 Mon Sep 17 00:00:00 2001
From: "dario.genga" <dario.genga@etu.hesge.ch>
Date: Tue, 25 Jan 2022 15:36:32 +0100
Subject: [PATCH] Add unfinished ex3

---
 ex3/ex3.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 90 insertions(+)

diff --git a/ex3/ex3.c b/ex3/ex3.c
index ae15683..4495373 100644
--- a/ex3/ex3.c
+++ b/ex3/ex3.c
@@ -8,6 +8,96 @@
 #include <string.h>
 #include <stdbool.h>
 
+typedef struct list_t {
+    int *value;
+    int *index;
+    struct list_t *next;
+} list;
+
+list *create() {
+    list *li = malloc(sizeof(list));
+    li->value = NULL;
+    li->index = NULL;
+    li->next = NULL;
+    return li;
+}
+
+void destroy(list *li) {
+    while (li != NULL) {
+        list *tmp = li;
+        li = li->next;
+        free(tmp);
+    }
+    free(li);
+    li = NULL;
+}
+
+list *push(list *li, int *value, int *index) {
+    list *new = create();
+    new->value = value;
+    new->index = index;
+    new->next = li;
+    return new;
+}
+
+list *create_pascal_triangle(list *li, int pascal_size, int size_to_compute, int remaining_step) {
+    if (remaining_step == 0 && size_to_compute == pascal_size) {
+        return li;
+    }
+    if (remaining_step == 0 && size_to_compute != pascal_size) {
+        create_pascal_triangle(li, pascal_size, size_to_compute + 1, size_to_compute + 1);
+        return li;
+    }
+
+    int index = *li->index + 1;
+    if (remaining_step == 1 || remaining_step == size_to_compute) {
+        int default_value = 1;
+        li = push(li, &default_value, &index);
+    } else {
+        int value = 0;
+        list *current = li;
+        int current_index = 0;
+
+        while (*current->index > *li->index - size_to_compute) {
+            if (*current->index == *li->index - (size_to_compute - 1) ||
+                *current->index == *li->index - (size_to_compute - 2)) {
+                value += *current->value;
+            }
+            current_index++;
+            current = current->next;
+        }
+        li = push(li, &value, &index);
+    }
+    return create_pascal_triangle(li, pascal_size, size_to_compute, remaining_step - 1);
+}
+
+void print_pascal(list *li, int pascal_size) {
+    list *current = li;
+    for (int i = 0; i < pascal_size; i++) {
+        if (current != NULL) {
+            printf("%d ", *current->value);
+            current = current->next;
+        }
+    }
+    printf("\n");
+}
+
 int main() {
+    int default_value = 1;
+    int default_index = 0;
+
+    list *li = create();
+    li->value = &default_value;
+    li->index = &default_index;
+
+    int pascal_size;
+    scanf("%d", &pascal_size);
+
+    if (pascal_size > 1) {
+        li = create_pascal_triangle(li, pascal_size, 2, 2);
+    }
+    print_pascal(li, pascal_size);
+
+    destroy(li);
     return EXIT_SUCCESS;
 }
-- 
GitLab