Skip to content
Snippets Groups Projects
Commit 4b810f05 authored by dario.genga's avatar dario.genga
Browse files

Add finished ex3

parent 7e6af7a0
Branches
No related tags found
No related merge requests found
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <stdbool.h>
typedef struct list_t { typedef struct list_t {
int *value; int *value;
...@@ -40,17 +39,31 @@ list *push(list *li, int *value, int *index) { ...@@ -40,17 +39,31 @@ list *push(list *li, int *value, int *index) {
return new; 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) { 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) { if (remaining_step == 0 && size_to_compute == pascal_size) {
// End of the recursion
print_pascal(li, pascal_size);
return li; return li;
} }
if (remaining_step == 0 && size_to_compute != pascal_size) { if (remaining_step == 0 && size_to_compute != pascal_size) {
create_pascal_triangle(li, pascal_size, size_to_compute + 1, size_to_compute + 1); // Start calculating the next row
return li; return create_pascal_triangle(li, pascal_size, size_to_compute + 1, size_to_compute + 1);
} }
int index = *li->index + 1; int index = *li->index + 1;
if (remaining_step == 1 || remaining_step == size_to_compute) { 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; int default_value = 1;
li = push(li, &default_value, &index); li = push(li, &default_value, &index);
} else { } else {
...@@ -58,6 +71,7 @@ list *create_pascal_triangle(list *li, int pascal_size, int size_to_compute, int ...@@ -58,6 +71,7 @@ list *create_pascal_triangle(list *li, int pascal_size, int size_to_compute, int
list *current = li; list *current = li;
int current_index = 0; int current_index = 0;
// Compute the value by searching the numbers at top and top left
while (*current->index > *li->index - size_to_compute) { while (*current->index > *li->index - size_to_compute) {
if (*current->index == *li->index - (size_to_compute - 1) || if (*current->index == *li->index - (size_to_compute - 1) ||
*current->index == *li->index - (size_to_compute - 2)) { *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 ...@@ -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); 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 main() {
// Initialize the program
int default_value = 1; int default_value = 1;
int default_index = 0; int default_index = 0;
...@@ -90,14 +94,16 @@ int main() { ...@@ -90,14 +94,16 @@ int main() {
li->value = &default_value; li->value = &default_value;
li->index = &default_index; li->index = &default_index;
// Get the pascal size from user
int pascal_size; int pascal_size;
scanf("%d", &pascal_size); scanf("%d", &pascal_size);
// Create the triangle
if (pascal_size > 1) { if (pascal_size > 1) {
li = create_pascal_triangle(li, pascal_size, 2, 2); li = create_pascal_triangle(li, pascal_size, 2, 2);
} }
print_pascal(li, pascal_size);
// Free the memory and exit the program
destroy(li); destroy(li);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment