Insertion à la fin d'une liste chainée [Résolu/Fermé]

Signaler
Messages postés
85
Date d'inscription
samedi 12 avril 2008
Statut
Membre
Dernière intervention
1 avril 2016
-
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
-
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;
}

2 réponses

Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 646
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.
Messages postés
6
Date d'inscription
vendredi 6 janvier 2012
Statut
Membre
Dernière intervention
17 février 2014

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
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 646
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..