diff --git a/RecapThoseAnimals/Fundamentals/double_linked_list/dlist.c b/RecapThoseAnimals/Fundamentals/double_linked_list/dlist.c index 0e0754f..2c95bce 100644 --- a/RecapThoseAnimals/Fundamentals/double_linked_list/dlist.c +++ b/RecapThoseAnimals/Fundamentals/double_linked_list/dlist.c @@ -1,63 +1,324 @@ #include "dlist.h" +#include #include #include +#include struct dlist *dlist_init(void) { - // TODO - return NULL; + struct dlist *dlist = malloc(sizeof(struct dlist)); + if(!dlist) return NULL; + dlist->size = 0; + dlist->head = NULL; + dlist->tail = NULL; + return dlist; } void dlist_clear(struct dlist *list) { + if(!list) return; + struct node *tmp = list->head; + struct node *next; + + while(tmp != NULL){ + next = tmp->next; + free(tmp); + tmp = next; + } + free(list); } size_t dlist_length(struct dlist *l) { - // TODO - return 0; + if(!l) return 0; + + size_t count = 0; + struct node *tmp = l->head; + while(tmp != NULL){ + count ++; + tmp = tmp->next; + } + return count; } void dlist_push_front(struct dlist *l, int data) { - // TODO + if(!l) return; + + struct node *node = malloc(sizeof(struct node)); + if(!node) return; + + node->data = data; + node->prev = NULL; + + if(l->head == NULL){ + node->next = NULL; + //l->head = node; + l->tail = node; + } + else{ + node->next = l->head; + l->head->prev = node; + //l->head = node; + } + + l->head = node; + l->size ++; } void dlist_push_back(struct dlist *l, int data) { - // TODO + if(!l)return; + struct node *node = malloc(sizeof(struct node)); + if(!node) return; + + node->data = data; + node->next = NULL; + + if(l->head == NULL){ + node->prev = NULL; + l->head = node; + + } + else{ + node->prev = l->tail; + l->tail->next = node; + } + + l->tail = node; + l->size ++; + + } void dlist_remove(struct dlist *list, int data) { - // TODO + if(!list || !list->head)return; + + struct node *tmp = list->head; + //struct node *next; + + while(tmp != NULL && tmp->data != data){ + tmp = tmp->next; + } + + if(tmp == NULL) return; + + if(tmp->prev != NULL) tmp->prev->next = tmp->next; + else list->head = tmp->next; + + if(tmp->next != NULL)tmp->next->prev = tmp->prev; + else list->tail = tmp->prev; + + + //if(tmp->next == NULL && tmp->data != data) return; + + //if(tmp->data == data && tmp->next == NULL){ + // tmp->prev->next = NULL; + // free(tmp); + //return; + //} + //tmp->next->prev = tmp->prev; + //tmp->prev->next = tmp->next; + list->size --; + free(tmp); + } struct dlist *dlist_from_str(char *str) { - // TODO - return NULL; + if(!str) return dlist_init(); + + struct dlist *dlist = dlist_init(); + + + size_t len = strlen(str); + size_t index = 0; + for(size_t i = 0; i < len; i ++){ + + if(str[i] == '+' || str[i] == '-'){ + char s = str[i]; + i ++; + + if(i >= len) break; + + int value = atoi(&str[i]); + + if(s == '+') dlist_push_back(dlist, value); + else dlist_remove(dlist, value); + index = i; + + while(i < len && str[index] >= '0' && str[index] <= '9'){ + if(i + 1 < len && str[index + 1] >= '0' && str[index + 1] <= '9') index ++; + else break; + } + } + } + + return dlist; } struct node *dlist_find(struct dlist *list, int data) { - // TODO + if(!list) return NULL; + + struct node *tmp = list->head; + + while(tmp->next != NULL && tmp->data != data){ + tmp = tmp->next; + } + + if(tmp->data == data) return tmp; + return NULL; } - +/* void dlist_print(struct dlist *l) { - // TODO + } +*/ void dlist_concat(struct dlist *l1, struct dlist *l2) { - // TODO + if(!l1) return ; + if(!l2) return ; + if (!l1 && !l2) return ; + + struct node *tmp = l2->head; + for (size_t i = 0; i < l2->size; i ++){ + dlist_push_back(l1, tmp->data); + tmp = tmp->next; + } + + dlist_clear(l2); } void dlist_insert(struct dlist *l, int data, int i) { - // TODO + if(!l) return ; + size_t o = i; + if(o > l->size) return; + + if(i == 0) dlist_push_front(l, data); + else if (o == l->size) dlist_push_back(l, data); + else{ + + struct node *tmp = l->head; + + for(size_t z = 0; z < o; z ++){ + tmp = tmp->next; + } + struct node *node = malloc(sizeof(struct node)); + if(!node)return; + node->data = data; + + node->next = tmp; + node->prev = tmp->prev; + if(tmp->prev) tmp->prev->next = node; + tmp->prev = node; + + + l->size ++; + } } +/* +int main(){ +struct dlist *l = dlist_init(); +printf("length = %zu\n", l->size); // 0 +printf("head = %p\n", (void *)l->head); // (nil) or NULL +printf("tail = %p\n", (void *)l->tail); // (nil) or NULL +dlist_clear(l); +// l is now invalid + + + struct dlist *l = dlist_init(); +size_t len = dlist_length(l); +printf("Length: %zu\n", len); // 0 +dlist_clear(l); + + + struct dlist *l = dlist_init(); // l: NULL +dlist_push_front(l, 10); // l: 10 -> NULL +printf("%i\n",l->head->data); +dlist_push_front(l, 20); // l: 20 -> 10 -> NULL +dlist_clear(l); + + + struct dlist *l = dlist_init(); +dlist_push_back(l, 10); // l: 10 -> NULL +printf("%i\n", l->tail->data); +dlist_push_back(l, 20); // l: 10 -> 20 -> NULL +printf("%i\n", l->tail->data); +dlist_clear(l); + + struct dlist *l = dlist_init(); +dlist_push_back(l, 1); +dlist_push_back(l, 2); +dlist_push_back(l, 3); +dlist_push_back(l, 2); + // l: 1 -> 2 -> 3 -> 2 -> NULL +dlist_remove(l, 2); // l: 1 -> 3 -> 2 -> NULL +dlist_remove(l, 2); // l: 1 -> 3 -> NULL +dlist_remove(l, 2); // l: 1 -> 3 -> NULL +printf("%i -> %i\n", l->head->data, l->tail->data); +dlist_clear(l); + + + dlist_from_str("+2+10+42+2+223-2"); // NULL<->10<->42<->2<->223<->NULL +dlist_from_str("-2+10+42+2+223-2"); // NULL<->10<->42<->223<->NULL +dlist_from_str(""); // Return an empty list (size = 0, head = NULL, tail = NULL) +dlist_from_str("-2-10-42-2-223"); // Return an empty list too + + + struct dlist *l = dlist_init(); +dlist_push_back(l, 1); +dlist_push_back(l, 2); +dlist_push_back(l, 3); +dlist_push_back(l, 2); + // l: 1 -> 2 -> 3 -> 2 -> NULL +struct node *n; +n = dlist_find(l, 1); // n->data == 1 +printf("%i\n", n->data); +n = dlist_find(l, 3); // n->data == 3 +n = dlist_find(l, 223); // n == NULL +dlist_clear(l); + + + struct dlist *l1 = dlist_init(); +for (int i = 0 ; i < 5 ; i++) + dlist_push_back(l1, i); +struct dlist *l2 = dlist_init(); +for (int i = 0 ; i < 5 ; i++) + dlist_push_front(l2, i); + // l1: 0 <-> 1 <-> 2 <-> 3 <-> 4 <-> NULL + // l2: 4 <-> 3 <-> 2 <-> 1 <-> 0 <-> NULL +dlist_concat(l1, l2); // l1: 0 <-> 1 <-> 2 <-> 3 <-> 4 <-> 4 <-> 3 <-> 2 <-> 1 <-> 0 <-> NULL + // l1->size = 10 +struct node *tmp = l1->head; +for(size_t i = 0; i < l1->size; i ++){ + printf("%i - ", tmp->data); + tmp = tmp->next; +} +free(tmp); +dlist_clear(l1); // If you freed correctly, no memory leaks should be displayed on your terminal + +struct dlist *l = dlist_init(); +for (int i = 0 ; i < 5 ; i++) + dlist_push_back(l, i); + // l: 0 <-> 1 <-> 2 <-> 3 <-> 4 <-> NULL +dlist_insert(l, -4, 0); // l: -4 <-> 0 <-> 1 <-> 2 <-> 3 <-> 4 <-> NULL +dlist_insert(l, 5, 6); // l: -4 <-> 0 <-> 1 <-> 2 <-> 3 <-> 4 <-> 5 <-> NULL +dlist_insert(l, 5, 12); // l: -4 <-> 0 <-> 1 <-> 2 <-> 3 <-> 4 <-> 5 <-> NULL +struct node *tmp = l->head; +for(size_t i = 0; i < l->size; i ++){ + printf("%i - ", tmp->data); + tmp = tmp->next; +} +dlist_clear(l); + + + +}*/ diff --git a/RecapThoseAnimals/Fundamentals/double_linked_list/dlist.h b/RecapThoseAnimals/Fundamentals/double_linked_list/dlist.h index e69de29..dc49ded 100644 --- a/RecapThoseAnimals/Fundamentals/double_linked_list/dlist.h +++ b/RecapThoseAnimals/Fundamentals/double_linked_list/dlist.h @@ -0,0 +1,28 @@ +#ifndef DLIST_H +#define DLIST_H +#include +struct node{ + int data; + struct node *next; + struct node *prev; +}; + +struct dlist{ + size_t size; + struct node *head; + struct node *tail; +}; + +struct dlist *dlist_init(void); +void dlist_clear(struct dlist *list); +size_t dlist_length(struct dlist *l); +void dlist_push_front(struct dlist *l, int data); +void dlist_push_back(struct dlist *l, int data); +void dlist_remove(struct dlist *list, int data); +struct dlist *dlist_from_str(char *str); +struct node *dlist_find(struct dlist *list, int data); +void dlist_concat(struct dlist *l1, struct dlist *l2); +void dlist_insert(struct dlist *l, int data, int i); + + +#endif diff --git a/RecapThoseAnimals/Fundamentals/process/fork.c b/RecapThoseAnimals/Fundamentals/process/fork.c index 1cdb5b2..77b20da 100644 --- a/RecapThoseAnimals/Fundamentals/process/fork.c +++ b/RecapThoseAnimals/Fundamentals/process/fork.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include @@ -8,12 +9,44 @@ int is_prime(size_t n) { - // TODO - return 0; -} + + + int status; + pid_t pid = fork(); + if(pid < 0) return -1; + //Child + if(pid == 0){ + for(size_t i = 2; i < n; i ++){ + if(n % i == 0 && i != n){ + printf("Child speaking: my number %zu is not a prime number\n", n); + printf("We both say hi!\n"); + exit(0); + } + } + printf("Child speaking: my number %zu is a prime number\n", n); + printf("We both say hi!\n"); + exit(1); + } + + //daddy milk + else{ + if(waitpid(pid, &status, 0) == -1) return -1; + + if(WIFEXITED(status)){ + if(WEXITSTATUS(status) == 1) printf("Parent speaking: stop wasting my time of course %zu is a prime number\n", n); + else printf("Parent speaking: stop wasting my time of course %zu is not a prime number\n", n); + } + printf("We both say hi!\n"); + } + + + + return WEXITSTATUS(status); +} +/* int salute(int num_guests, char *guests[]) { - // TODO + return 0; -} +}*/ diff --git a/RecapThoseAnimals/Fundamentals/process/main.c b/RecapThoseAnimals/Fundamentals/process/main.c index 73f9376..a259798 100644 --- a/RecapThoseAnimals/Fundamentals/process/main.c +++ b/RecapThoseAnimals/Fundamentals/process/main.c @@ -15,6 +15,7 @@ int main(int argc, char *argv[]) is_prime(atoi(argv[i])); } } + /* else if (!strcmp(argv[0], "./salute")) { return salute(argc, argv); @@ -23,6 +24,6 @@ int main(int argc, char *argv[]) { printf("No such thing as %s\n", argv[0]); } - +*/ return 0; }