Salut,
Je débute en C et je cherche à implémenter une liste chaînée. Je me suis documenté sur la question, j'ai regardé certains codes existants, et j'ai constaté que la plupart des développeurs prennent soin de différencier les éléments de la liste (les différents noeuds en particulier) des données de l'utilisateur (ce qui paraît à la base plutôt astucieux).
Pour ce qui est de la création de la liste, j'ai écris ça :
list.h
Le code du constructeur est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 /* structure élément de la liste */ typedef struct { struct node_s *prev; struct node_s *next; void *data; } node_s; /* structure liste */ typedef struct { int count; node_s *first; node_s *current; node_s *last; int (*compare)(void *, void *); } list_s; /* constructeur */ list_s *list_create(); /* destructeur */ void list_delete(list_s *);
Jusqu'ici, je considère que ça va (détrompez-moi si ce n'est pas le cas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 list_s *list_create() { list_s *list; list = malloc(sizeof(list_s)); if(! list) { fprintf(stderr, "Dynamic memory allocation failed"); perror(" "); exit(1); } list->count = 0; list->first = list->current = list->last = NULL; return list; }). Là où je bloque, c'est sur le destructeur. Si j'implémente une fonction qui libère l'espace mémoire réservé pour chaque maillon de la liste, les pointeurs vers les différentes données de l'utilisateur seront perdus, et il lui sera impossible de désallouer la mémoire dédiée aux données.
En fait, j'aurais besoin d'un conseil d'ordre général, compte-tenu du fait que je cherche à écrire le code le plus générique possible (le but étant de le réutiliser dans différentes applications). Faut-il laisser le soin à l'utilisateur de libérér la mémoire allouée pour les données avant d'invoquer le destructeur ou la gestion des données doit-elle être "wrappée" (c'est très laid) par l'implémentation de la liste chaînée ?
Désolé pour ce post un peu long et merci pour vos futures réponses.
Partager