Insertion à la fin d'une liste chainée

Résolu
Nowever Messages postés 88 Statut Membre -  
fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonsoir,

voila mon soucis c'est que j'essaie d'insérer un élément à la fin d'une liste chainée mon code ne marche pas je ne vois pas ou est l'erreur, c'est surement que j'ai mal compris le concept quelqu'un peut-il me corriger ou m'expliquer comment faire pour le corriger :) merci

void insertion(Liste *liste, int nvNombre)
{
   
    Element *nouveau = malloc(sizeof(*nouveau));

        while(nouveau->suivant!=NULL)
        {
            nouveau=nouveau->suivant;
        }
        nouveau->nombre=nvNombre;


    liste->premier = nouveau;
}


--
Cordialement Nowever.

2 réponses

  1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Bonjour,

    Déjà, cela dépend de la structure de données ?

    Sinon ton algorithme n'est pas bon.

    La logique est plutôt la suivante.
       Element *nouveau = malloc(sizeof(*nouveau));
    
       nouveau->suivant = NULL;
       nouveau->nombre=nvNombre;
       
       /*Tu te mets en fin de ta liste "liste", cela dépend de ta structure de données*/
       liste->suivant = nouveau;
    

    Il te reste juste à faire la partie qui est en commentaire.
    1
  2. sabirab2 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
     
    d'abord tu a passé la liste en parametre en valeur pas en adresse
    donc il faut la passer en adresse pour qu'il puisse se modifier à savoir

    void insertion(Liste *liste, int nvNombre)



    il faut pas modifier le nouveau element "nouveau" on doit utiliser un pointeur auxiliaire Liste *tmp;
    ainsi notre code apres une petite modefication :

    void insertion(Liste **liste, int nvNombre)
    {
        //creeation de l'element
        Liste *nouveau = malloc(sizeof(*nouveau));
        nouveau->suivant = NULL;
        nouveau->nombre=nvNombre;
        
         if(liste!=NULL)
         {
        //parcourir la liste
          Liste *tmp=liste;
            while(tmp->suivant!=NULL)
            {
                tmp=tmp->suivant;
            }
        tmp->suivant= nouveau;
      }
      else  liste=nouveau;
    }
    

    et finalement tu met RESOLU
    0
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Sabirab2
      d'abord tu a passé la liste en parametre en valeur pas en adresse
      Il passe déjà sa liste en adresse (usage de l'étoile dans le prototype)

      Si tu mets 2 étoiles comme tu as fait, il faut que le code correspondant soit cohérent (mettre des *liste) sinon tu modifies l'adresse de la liste..
      0