Problème listes chainées (débutant)

Problème listes chainées (débutant) - C - Programmation

Marsh Posté le 25-01-2009 à 16:24:30    

Bonjour,
 
je suis débutant et je fais un petit programme de listes chainées. J'ai un soucis ans la création de la liste. Lorsque j'insère un donnée, il semble qu'il n'y a pas d'erreur mais lorsque je mets ma fonction afficherListe dans le main, ça ne m'affiche pas ma liste alors que si je la mets dans ma fonction insérer, ben là pas de problème j'obtiens ce que je veux.
 
fichier liste.c

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "liste.h"
  4. int inserer(Liste l, int x){
  5. // création nouveau noeud
  6.    Noeud newNoeud = malloc(sizeof(Noeud));
  7.    if (newNoeud == NULL){
  8.       printf("L'allocation a échoué" );
  9.       exit(1);
  10.    }
  11.    else printf("Allocation OK\n" );
  12. // Assignation de valeur
  13.    newNoeud->n=x;
  14.    newNoeud->suivant=NULL;
  15. // Si c'est la première valeur de la liste
  16.    if(l == NULL)
  17.     {
  18.         l=newNoeud;
  19.     }
  20.     else
  21.     {
  22.         Noeud temp=l;
  23. // Positionnement au dernier noeud
  24.         while(temp->suivant != NULL)
  25.         {
  26.             temp = temp->suivant;
  27.         }
  28. // Ajout du nouveau noeud
  29.         temp->suivant = newNoeud;
  30.         l = temp;
  31.     }
  32.     //afficherListe(l);
  33.    return 0;
  34. }
  35. void afficherListe(Liste liste)
  36. {
  37.     Noeud tmp = liste;
  38.     /* Tant que l'on n'est pas au bout de la liste */
  39.     while(tmp != NULL)
  40.     {
  41.         /* On affiche */
  42.         printf("%d ", tmp->n);
  43.         /* On avance d'une case */
  44.         tmp = tmp->suivant;
  45.     }
  46. }


 
fichier main.c
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "liste.h"
  4. int main(int argc, char **argv)
  5. {
  6.     Liste ma_liste = NULL;
  7.     int i;
  8.     for(i=1;i<=10;i++)
  9.     {
  10.         ma_liste = inserer(ma_liste, i);
  11.     }
  12.     afficherListe(ma_liste);
  13.     //supprimerListe(ma_liste);
  14.     system("PAUSE" );
  15.     return 0;
  16. }


 
 
Merci d'avance.
 
Edit : désolé j'ai oublié le prototype avec la déclaration de ma struct
 

Code :
  1. typedef struct noeud*Noeud;
  2. typedef struct noeud
  3. {
  4.     int n;
  5.     Noeud suivant;
  6. }*Liste;
  7.    
  8. int inserer(Liste l, int x);
  9. void afficherListe(Liste liste);


Message édité par alpachinois le 25-01-2009 à 16:27:38
Reply

Marsh Posté le 25-01-2009 à 16:24:30   

Reply

Marsh Posté le 25-01-2009 à 17:04:29    

Tu passe en paramètre un Liste. Il faut lui passer un Liste* si tu veux que l'ajout fonctionne.
 
Au départ tu as un pointeur sur NULL;
Tu passe une copie de se pointeur a ta fonction ajout.
Tu le fais pointer sur un Noeud mais le pointeur initial est toujours à NULL tu ne modifie que sur quoi le pointeur copié pointe .
 
Si tu passes par un Noeud** tu modifiera bien ce sur quoi le pointeur de début de liste pointe
 
Personnellement je ne suis pas fana des typedef masquant des pointeurs comme avec ta Liste.  :)


Message édité par Anonymouse le 25-01-2009 à 17:15:53
Reply

Marsh Posté le 25-01-2009 à 17:18:07    

désolé je vois pas où ça change Liste étant juste un alias.
 
Et aussi j'ai pas le droit de changer la déclaration de la structure cardans ma consigne  :sweat: .

Message cité 1 fois
Message édité par alpachinois le 25-01-2009 à 17:19:56
Reply

Marsh Posté le 25-01-2009 à 18:24:46    

alpachinois a écrit :

désolé je vois pas où ça change Liste étant juste un alias.
 
Et aussi j'ai pas le droit de changer la déclaration de la structure cardans ma consigne  :sweat: .


 
T'as zapé la première partie de mon message? Passe un Liste*


Message édité par Anonymouse le 25-01-2009 à 18:25:19
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed