diff --git a/circular_list/Makefile b/circular_list/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..f53a5930aa92a8162c60a775494ee1b3076fb2b2
--- /dev/null
+++ b/circular_list/Makefile
@@ -0,0 +1,10 @@
+cc=gcc
+CFLAGS=-Wextra -Wall -g -fsanitize=address -fsanitize=leak
+LFLAGS= -lm
+
+circ.x: circ.o main.o
+	$(cc) -o $@ $^ $(CFLAGS) $(LFLAGS)
+
+clean:
+	rm -f *.o *.x
+
diff --git a/circular_list/circ.c b/circular_list/circ.c
new file mode 100644
index 0000000000000000000000000000000000000000..c6a16c2851a72189559e9be1fcc95ddb26308d9d
--- /dev/null
+++ b/circular_list/circ.c
@@ -0,0 +1,119 @@
+#include "circ.h"
+#include <stdlib.h>
+
+// typedef struct element {
+//   void *content;
+//   struct element *next;
+// } element;
+
+// Crée une nouvelle liste vide. Renvoie simplement un pointeurNULL
+element *list_create() { return NULL; }
+
+// true si la liste est vide
+bool list_empty(element *head) { return head == NULL; }
+
+// Renvoie le nombre d’éléments de la listeunsigned
+int list_count(element *head) {
+  if (list_empty(head)) {
+    return 0;
+  }
+
+  int count = 1;
+  element *crt = head;
+
+  while (crt->next != head) {
+    crt = crt->next;
+    count++;
+  }
+  return count;
+}
+
+// Déplace le pointeur head sur l’élément suivant. Retourne la nouvelle têtede
+// liste
+element *list_move(element *head) {
+  head = head->next;
+  return head;
+}
+
+// Insert un élément après le pointeur head. Retourne le pointeur sur l’élé-ment
+// inséré
+element *list_insert_after(element *head, void *data) {
+
+  if (list_empty(head)) {
+    printf("insert empty\n");
+    head = malloc(sizeof(element));
+    head->content = data;
+    head->next = head;
+    return head;
+  }
+
+  printf("insert not empty\n");
+  element *tmp = malloc(sizeof(element));
+  tmp->content = data;
+  tmp->next = head->next;
+  head->next = tmp;
+  return tmp;
+}
+
+// Insert un élément avant le pointeur head. Retourne le pointeur sur l’élé-ment
+// inséré
+element *list_insert_before(element *head, void *data) {
+  element *crt = head;
+  while (crt->next != head) {
+    list_move(crt);
+  }
+  element *tmp = malloc(sizeof(element));
+  tmp->content = data;
+
+  tmp->next = head;
+  crt->next = tmp;
+
+  return tmp;
+}
+
+// Recherche un élément dans la liste. Retourne un pointeur sur le 1erélément
+// trouvé ouNULLsi l’élément est absent
+element *list_search(element *head, void *data,
+                     int (*compare)(void *, void *)) {
+  element *crt = head;
+
+  while (compare(crt->content, data)) {
+    crt = crt->next;
+    if (crt->next == head) {
+      return NULL;
+    }
+  }
+  return crt;
+}
+
+// Supprime un élément de la liste sans libérer l’élément pointé. Renvoie
+// unpointeur sur le 1er élément trouvé à supprimer et l’enlève de la liste,
+// ouNULLsi l’élément est absent
+element *list_remove(element *head, void *data,
+                     int (*compare)(void *, void *)) {
+  element *tmp = list_search(head, data, compare);
+  if (tmp == NULL) {
+    return NULL;
+  }
+  element *removed = tmp->next;
+  tmp->next = tmp->next->next;
+  return removed;
+}
+
+// Supprime toute la liste en libérant chaque élément
+void list_free(element *head, void (*data_free)(void *)) {
+  element *tmp = head;
+  while (!list_empty(tmp)) {
+    tmp = tmp->next;
+    data_free(head);
+  }
+}
+
+// Appel d’une fonction de traitement quelconque sur chaque élément de laliste
+void list_process(element *head, void *(*action)(void *)) {
+  element *crt = head;
+  while (crt->next != head) {
+    action(crt->content);
+    crt = crt->next;
+  }
+}
diff --git a/circular_list/circ.h b/circular_list/circ.h
new file mode 100644
index 0000000000000000000000000000000000000000..4ddb88979b8da23e6fb73393dffc83eeb5b58983
--- /dev/null
+++ b/circular_list/circ.h
@@ -0,0 +1,48 @@
+#ifndef _circ_H_
+#define _circ_H_
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef struct element {
+  void *content;
+  struct element *next;
+} element;
+
+// Crée une nouvelle liste vide. Renvoie simplement un pointeurNULL
+element* list_create();
+
+// este si la liste est vide
+bool list_empty(element* head);
+
+// Renvoie le nombre d’éléments de la listeunsigned 
+int list_count(element* head);
+
+// Déplace le pointeur head sur l’élément suivant. Retourne la nouvelle têtede liste
+element* list_move(element* head);
+
+// Insert un élément après le pointeur head. Retourne le pointeur sur l’élé-ment inséré
+element* list_insert_after(element* head, void* data);
+
+// Insert un élément avant le pointeur head. Retourne le pointeur sur l’élé-ment inséré
+element* list_insert_before(element* head, void* data);
+
+// Recherche un élément dans la liste. Retourne un pointeur sur le 1erélément trouvé ouNULLsi l’élément est absent
+element* list_search(element* head,void* data,int (*compare)(void*, void*));
+
+// Supprime un élément de la liste sans libérer l’élément pointé. Renvoie unpointeur sur le 1er élément trouvé à supprimer et l’enlève de la liste, ouNULLsi l’élément est absent
+element* list_remove(element* head, void* data,int (*compare)(void*, void*));
+
+// Supprime toute la liste en libérant chaque élément
+void list_free(element* head, void (*data_free)(void*));
+
+// Appel d’une fonction de traitement quelconque sur chaque élément de laliste
+void list_process(element* head, void* (*action)(void*));
+
+
+
+
+
+
+#endif
diff --git a/circular_list/main.c b/circular_list/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..c31d2ed3f765ade0aea86ed22be7b333859e4970
--- /dev/null
+++ b/circular_list/main.c
@@ -0,0 +1,39 @@
+#include "circ.h"
+#include <stdlib.h>
+
+void *print_int(void *x) {
+  printf("%d ", *(int *)x);
+  return x;
+}
+
+void free_simple(void *ptr) { free(ptr); }
+
+int main() {
+
+  element *head = list_create();
+
+  printf("%d\n", list_count(head));
+
+  int a = 1;
+  int b = 2;
+  int c = 3;
+
+  head = list_insert_after(head, &a);
+  head = list_insert_after(head, &b);
+
+  head = list_insert_after(head, &a);
+  //   list_insert_after(head, &b);
+  //   list_insert_after(head, &c);
+
+  printf("%d\n", list_count(head));
+
+  //   for (int i = 0; i < 8; i++) {
+  //     list_insert_after(head, &i);
+  //   }
+
+  //   list_process(head, print_int);
+
+  // list_free(head, free_simple);
+
+  return EXIT_SUCCESS;
+}
\ No newline at end of file