diff --git a/ex3/ex3.c b/ex3/ex3.c index 4495373c8a5700b5c5ea2eb0794277598b799fcd..ea4461156ccca2838936231d7867249f2d52afb2 100644 --- a/ex3/ex3.c +++ b/ex3/ex3.c @@ -6,7 +6,6 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <stdbool.h> typedef struct list_t { int *value; @@ -40,17 +39,31 @@ list *push(list *li, int *value, int *index) { return new; } +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"); +} + 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) { + // End of the recursion + print_pascal(li, 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; + // Start calculating the next row + return create_pascal_triangle(li, pascal_size, size_to_compute + 1, size_to_compute + 1); } int index = *li->index + 1; if (remaining_step == 1 || remaining_step == size_to_compute) { + // Add the default value and the start and end of each rows int default_value = 1; li = push(li, &default_value, &index); } else { @@ -58,6 +71,7 @@ list *create_pascal_triangle(list *li, int pascal_size, int size_to_compute, int list *current = li; int current_index = 0; + // Compute the value by searching the numbers at top and top left 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)) { @@ -71,18 +85,8 @@ list *create_pascal_triangle(list *li, int pascal_size, int size_to_compute, int 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() { + // Initialize the program int default_value = 1; int default_index = 0; @@ -90,14 +94,16 @@ int main() { li->value = &default_value; li->index = &default_index; + // Get the pascal size from user int pascal_size; scanf("%d", &pascal_size); + // Create the triangle if (pascal_size > 1) { li = create_pascal_triangle(li, pascal_size, 2, 2); } - print_pascal(li, pascal_size); + // Free the memory and exit the program destroy(li); return EXIT_SUCCESS; }