« Structures de données en C/Les listes simples » : différence entre les versions

Contenu supprimé Contenu ajouté
Chdemko (discussion | contributions)
Chdemko (discussion | contributions)
Ligne 188 :
 
Il est à noter que la modification du pointeur <code>tmp</code> ne modifie en rien le pointeur original <code>list</code>.
{{EnTravaux}}
 
== Itérer sur des listes simples ==
Un itérateur en C sur les listes est un pointeur de <code>List *</code> soit un <code>List **</code> (la raison essentielle est que la fonction <code>list_iterator_next</code> modifie l'itérateur. La seule façon de procéder en C est d'utiliser en pointeur sur l'argument à modifier). Mais vu de l'extérieur des fonctions, il est préférable dans un soucis de généricité d'utiliser le pointeur <code>void *</code>
 
La fonction de création consiste à allouer un tel pointeur et à l'initialiser à la liste
<pre>
Iterator *list_iterator_create(void *list)
{
return iterator_create(list,NULL,list_iterator_has_next,list_iterator_next);
}
</pre>
 
La fonction pour savoir si il existe un élément suivant teste simplement la valeur de <code>*iterator</code>
<pre>
static int list_iterator_has_next(const void *list)
{
return (int)list;
}
</pre>
 
La fonction pour obtenir le prochain élément d'un itérateur de liste retourne la donnée et modifie l'itérateur en le faisant pointer sur la prochaine donnée.
<pre>
static void *list_iterator_next(void *plist)
{
void *data = (*(List**)plist)->data; /* conservation de la donnée courante de l'itérateur */
*(List**)plist = (*(List**)plist)->next; /* modification de l'itérateur */
return data; /* retour de la donnée */
}
</pre>
 
Le code classique pour parcourir une liste devient
<pre>
...
Iterator *iterator = list_iterator_create(list);
if (iterator)
{
while (iterator_has_next(iterator))
{
void *data = iterator_next(iterator);
/* traitement de data */
}
iterator_destroy(iterator);
}
else
/* traitement de l'erreur d'allocation */
...
</pre>
 
[[Catégorie:Livre:Structures de données en C]]
 
 
[[Catégorie:Livre:Structures de données en C]]
 
==Exercices==
===Listes et ensembles===