Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Les listes simplement chaînées en C


Sujet :

C

  1. #1
    Rédacteur

    Les listes simplement chaînées en C
    http://nicolasj.developpez.com/artic...s/listesimple/

    Les structures de données en C.

    Première partie : les listes simplement chaînées.
    Vous pouvez laisser un commentaire sur cet article à la suite.

  2. #2
    Rédacteur

    Citation Envoyé par Klodo
    Il y a peu de commentaires positifs, donc je m'y colle : super boulot ! C'est génial de trouver ce genre de tutoriels !
    Merci.

  3. #3
    Futur Membre du Club
    Merci pour ce boulot, qui m'a bien aidé.

  4. #4
    Membre à l'essai
    Il n'est pas evident de trouver de bons cours sur les listes chainees.

    Merci beaucoup a l'auteur

  5. #5
    Membre à l'essai
    Bonjour,

    Un grand merci pour ce tutoriel.

    Je me pose les questions suivantes :

    1) Pourquoi certains pointeurs ne commence pas par p_ dans les structures ? En fait il n y a que p_start qui commence par ce préfixe

    2) J'ai du mal à comprendre le code suivant :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    p_sll->p_start->next = p_n;


    Ne saute t on pas l’élément de type item_s créé par sll_new (p_l)

    Pour moi p_start->next signifie que p_l->next pointe sur p_n. Donc p_l->data est toujours NULL ?

    Merci d'avance.

    El_condor

  6. #6
    Inactif
    oui c parfait
    Oui, je trouve ce tuto très bien pour les listes chaînées.
    Les images sont bien claires, le texte est suffisant et le code est bien détaillé.
    under construction...

  7. #7
    Invité
    Invité(e)
    Bonjour,

    c'est un bon tutoriel mais les fonctions de suppression proposées entrainent un risque de fuite mémoire, puisque les données stockées ne sont jamais libérées. Un petit pointeur sur fonction ?

    Par ailleurs, je profiterais de la structure sll_s pour stocker la taille de la liste et un pointeur sur le dernier élement, afin d'éviter d'avoir à la parcourir en entier.

  8. #8
    Membre à l'essai
    c'est un bon tutoriel mais les fonctions de suppression proposées entrainent un risque de fuite mémoire, puisque les données stockées ne sont jamais libérées. Un petit pointeur sur fonction ?
    Lorsque l'on libère un pointeur sur une chaine, ne libère t on pas tout l'ensemble ?

    Deuxième remarque :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void sll_delete (sll_s ** pp_sll)
    {
       if (pp_sll && *pp_sll)
       {
          sll_first (*pp_sll);
     
          while ((*pp_sll)->list->next != NULL)
          {
             sll_removeNext (*pp_sll);
          }
          sll_removeFirst (*pp_sll);
          free ((*pp_sll)->list);
          (*pp_sll)->list = NULL;
          free (*pp_sll), *pp_sll = NULL;
       }
    }


    Il manque une condition. En effet, si la liste vient d'être créée, alors (*pp_sll)->list->next != NULL ne peut être verifié car list = null.

    En effet :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    sll_s *sll_new (void)
    {
       sll_s *p_sll = malloc (sizeof *p_sll);
    
       if (p_sll)
       {
          item_s *p_l = malloc (sizeof *p_l);
    
          if (p_l)
          {
             p_l->data = NULL;
             p_l->next = NULL;
    
             p_sll->p_start = p_l;
             p_sll->list = NULL;
          }
          else
          {
             fprintf (stderr, "Memoire insufisante\n");
             exit (EXIT_FAILURE);
          }
       }
       else
       {
          fprintf (stderr, "Memoire insufisante\n");
          exit (EXIT_FAILURE);
       }
       return p_sll;
    }


    Il faut alors rajouter la condition suivante :

    if((*pp_sll)->p_list != NULL) avant le while.

    J'en ai fait l’expérience tout à l'heure en voulant créer un répertoire.

    Cordialement

    El_condor