Bonjour,
J'ai quelques questions sur l'utilisation des listes chaînées, ou plutôt de la bonne utilisation des types abstraits.
Dans tous les exemples que j'ai lu, la structure qui représente le maillon d'une liste n'est composée que de deux éléments.
Par exemple, la déclaration du type Node dans le header du composant de liste :
Mais en cours, la réutilisation des composants techniques (dits « abstraits », par opposition aux composants techniques) est fortement encouragée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 typedef struct s_Node { int valeur; struct s_Node* next; } Node;
On ajoute alors un header Item.h, qui se limite à un simple :
typedef MonTypeMetier Item;
puis le header Item.h est inclu dans le header du composant liste (ce que j'appelle composant est le code des fonctions .c et son header .h associé).
Il suffit alors de modifier le typedef dans le header Item.h pour obtenir un semblant de généricité :
Bon, j'en viens aux faits : je travaille sur un projet qui fait une utilisation importante des listes chaînées, et j'ai quelques problèmes d'organisation de code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #include "Item.h" typedef struct s_Node { Item valeur; struct s_Node* next; } Node;
1) Mes « items » sont alloués dynamiquement et sont très nombreux (plusieurs dizaines de milliers).
Déjà ça m'ennuyait un peu de faire un typedef sur un type pointeur (pas de raison particulière, c'est juste que j'aime conserver le symbole * sur les pointeurs), et par soucis d'optimisation, j'ai choisi de « fusionner » les types Node et Item.
Ça me permet de réduire le nombre d'allocations :
Le header de mon composant Item est alors inclu dans le header de mon composant liste, ce dernier n'ayant plus besoin du type Node.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 typedef struct s_Item { /* une demi-douzaine d'éléments « métiers » */ struct s_Item* next; } Item;
Ce mélange des éléments n'est-il pas un peu crade ?
Comment garder une disctinction entre les composants métiers et techniques, sans augmenter le nombre d'allocations mémoire ?
Est-ce que cette pratique est courante ? Ou bien au contraire, les maillons des listes chaînées ne contiennent toujours que deux éléments, la valeur et le pointeur « next » ?
2) Autre question, plus axé technique :
Imaginons que je veuille utilisé mon composant de liste avec des types « items » différents (c'est à dire manipuler une liste d'items A (issu d'un composant A) et une liste d'items B (issu d'un composant B).
Je fais comment ?!
Merci d'avance.
Partager