Aller directement au contenu
  • Catégories
  • Récent
  • Mots-clés
  • Populaire
  • Web
  • Utilisateurs
  • Groupes
Habillages
  • Clair
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Sombre
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Défaut (Aucun habillage)
  • Aucun habillage
Réduire
Melinyel

Melinyel

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

[Cours #8] Listes chainées

Planifié Épinglé Verrouillé Déplacé C
7 Messages 3 Publieurs 4.6k Vues
  • Du plus ancien au plus récent
  • Du plus récent au plus ancien
  • Les plus votés
Répondre
  • Répondre à l'aide d'un nouveau sujet
Se connecter pour répondre
Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
  • AlexMogA Hors-ligne
    AlexMogA Hors-ligne
    AlexMog
    Modérateur spécialisé
    a écrit sur dernière édition par
    #1

    Bonjour à tous,

    Dans ce cours, nous allons voir ce qu'est une liste chainées, et comment elle fonctionne.

    I- Liste chainée? WTF?

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

    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.

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

    Comme le montre le schéma ci-dessous:

    (Source: Openclassroom)

    39595.jpg

    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 😉

    II- Créons notre structure de données!

    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.

    Pour ma part de vais créer une liste pour stocker l'age et la taille d'un certain nombre d'utilisateurs.

    typedef struct s_list
    {
     int taille;
     int age;
     struct s_list *next;
    }t_list;
    

    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.

    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!

    III- Ajouter un élément à la liste.

    Maintenant que notre structure est crée, nous allons créer plusieurs fonctions, pour gérer notre liste chainée.

    Créons tout d'abord une fonction pour ajouter un élément à la liste:

    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);
    }
    

    Voici un exemple d'utilisation de la fonciton:

    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);
    }
    

    III- Parcourons notre liste!

    Nous allons à présent parcourir notre liste.

    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);
    }
    

    IV- Vidons notre liste! (C'est important de vider la mémoire!)

    Pour cela, créons une fonction de vidage.

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

    Exemple d'utilisation:

    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);
    }
    

    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!

    A bientôt pour un prochain cours!

    Multiplayer GameDev @ Unexpected

    Mon CV

    1 réponse Dernière réponse
    3
    • D Hors-ligne
      D Hors-ligne
      davydavek
      a écrit sur dernière édition par
      #2

      Choses que j'ai remarquer:

      -Il manque une parenthèse dans la fonction add_to_list, après le sizeof(t_list) dans le second if.

      -La variable next dans la fonction add_to_list n'est pas utilisée.

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

      C# dev

      github.com/DavyWk

      1 réponse Dernière réponse
      0
      • AlexMogA Hors-ligne
        AlexMogA Hors-ligne
        AlexMog
        Modérateur spécialisé
        a écrit sur dernière édition par
        #3

        Choses que j'ai remarquer:

        -Il manque une parasynthèse dans la fonction add_to_list, après le sizeof(t_list) dans le second if.

        -La variable next dans la fonction add_to_list n'est pas utilisée.

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

        Réparé, merci pour l'info. Effectivement, j'ai tout codé directement sur Meli, donc j'ai pas pu tester ^^'

        Multiplayer GameDev @ Unexpected

        Mon CV

        1 réponse Dernière réponse
        0
        • AzadA Hors-ligne
          AzadA Hors-ligne
          Azad
          a écrit sur dernière édition par
          #4

          Merci du cours, c'est pratique la continuité linéraire des différents tutoriels.
          (Haaaan, Alex fait des fautes dans ces cours !)

          +1 rep 😉

          Administrateur du forum.

          Contactez-moi par message privé ou par mail.

          1 réponse Dernière réponse
          0
          • AlexMogA Hors-ligne
            AlexMogA Hors-ligne
            AlexMog
            Modérateur spécialisé
            a écrit sur dernière édition par
            #5

            EDIT: correction de quelques erreurs.

            Multiplayer GameDev @ Unexpected

            Mon CV

            1 réponse Dernière réponse
            0
            • AzadA Hors-ligne
              AzadA Hors-ligne
              Azad
              a écrit sur dernière édition par
              #6

              Thanks, lesquels ?

              Administrateur du forum.

              Contactez-moi par message privé ou par mail.

              1 réponse Dernière réponse
              0
              • AlexMogA Hors-ligne
                AlexMogA Hors-ligne
                AlexMog
                Modérateur spécialisé
                a écrit sur dernière édition par
                #7

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

                Multiplayer GameDev @ Unexpected

                Mon CV

                1 réponse Dernière réponse
                0

                Bonjour ! Vous semblez intéressé par cette conversation, mais vous n’avez pas encore de compte.

                Marre de refaire défiler les mêmes messages ? Créez un compte pour retrouver votre position, recevoir des notifications des nouvelles réponses, sauvegarder vos favoris et voter pour les messages que vous appréciez.

                Grâce à votre participation, ce message peut devenir encore meilleur 💗

                S'inscrire Se connecter
                Répondre
                • Répondre à l'aide d'un nouveau sujet
                Se connecter pour répondre
                • Du plus ancien au plus récent
                • Du plus récent au plus ancien
                • Les plus votés


                • Se connecter

                • Connectez-vous ou inscrivez-vous pour faire une recherche.
                Powered by NodeBB Contributors
                • Premier message
                  Dernier message
                0
                • Catégories
                • Récent
                • Mots-clés
                • Populaire
                • Web
                • Utilisateurs
                • Groupes