diff --git a/Programmation/Exercices/serie_12_dll_browser/corrige_partiel/Makefile b/Programmation/Exercices/serie_12_dll_browser/corrige_partiel/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..abd9c335d2f295b0815971c3bd69e69810359941 --- /dev/null +++ b/Programmation/Exercices/serie_12_dll_browser/corrige_partiel/Makefile @@ -0,0 +1,9 @@ +main: dll.o browser.c + gcc browser.c dll.o -o browser -Wall -Wextra -g -pedantic -fsanitize=address -fsanitize=leak + +dll.o: dll.c dll.h + gcc -c -Wall -Wextra -g -pedantic -fsanitize=address -fsanitize=leak dll.c -o dll.o + +clean : + rm -r *.o + diff --git a/Programmation/Exercices/serie_12_dll_browser/corrige_partiel/browser.c b/Programmation/Exercices/serie_12_dll_browser/corrige_partiel/browser.c new file mode 100644 index 0000000000000000000000000000000000000000..95646a1dab919c6da5a26cfb5fdeee209a517fc6 --- /dev/null +++ b/Programmation/Exercices/serie_12_dll_browser/corrige_partiel/browser.c @@ -0,0 +1,12 @@ +#include "dll.h" + +int main(){ + + dll list = dll_create(); + + list = dll_push(list, "bonjour"); + list = dll_push(list, "123"); + + dll_print(list); + dll_destroy(&list); +} \ No newline at end of file diff --git a/Programmation/Exercices/serie_12_dll_browser/corrige_partiel/dll.c b/Programmation/Exercices/serie_12_dll_browser/corrige_partiel/dll.c new file mode 100644 index 0000000000000000000000000000000000000000..bde224618ec402cfceabb507bb0055dcc945e396 --- /dev/null +++ b/Programmation/Exercices/serie_12_dll_browser/corrige_partiel/dll.c @@ -0,0 +1,114 @@ +#include "dll.h" + +// === Création et consultation === +// crée la liste doublement chaînée +dll dll_create(){ + dll res; + res.head = NULL; + res.cur = NULL; + return res; +} +// retourne la valeur à la position actuelle dans la liste +char* dll_value(dll list){ + if(list.cur == NULL){ + return NULL; + } + return list.cur->data; +} +// la liste est-elle vide? +bool dll_is_empty(dll list){ + return list.head==NULL; +} +// Est-ce que cur est le 1er élément? +bool dll_is_head(dll list){ + return list.head != NULL && list.head == list.cur; +} +// Est-ce que cur est le dernier élément? +bool dll_is_tail(dll list){ + return list.cur != NULL && list.cur->next == NULL; +} +// data est-elle dans la liste? +bool dll_is_present(dll list, char* data){ + return false; +} +// affiche la liste +void dll_print(dll list){ + if(!dll_is_empty(list)){ + list = dll_move_to_head(list); + while(!dll_is_tail(list)){ + printf("%s\n", dll_value(list)); + list = dll_next(list); + } + printf("%s\n", dll_value(list)); + } +} + +// === Manipulation === +// déplace cur au début de la liste +dll dll_move_to_head(dll list){ + list.cur = list.head; + return list; +} +// déplace cur à la position suivante dans la liste +dll dll_next(dll list){ + if(!dll_is_tail(list)){ + list.cur = list.cur->next; + } + return list; +} +// déplace cur à la position précédente dans la liste +dll dll_prev(dll list){ + if(!dll_is_head(list)){ + list.cur = list.cur->prev; + } + return list; +} + +// === Insertion === +// insertion de data dans l'élément après cur +dll dll_insert_after(dll list, char* data){ + // A IMPLEMENTER + dll res; + return res; +} +// insertion de data en tête de liste +dll dll_push(dll list, char* data){ + element *new = malloc(sizeof(element)); + new->prev = NULL; + new->next = list.head; + if(!dll_is_empty(list)){ + list.head->prev = new; + } + list.head = new; + new->data = malloc(strlen(data)+1*sizeof(char)); + strcpy(new->data, data); + return list; +} + +// === Extraction === +// extraction de la valeur se trouvant dans l'élément cur +// l'élément cur est libéré (mais pas la chaine de caractères) +char* dll_extract(dll *list){ + // A IMPLEMENTER + return NULL; +} +// extrait la donnée en tête de liste +// l'élément en tête est libéré (mais pas la chaine de caractères) +char* dll_pop(dll *list){ + // A IMPLEMENTER + return NULL; +} +// vide la liste (les chaines de caractères sont libérées) +void dll_destroy(dll *list){ + *list = dll_move_to_head(*list); + element* cur = list->cur; + while(cur !=NULL && cur->next != NULL){ + cur = cur->next; + free(cur->prev->data); + free(cur->prev); + } + free(cur->data); + free(cur); + list->head = NULL; + list->cur = NULL; +} \ No newline at end of file diff --git a/Programmation/Exercices/serie_12_dll_browser/corrige_partiel/dll.h b/Programmation/Exercices/serie_12_dll_browser/corrige_partiel/dll.h new file mode 100644 index 0000000000000000000000000000000000000000..69058dadd77530ba4118b1277788800780ba81f6 --- /dev/null +++ b/Programmation/Exercices/serie_12_dll_browser/corrige_partiel/dll.h @@ -0,0 +1,56 @@ +#include <stdlib.h> +#include <stdbool.h> +#include <stdio.h> +#include <string.h> + +typedef struct element_{ + char* data; + struct element_* prev; + struct element_* next; +}element; + +typedef struct dll_{ + element* head; + element* cur; +}dll; + + +// === Création et consultation === +// crée la liste doublement chaînée +dll dll_create(); +// retourne la valeur à la position actuelle dans la liste +char* dll_value(dll list); +// la liste est-elle vide? +bool dll_is_empty(dll list); +// Est-ce que cur est le 1er élément? +bool dll_is_head(dll list); +// Est-ce que cur est le dernier élément? +bool dll_is_tail(dll list); +// data est-elle dans la liste? +bool dll_is_present(dll list, char* data); +// affiche la liste +void dll_print(dll list); + +// === Manipulation === +// déplace cur au début de la liste +dll dll_move_to_head(dll list); +// déplace cur à la position suivante dans la liste +dll dll_next(dll list); +// déplace cur à la position précédente dans la liste +dll dll_prev(dll list); + +// === Insertion === +// insertion de data dans l'élément après cur +dll dll_insert_after(dll list, char* data); +// insertion de data en tête de liste +dll dll_push(dll list, char* data); + +// === Extraction === +// extraction de la valeur se trouvant dans l'élément cur +// l'élément cur est libéré (mais pas la chaine de caractères) +char* dll_extract(dll *list); +// extrait la donnée en tête de liste +// l'élément en tête est libéré (mais pas la chaine de caractères) +char* dll_pop(dll *list); +// vide la liste (les chaines de caractères sont libérées) +void dll_destroy(dll *list);