[Cours #8] Listes chainées
-
<p>Bonjour à tous,</p>
<p>Dans ce cours, nous allons voir ce qu'est une liste chainées, et comment elle fonctionne.</p>
<p> </p>
<p><strong>I- Liste chainée? WTF?</strong></p>
<p>D'après Wikipedia: "Une liste chaînée désigne en informatique une structure de données représentant une collection ordonnée et de taille arbitraire d'éléments de même type".</p>
<p>Pour résumer, il s'agit d'une collection de données (comme un tableau, sisi), qui a une taille variable, donc on a pas besoin de connaitre la taille de la liste à l'avance (un peu comme dans le cours sur les allocations dynamiques
). Les éléments sont enregistrés les uns après les autres.</p>
<p>C'est donc une grosse liste de données. Le premier élément pointe vers le second, le second vers le troisième, le troisième vers le quatrième etc...</p>
<p>Comme le montre le schéma ci-dessous:</p>
<p>(Source: Openclassroom)</p>
<p><img alt="39595.jpg" src="http://uploads.siteduzero.com/files/39001_40000/39595.jpg"/></p>
<p>C'est une liste chainée simple, et nous ne verrons que celle-ci. Pour la liste chainée circulaire, ou encore double, je vous laisse chercher par vous mêmes
</p>
<p> </p>
<p><strong>II- Créons notre structure de données!</strong></p>
<p>Une liste chainées à pour but de contenir des données (c'est logique...), il faut donc créer une structure pour stocker lesdites données.</p>
<p>Pour ma part de vais créer une liste pour stocker l'age et la taille d'un certain nombre d'utilisateurs.</p>
<pre class="ipsCode prettyprint">
typedef struct s_list
{
int taille;
int age;
struct s_list *next;
}t_list;
</pre>
<p>Oh! c'est étrange, qu'est-ce que la variable "next" vient faire ici? Comme je l'ai dit plus haut, il s'agit du pointeur sur le prochain élément de notre liste chainée. Il va falloir penser à le mettre à NULL pour connaitre la fin de notre liste chainée! En effet, lorsqu'on sera au dernier élément, on le sera grâce au NULL.</p>
<p>Dans ce cours, je vais uniquement vous apprendre à ajouter des éléments à votre liste, à parcourir votre liste, et enfin à supprimer votre liste. C'est à vous d'utiliser votre tête pour la suite!</p>
<p> </p>
<p><strong>III- Ajouter un élément à la liste.</strong></p>
<p>Maintenant que notre structure est crée, nous allons créer plusieurs fonctions, pour gérer notre liste chainée.</p>
<p>Créons tout d'abord une fonction pour ajouter un élément à la liste:</p>
<pre class="ipsCode prettyprint">
int add_to_list(t_list **list, t_list *datas)
{
t_list *next;next = NULL;
if (*list != NULL)
next = *list;
if ((*list = malloc(sizeof(t_list))) == NULL)
return (1);
(*list)->taille = datas->taille;
(*list)->age = datas->age;
(*list)->next =next;
return (0);
}
</pre>
<p>Voici un exemple d'utilisation de la fonciton:</p>
<pre class="ipsCode prettyprint">
int main(void)
{
t_list *list;
t_list datas;*list = NULL;
datas.age = 10;
datas.taille = 180;
// On ajoute à notre liste
if (add_to_list(&list, &datas))
return (1);
// On récupère le premier noeud pour voir ce qu'il contient
printf("Age: %d, Taille: %d\n", list->age, list->taille);
return (0);
}
</pre>
<p><strong>III- Parcourons notre liste!</strong></p>
<p>Nous allons à présent parcourir notre liste.</p>
<pre class="ipsCode prettyprint">
int main(void)
{
t_list *list;
t_list datas;
int i;i = -1;
// On remplis notre liste avec 10 éléments
while (++i < 10)
{
datas.age = i;
datas.taille = 180 + i;
if (add_to_list(&list, &datas))
return (1);
}
// On parcours et on affiche notre liste!
while (list != NULL)
{
printf("Age: %d, Taille: %d\n", list->age, list->taille);
list = list->next;
}
return (0);
}
</pre>
<p><strong>IV- Vidons notre liste! (C'est important de vider la mémoire!)</strong></p>
<p>Pour cela, créons une fonction de vidage.</p>
<pre class="ipsCode prettyprint">
void clear_list(t_list **list)
{
t_list *elem;
t_list *next;elem = *list;
while (elem)
{
next = elem->next;
free(elem);
elem = next;
}
*list = NULL;
}
</pre>
<p>Exemple d'utilisation:</p>
<pre class="ipsCode prettyprint">
int main(void)
{
t_list *list;
t_list datas;
int i;i = -1;
// On remplis notre liste avec 10 éléments
while (++i < 10)
{
datas.age = i;
datas.taille = 180 + i;
if (add_to_list(&list, &datas))
return (1);
}
// On parcours et on affiche notre liste! (on utilise un pointeur annexe pour ne pas perdre le noeud mère)
list *elem = list;
while (elem != NULL)
{
printf("Age: %d, Taille: %d\n", elem->age, elem->taille);
elem = elem->next;
}
clear_list(&list);
return (0);
}
</pre>
<p>Je vous laisse la joie d'analyser le code, à ce stade des cours (et si vous avez bien tout suivi) vous savez analyser le code, je vous laisse donc le comprendre par vous mêmes! Je reste disponible pour répondre à vos questions!</p>
<p> </p>
<p>A bientôt pour un prochain cours!</p> -
<p>Choses que j'ai remarquer:</p>
<p>-Il manque une parenthèse dans la fonction <em>add_to_list</em>, après le <em>sizeof(t_list)</em> dans le second <em>if</em>.</p>
<p>-La variable <em>next</em> dans la fonction <em>add_to_list</em> n'est pas utilisée.</p>
<p>-Dans l'exemple, la liste ne contient qu'un élément. (au lieu de 10), je pense qu'il y a un problème dans la fonction <em>add_to_list</em>.</p> -
<blockquote class="ipsQuote" data-cite="davydavek" data-ipsquote="" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentcommentid="8323" data-ipsquote-contentid="783" data-ipsquote-contenttype="forums" data-ipsquote-timestamp="1401822414" data-ipsquote-username="davydavek"><div>
<div>
<p>Choses que j'ai remarquer:</p>
<p>-Il manque une parasynthèse dans la fonction <em>add_to_list</em>, après le <em>sizeof(t_list)</em> dans le second <em>if</em>.</p>
<p>-La variable <em>next</em> dans la fonction <em>add_to_list</em> n'est pas utilisée.</p>
<p>-Dans l'exemple, la liste ne contient qu'un élément. (au lieu de 10), je pense qu'il y a un problème dans la fonction <em>add_to_list</em>.</p>
</div>
</div></blockquote>
<p>Réparé, merci pour l'info. Effectivement, j'ai tout codé directement sur Meli, donc j'ai pas pu tester ^^'</p> -
<p>EDIT: correction de quelques erreurs.</p>
-
<p>Une petite erreur dans le dernier code qui faisait que seul le dernier élément de la liste était free.</p>
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login