diff --git a/ex3/ex3.c b/ex3/ex3.c index ae156837bfb53b8e542fb86a0f774b9fcffc300b..4495373c8a5700b5c5ea2eb0794277598b799fcd 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; }