IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

difficulté avec les listes chainées


Sujet :

C

  1. #1
    Membre actif
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 267
    Points
    267
    Par défaut difficulté avec les listes chainées
    bonsoir

    Je suis actuellement en phase d'apprentissage des listes chainées. Pour cela j'utilise le site d'Emmanuel Delahaye .

    http://emmanuel-delahaye.developpez....s_chainees.htm

    Je fais un petit blocage sur les fonctions de bases que sont affichages de la liste et ajout d'un element en fin de liste.

    ajout en fin
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    struct node *add_end (struct node *p_head, int value)
    {
       /* allocation du noeud */
       struct node *p_new = malloc (sizeof *p_new);
     
       /* si tout s'est bien passe : */
       if (p_new != NULL)
       {
          /* mise a jour des champs : */
     
          /* donnees */
          p_new->x = value;
     
          /* chainage par defaut */
          p_new->p_next = NULL;
     
          /* chainage */
          if (p_head == NULL)
          {
             /* c'est le premier : */
             p_head = p_new;
          }
          else
          {
             /* on cherche le dernier noeud */
             struct node *p = p_head;
     
             while (p->p_next != NULL)
             {
                /* pointer sur le suivant */
                p = p->p_next;
             }
     
             /* modification du chainage */
             p->p_next = p_new;
          }
       }
       return p_head;
    }

    affichage

    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 display (struct node *p_head)
    {
       struct node *p = p_head;
     
       while (p != NULL)
       {
          /* afficher les données courantes */
          printf ("%d > ", p->x);
     
          /* pointer sur le suivant */
          p = p->p_next;
       }
       /* afficher la fin */
       printf ("NIL\n");
    }
    Dans les deux fonctions on déclare un pointeur sur node et on lui affecte la liste pour la parcourir.

    Dans add_end on a ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     struct node *p = p_head;
     
             while (p->p_next != NULL)
             {
                /* pointer sur le suivant */
                p = p->p_next;
    ....
    et dans display on a

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct node *p = p_head;
     
     while (p != NULL)
       {
          /* afficher les données courantes */
          printf ("%d > ", p->x);
     
          /* pointer sur le suivant */
          p = p->p_next;
    La création du pointeur p est identique dans les deux fonctions mais la condition de parcours dans le while est différentes :s. Et je ne comprend pas trop pourquoi.


    Ensuite dans add_end on renvoie la liste passé en paramètre. hors dans le code on affecte au pointeur p la liste passée au paramètre puis on ajoute le nouvel élément au pointeur p. La fonction se termine avec le renvoie en valeur de la sortie du pointeur p_head. Comment le nouvel élément est affecté à la liste p_head ? Puisque celui-ci est rajouté au pointeur temporaire p :s.

    Je ne sais aps si je suis clair.

    En tout cas félicitation à l'auteur du site il est trés clair

    (j'ai juste du mal avec les files )

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Dans le premier cas (add_end), tu as besoin de garder le dernier pointeur dont l'élement next pointe sur NULL "while(p->next != NULL)" pour le faire chainer sur le nouveau element suivant (que tu viens de créer).

    Alors que dans le deuxième cas (display), tu t'en moques de l'élément next puisque tu ne veux rien ajouter donc la condition de fin n'est plus la même "while (p != NULL)"

  3. #3
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Citation Envoyé par sneb5757
    La création du pointeur p est identique dans les deux fonctions mais la condition de parcours dans le while est différentes :s. Et je ne comprend pas trop pourquoi.
    Lors de l'affichage on parcours toute la liste ( jusqu'au NULL ), avec l'ajout on s'arrête sur le dernier ( juste avant le NULL ) pour faire le chaînage.

    Citation Envoyé par sneb5757
    Ensuite dans add_end on renvoie la liste passé en paramètre. hors dans le code on affecte au pointeur p la liste passée au paramètre puis on ajoute le nouvel élément au pointeur p. La fonction se termine avec le renvoie en valeur de la sortie du pointeur p_head. Comment le nouvel élément est affecté à la liste p_head ? Puisque celui-ci est rajouté au pointeur temporaire p :s.
    En affectant p_head à p, les deux pointeurs pointent sur le même objet( ta liste ) que ces membres soient modifiés à travers p ou p_head c'est pareil. Il faut seulement garder à l'esprit qu'il ne faut pas perdre la tête de liste !

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par sneb5757 Voir le message
    La création du pointeur p est identique dans les deux fonctions mais la condition de parcours dans le while est différentes :s. Et je ne comprend pas trop pourquoi.
    Pour reformuler ce qu'ont dit mes camarades, dans le premier cas tu a besoin de parcourir la liste jusqu'à l'avant dernier élément (p->p_next != NULL) et pour l'affichage jusqu'au dernier élément (p!=NULL).

    Citation Envoyé par sneb5757 Voir le message
    Ensuite dans add_end on renvoie la liste passé en paramètre. hors dans le code on affecte au pointeur p la liste passée au paramètre puis on ajoute le nouvel élément au pointeur p. La fonction se termine avec le renvoie en valeur de la sortie du pointeur p_head. Comment le nouvel élément est affecté à la liste p_head ? Puisque celui-ci est rajouté au pointeur temporaire p :s.
    En gros, p_head est un pointeur sur une zone mémoire qui contient ta liste. En faisant struct node *p = p_head tu déclare un 'synonyme': p et p_head pointe sur les mêmes données en mémoire.

Discussions similaires

  1. Difficultés avec les Listes chaînées de classe
    Par Tyra3l dans le forum Langage
    Réponses: 4
    Dernier message: 13/01/2011, 18h07
  2. petit problème avec les listes chainées
    Par djinpark1 dans le forum Débuter
    Réponses: 4
    Dernier message: 30/06/2009, 17h11
  3. Pb avec les liste chainées
    Par Fahmi06 dans le forum C
    Réponses: 1
    Dernier message: 30/06/2009, 11h10
  4. programmation avec les listes chainées
    Par rufa11 dans le forum Gnome
    Réponses: 0
    Dernier message: 11/02/2009, 07h08
  5. Problème avec les listes chainées
    Par reeda dans le forum C++
    Réponses: 10
    Dernier message: 23/04/2008, 16h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo