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);