<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[[Cours #8] Listes chainées]]></title><description><![CDATA[<p dir="auto">Bonjour à tous,</p>
<p dir="auto">Dans ce cours, nous allons voir ce qu'est une liste chainées, et comment elle fonctionne.</p>
<p dir="auto"><strong>I- Liste chainée? WTF?</strong></p>
<p dir="auto">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 dir="auto">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 <img src="http://new.melinyel.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f609.png?v=aa95655114f" class="not-responsive emoji emoji-android emoji--wink" style="height:23px;width:auto;vertical-align:middle" title=";)" alt="😉" /> ). Les éléments sont enregistrés les uns après les autres.</p>
<p dir="auto">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 dir="auto">Comme le montre le schéma ci-dessous:</p>
<p dir="auto">(Source: Openclassroom)</p>
<p dir="auto"><img src="http://uploads.siteduzero.com/files/39001_40000/39595.jpg" alt="39595.jpg" class=" img-fluid img-markdown" /></p>
<p dir="auto">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 <img src="http://new.melinyel.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f609.png?v=aa95655114f" class="not-responsive emoji emoji-android emoji--wink" style="height:23px;width:auto;vertical-align:middle" title=";)" alt="😉" /></p>
<p dir="auto"><strong>II- Créons notre structure de données!</strong></p>
<p dir="auto">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 dir="auto">Pour ma part de vais créer une liste pour stocker l'age et la taille d'un certain nombre d'utilisateurs.</p>
<pre><code>typedef struct s_list
{
 int taille;
 int age;
 struct s_list *next;
}t_list;
</code></pre>
<p dir="auto">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 dir="auto">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 dir="auto"><strong>III- Ajouter un élément à la liste.</strong></p>
<p dir="auto">Maintenant que notre structure est crée, nous allons créer plusieurs fonctions, pour gérer notre liste chainée.</p>
<p dir="auto">Créons tout d'abord une fonction pour ajouter un élément à la liste:</p>
<pre><code>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)-&gt;taille = datas-&gt;taille;
  (*list)-&gt;age = datas-&gt;age;
  (*list)-&gt;next =next;
  return (0);
}
</code></pre>
<p dir="auto">Voici un exemple d'utilisation de la fonciton:</p>
<pre><code>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(&amp;list, &amp;datas))
    return (1);
  // On récupère le premier noeud pour voir ce qu'il contient
  printf("Age: %d, Taille: %d\n", list-&gt;age, list-&gt;taille);
  return (0);
}
</code></pre>
<p dir="auto"><strong>III- Parcourons notre liste!</strong></p>
<p dir="auto">Nous allons à présent parcourir notre liste.</p>
<pre><code>int main(void)
{
  t_list *list;
  t_list datas;
  int i;

  i = -1;
 // On remplis notre liste avec 10 éléments
  while (++i &lt; 10)
  {
    datas.age = i;
    datas.taille = 180 + i;
    if (add_to_list(&amp;list, &amp;datas))
       return (1);
  }
// On parcours et on affiche notre liste!
  while (list != NULL)
  {
     printf("Age: %d, Taille: %d\n", list-&gt;age, list-&gt;taille);
     list = list-&gt;next;
  }
  return (0);
}
</code></pre>
<p dir="auto"><strong>IV- Vidons notre liste! (C'est important de vider la mémoire!)</strong></p>
<p dir="auto">Pour cela, créons une fonction de vidage.</p>
<pre><code>void clear_list(t_list **list)
{
  t_list *elem;
  t_list *next;

  elem = *list;
  while (elem)
  {
    next = elem-&gt;next;
    free(elem);
    elem = next;
  }
  *list = NULL;
}
</code></pre>
<p dir="auto">Exemple d'utilisation:</p>
<pre><code>int main(void)
{
  t_list *list;
  t_list datas;
  int i;

  i = -1;
 // On remplis notre liste avec 10 éléments
  while (++i &lt; 10)
  {
    datas.age = i;
    datas.taille = 180 + i;
    if (add_to_list(&amp;list, &amp;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-&gt;age, elem-&gt;taille);
     elem = elem-&gt;next;
  }
  clear_list(&amp;list);
  return (0);
}
</code></pre>
<p dir="auto">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 dir="auto">A bientôt pour un prochain cours!</p>
]]></description><link>http://new.melinyel.net/topic/783/cours-8-listes-chainées</link><generator>RSS for Node</generator><lastBuildDate>Thu, 21 May 2026 19:28:46 GMT</lastBuildDate><atom:link href="http://new.melinyel.net/topic/783.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 Jun 2014 17:04:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Cours #8] Listes chainées on Fri, 11 Jul 2014 17:18:50 GMT]]></title><description><![CDATA[<p dir="auto">Une petite erreur dans le dernier code qui faisait que seul le dernier élément de la liste était free.</p>
]]></description><link>http://new.melinyel.net/post/9171</link><guid isPermaLink="true">http://new.melinyel.net/post/9171</guid><dc:creator><![CDATA[AlexMog]]></dc:creator><pubDate>Fri, 11 Jul 2014 17:18:50 GMT</pubDate></item><item><title><![CDATA[Reply to [Cours #8] Listes chainées on Fri, 11 Jul 2014 13:44:08 GMT]]></title><description><![CDATA[<p dir="auto">Thanks, lesquels ?</p>
]]></description><link>http://new.melinyel.net/post/9162</link><guid isPermaLink="true">http://new.melinyel.net/post/9162</guid><dc:creator><![CDATA[Azad]]></dc:creator><pubDate>Fri, 11 Jul 2014 13:44:08 GMT</pubDate></item><item><title><![CDATA[Reply to [Cours #8] Listes chainées on Thu, 10 Jul 2014 09:49:45 GMT]]></title><description><![CDATA[<p dir="auto">EDIT: correction de quelques erreurs.</p>
]]></description><link>http://new.melinyel.net/post/9118</link><guid isPermaLink="true">http://new.melinyel.net/post/9118</guid><dc:creator><![CDATA[AlexMog]]></dc:creator><pubDate>Thu, 10 Jul 2014 09:49:45 GMT</pubDate></item><item><title><![CDATA[Reply to [Cours #8] Listes chainées on Wed, 04 Jun 2014 14:14:31 GMT]]></title><description><![CDATA[<p dir="auto">Merci du cours, c'est pratique la continuité linéraire des différents tutoriels.<br />
(Haaaan, Alex fait des fautes dans ces cours !)</p>
<p dir="auto">+1 rep <img src="http://new.melinyel.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f609.png?v=aa95655114f" class="not-responsive emoji emoji-android emoji--wink" style="height:23px;width:auto;vertical-align:middle" title=";)" alt="😉" /></p>
]]></description><link>http://new.melinyel.net/post/8355</link><guid isPermaLink="true">http://new.melinyel.net/post/8355</guid><dc:creator><![CDATA[Azad]]></dc:creator><pubDate>Wed, 04 Jun 2014 14:14:31 GMT</pubDate></item><item><title><![CDATA[Reply to [Cours #8] Listes chainées on Tue, 03 Jun 2014 22:08:38 GMT]]></title><description><![CDATA[<blockquote>
<p dir="auto">Choses que j'ai remarquer:</p>
<p dir="auto">-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 dir="auto">-La variable <em>next</em> dans la fonction <em>add_to_list</em> n'est pas utilisée.</p>
<p dir="auto">-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>
<p dir="auto">Réparé, merci pour l'info. Effectivement, j'ai tout codé directement sur Meli, donc j'ai pas pu tester ^^'</p>
]]></description><link>http://new.melinyel.net/post/8333</link><guid isPermaLink="true">http://new.melinyel.net/post/8333</guid><dc:creator><![CDATA[AlexMog]]></dc:creator><pubDate>Tue, 03 Jun 2014 22:08:38 GMT</pubDate></item><item><title><![CDATA[Reply to [Cours #8] Listes chainées on Wed, 04 Jun 2014 15:55:47 GMT]]></title><description><![CDATA[<p dir="auto">Choses que j'ai remarquer:</p>
<p dir="auto">-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 dir="auto">-La variable <em>next</em> dans la fonction <em>add_to_list</em> n'est pas utilisée.</p>
<p dir="auto">-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>
]]></description><link>http://new.melinyel.net/post/8323</link><guid isPermaLink="true">http://new.melinyel.net/post/8323</guid><dc:creator><![CDATA[davydavek]]></dc:creator><pubDate>Wed, 04 Jun 2014 15:55:47 GMT</pubDate></item></channel></rss>