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