Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse

NodeBB

  1. Home
  2. Programmation
  3. Développement de logiciels
  4. C
  5. [Cours #8] Listes chainées

[Cours #8] Listes chainées

Scheduled Pinned Locked Moved C
7 Posts 3 Posters 4.6k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • AlexMogA
    AlexMogA
    AlexMog
    Modérateur spécialisé
    wrote on last edited by
    #1

    <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>

    Multiplayer GameDev @ Unexpected
    

    Mon CV

    1 Reply Last reply
    3
    • D
      D
      davydavek
      wrote on last edited by
      #2

      <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>

      C# dev
      github.com/DavyWk

      1 Reply Last reply
      0
      • AlexMogA
        AlexMogA
        AlexMog
        Modérateur spécialisé
        wrote on last edited by
        #3

        <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>

        Multiplayer GameDev @ Unexpected
        

        Mon CV

        1 Reply Last reply
        0
        • AzadA
          AzadA
          Azad
          wrote on last edited by
          #4

          <p>Merci du cours, c'est pratique la continuité linéraire des différents tutoriels.<br/><span style="font-size:8px;">(Haaaan, Alex fait des fautes dans ces cours !)</span></p>
          <p>
          +1 rep 😉 </p>

          Administrateur du forum.
          Contactez-moi par message privé ou par mail.

          1 Reply Last reply
          0
          • AlexMogA
            AlexMogA
            AlexMog
            Modérateur spécialisé
            wrote on last edited by
            #5

            <p>EDIT: correction de quelques erreurs.</p>

            Multiplayer GameDev @ Unexpected
            

            Mon CV

            1 Reply Last reply
            0
            • AzadA
              AzadA
              Azad
              wrote on last edited by
              #6

              <p>Thanks, lesquels ?</p>

              Administrateur du forum.
              Contactez-moi par message privé ou par mail.

              1 Reply Last reply
              0
              • AlexMogA
                AlexMogA
                AlexMog
                Modérateur spécialisé
                wrote on last edited by
                #7

                <p>Une petite erreur dans le dernier code qui faisait que seul le dernier élément de la liste était free.</p>

                Multiplayer GameDev @ Unexpected
                

                Mon CV

                1 Reply Last reply
                0

                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
                Reply
                • Reply as topic
                Log in to reply
                • Oldest to Newest
                • Newest to Oldest
                • Most Votes


                • Login

                • Login or register to search.
                Powered by NodeBB Contributors
                • First post
                  Last post
                0
                • Categories
                • Recent
                • Tags
                • Popular
                • World
                • Users
                • Groups