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 :

Liste chainée: Fonction d'affichage


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 17
    Points : 5
    Points
    5
    Par défaut Liste chainée: Fonction d'affichage
    Bonjour à tous et à toutes,

    alors j'expose vite fait mon probleme...

    je suis entrain d'écrire un programme dans lequel j'ai besoin d'une liste chainée, j'ai ecrit la structure, puis la fonction qui insert un element en queue de liste, mais je n'arrive pas à faire son affichage ...

    Je voulais savoir, si quelqu'un pouvait gentillement m'indiquer ce qui ne va pas dans mes fonctions.

    Voilà ma structure et les fonctions décrites ci dessus:

    //La structure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct sliste
    {
      int v;
      struct sliste *s;
    }Sliste, *Liste;
    //Fonction d'insertion

    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
     
    Liste insertion(Liste l, int v)
    {
      Liste l1=(Sliste*)malloc(sizeof(Sliste));
      l1->v=v;
      l1->s=NULL;
     
      if(l==NULL)
       return l1;
      else
      {
        (l->s)=l1;
        return l;
      }
    }
    //Fonction d'affichage (qui marche pas)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void afficheliste(Liste l)
    {
      Liste l1=(Sliste*)malloc(sizeof(Sliste));
      l1=l;
     
     while(l1 != NULL)
     {
         printf("%d \n", l1->v);
         l1 = l1->s;
     }
     
    printf("\n\n");
    }
    Merci à vous.

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Personne pour m'aider

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Tu peux faire comme celà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    oid afficheliste(Liste l)
    {
     
     while(l != NULL)
     {
         printf("%d \n", l->v);
         l = l->s;
     }
     
    printf("\n\n");
    }
    Tout simplement.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Merci pour ta reponse, mais ça marche pas , il m'affiche que le 1element en boucle, il y'a peut etre une erreur ailleurs? dans ma fonction insertion ???

    Pourrais tu y jeter un oeil STP ???

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par mayalabeille
    je suis entrain d'écrire un programme dans lequel j'ai besoin d'une liste chainée, j'ai ecrit la structure, puis la fonction qui insert un element en queue de liste, mais je n'arrive pas à faire son affichage
    'insérer en queue de liste', est une façon compliquée de dire 'ajouter' 'ou ajouter à la fin' si le terme est ambigu...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct sliste
    {
      int v;
      struct sliste *s;
    }Sliste, *Liste;
    OK, mais s est peu clair (en général, on met 'next' ou 'p_next')
    'Liste' est confusant. Soit on s'en passe (Sliste suffit, mais node_s est encore mieux...), soit on indique au moins que c'est un type pointeur (PListe ou Pnode)
    //Fonction d'insertion
    C'est pas bon. L'ajout se fin à la fin. Il faut donc parcourir la liste, trouver la fin et accrocher le nouveau noeud au dernier. Tu n'as pas compris comment fonctionnait les listes.
    //Fonction d'affichage (qui marche pas)
    Tu affectes une valeur différente 2 fois dans une variable sans l'avoir lue entre les deux. Il y a donc forcément une fois de trop.

    Je te conseille de simplifier et de clarifier tout ça. Pour un bon usage de malloc() :

    http://emmanuel-delahaye.developpez....tes.htm#malloc

    Je travaille sur cet article cet après midi :

    http://emmanuel-delahaye.developpez....s_chainees.htm
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Déjà, tu seras gentil de laisser un peu plus de temps aux gens pour te répondre... parce que 10 minutes entre la question et le fait que tu t'impatiente, ca fait court

    Ensuite, il y a, déjà, un probmème au niveau de ton insertion d'élément...

    La regle de base est "pour toute tentative d'allocation dynamique de la mémoire, il faut s'assurer qu'elle a réussi avant de continuer"... regle que tu ne respecte absolument pas

    Ta fonction d'insertion devrait donc devenir
    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
     
    Liste insertion(Liste l, int v)
    {
      /* ED- le cast sur retour des fonctions *alloc n'est pas nécessaire */
      Liste l1=malloc(sizeof(Sliste));
     
      /* ED -- tu ne peux initialiser les valeurs de l1 que si l'allocation a
         réussit */
      if(l1!=NULL)
      {
          l1->v=v;
          l1->s=NULL;
      }
      /* ED -- au niveau de l'insertion, il faudrait que tu réfléchisse un peu
         à ce qui est passé comme parametre l...
         deux solutions: il pointe déjà sur le dernier élément de la liste
                         ou il pointe sur le premier élément de la liste
         quoi qu'il en soit, on dirait que tu as fait une soupe avec les deux :P
         je vais donc considérer qu'il pointe sur le premier élément de la liste ;)
       */
     
      /* il faut trouver le dernier élément de la liste si elle n'est pas vide */
      if(l!=NULL)
      {
          Liste dernier=l;
          while(dernier->s!=NULL)
              dernier=dernier->s;
          dernier->s=l1;
      }
      else
      {
           l=l1;/* sinon le début devient l'élément créé */
      }
      return l;
    }
    Maintenant, on peut envisager sereinement d'afficher le contenu de la liste
    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
     
    void Affiche(Liste l)
    {
        /* la liste est peut etre vide... */
        if(l==NULL)
            printf("la liste est vide\n");/* si c'est le cas, on le signale :D */
        else
        {
            /* sinon, on parcoure l'ensemble de la liste pour afficher
               son contenu */
            int cpt=1;/* un petit compteur pour la frime :D */
            while(l!=NULL)
            {
                printf("element %d,%d \n",cpt,l->v);
                ++cpt;/* on incremente le compteur */
                l=l->s;/* et on passe à l'élément suivant */
            }
        }
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    A: Emmanuel Delahaye

    Merci pour tes remarques, mais pour la structure, j'ai simplement repris les structures données par le prof (donc c'est lui qu'il faut réprimander ).

    Bon je te commente la partie "insertion en queue" telle que je la vois, il serait gentil de me corriger ou de m'expliquer si je comprends mal un truc.


    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
     
    Liste insertion(Liste l, int v)
    {
      Liste l1=(Sliste*)malloc(sizeof(Sliste)); //Allocation d'un nouveau chainon  
      l1->v=v;  // affectation de v dans le champ valeur 
      l1->s=NULL; // dire que l'element pointée par la structure sera nul
     
      if(l==NULL)  // Si la liste est vide
       return l1;  // je renvoie simplement le chainon
      else
      {
        (l->s)=l1;  // sinon je dis que l'element pointé par la structure de l est notre chainon
        return l;  
      }
    }
    Merci encore

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Merci koala01

    je te suis vraiment reconnaissante, tu m'as fait une bonne explication, car en cours nous avons vu les listes chainée circulaire, j'ai du faire un melange des deux !

    en tous cas merci beaucoup d'avoir pirs le temps de mettre les commentaires et de corriger mes erreurs. tu es

    Milles mercis encore, je teste ça de suite.

    MERCI MERCI

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    CA MARCHE !!!!!!!!!!

    Je tiens à remercier chacun d'entre vous pour les reponses apportées, une merci tout particulier à Koala01 , grace à qui j'ai pu enfin debugger mon programme...

    Merci à tous.

  10. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par mayalabeille
    A: Emmanuel Delahaye

    Merci pour tes remarques, mais pour la structure, j'ai simplement repris les structures données par le prof (donc c'est lui qu'il faut réprimander ).
    (snip)
    Il a bon dos, le prof...

    Je suis d'accord qu'il y en a qui disent n'importe quoi, mais l'excue est peut etre un peu facile

    Je te suis vraiment reconnaissante, tu m'as fait une bonne explication, car en cours nous avons vu les listes chainée circulaire, j'ai du faire un melange des deux !
    Et pourtant, une liste circulaire n'est qu'une liste "qui se bouffe la queue"... et, l'erreur est d'autant plus grave que, pour autoriser la gestion d'une liste circulaire, le code correct serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    l1->s=l->s;/* l'élément qui suit celui qu'on incere est celui qui suit
                * celui apres lequel l'élément est inséré 
                */
    l->s=l1;/* l'élément inséré devient l'élément qui suit notre élément de
             * référence
             */
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. listes chainés ( fonction supprimer)
    Par rockkornman dans le forum C
    Réponses: 4
    Dernier message: 13/05/2009, 11h24
  2. Listes Chainées probleme d'affichage
    Par reapa dans le forum C
    Réponses: 2
    Dernier message: 11/07/2008, 02h38
  3. fonction de recherche dans une liste chainée
    Par seifvai dans le forum C
    Réponses: 10
    Dernier message: 23/12/2007, 10h35
  4. Réponses: 10
    Dernier message: 08/12/2006, 02h18
  5. Réponses: 1
    Dernier message: 16/06/2006, 16h12

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