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 :

probleme affichage d'une liste à simple chainage


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de thaundeadboss
    Homme Profil pro
    Développeur COBOL & JAVA
    Inscrit en
    Février 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur COBOL & JAVA
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 211
    Par défaut probleme affichage d'une liste à simple chainage
    salut à tous j'ai un problème d'affichage d'une liste chainée l'insertion ça marche mais l'affichage n'affiche que le dernier élément saisie et ça plante voici le code:
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    typedef struct etudiant etudiant;
    struct etudiant{
           int code;
           char nom[30];
           char prenom[20];
           float note[4];
           char cours[4][20];
           float moy;
           etudiant *suivant;
           };
    etudiant *debut=NULL;
    etudiant *fin=NULL;
    int id=0;
     
    void saisieinserer(){
         etudiant *e;
         e=(etudiant *)malloc(sizeof(etudiant));
         e->code=id+1;
         printf("Entrer le nom de l'etudiant: ");
         scanf("%s",e->nom);
         printf("Entrer le prenom de l'etudiant: ");
         scanf("%s",e->prenom);
         for(int i=0;i<4;i++)
         {printf("Entrer le cours numero %d:  ",i);
         scanf("%s",e->cours[i]);
                 }  
     
         if(debut==NULL)
         {debut=e;
          fin=e;
         }
         else{e->suivant=debut;
              debut=e;
              }
    }
     
    void afficher(){
         etudiant *e;
         e=(etudiant *)malloc(sizeof(etudiant));
         if(debut==NULL)
         {printf("La liste est vide");}
         else{e=debut;
              while(e!=fin){
                                     printf("%d\n",e->code);
                                     printf("%s\n",e->nom);
                                     printf("%s\n",e->prenom);
                                     for(int i=0;i<4;i++)
                                     printf("--%s\n",e->cours[i]);
                                     e=e->suivant;
              }
         }
         }
     
     
    main(){
           saisieinserer();
           printf("-------------------");
           //afficher();
           saisieinserer();
           printf("-------------------");
           afficher();
           getch();
           return 0;
           }

  2. #2
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    142
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 142
    Par défaut
    Bonsoir,

    Premiere chose que je constaste :
    En C il n'est pas possible d'utiliser un compteur local à la boucle.
    Par contre en C++ c'est tout à fait possible.

    Deuxièment chose, je ne connais pas le but et la finalité de ton programme, mais mettre une liste chaînée en global est fortement déconseillé et très dangereux !

    Ensuite dans ta fonction affiché tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    etudiant *e;
    e=(etudiant *)malloc(sizeof(etudiant));
    Pourquoi réservé un espace mémoire pour un pointeur courant censé parcourir la liste et donc de pointer vers différente zone mémoire de ta liste ?

    Puis, Ton insertion n'est pas du tout correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if(debut==NULL)
    	{
    		debut=e;
    		fin=e;
    	}
    	else
    	{
    		e->suivant=debut;
    		debut=e;
    	}
    Avec ceci, voila ce que tu fait : si la liste est vide, alors début pointe vers ta nouvelle cellule et fin aussi ! Jusque la tout va bien.
    Puis vien ton else, ou tu fait dans le cas ou la liste ne serai vide : le pointeur suivante de ta cellule pointe vers debut et debut pointe vers le nouvelle element a insérer !
    Pour faire simple tu fait une liste circulaire sur un unique élément et en l'occurence le derniere element que tu veux insérer !
    Le pointeur Fin n'est jamais mis à jours ?!

    Puis dernière chose qui se révèle logique dans ta fonction afficher() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    e=debut;
    		while(e!=fin)
    		{
    			printf("%d\n",e->code);
    			printf("%s\n",e->nom);
    			printf("%s\n",e->prenom);
    			for( i=0;i<4;i++)
    			printf("--%s\n",e->cours[i]);
    			e=e->suivant;
    		}
    Ici l'idée est bonne, mais tu ne met jamais a jour le pointeur fin qui pointe toujours vers debut !
    Donc voila pourquoi tu obtient a l'affichage le dernier element insérer.

    Apres la solution, dépend du faite que tu veuille une liste circulaire ou non.

  3. #3
    Membre émérite
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Par défaut
    Bonjour,

    Citation Envoyé par FunK92 Voir le message
    Bonsoir,

    Premiere chose que je constaste :
    En C il n'est pas possible d'utiliser un compteur local à la boucle.
    Par contre en C++ c'est tout à fait possible.
    C'est possible en C99 aussi.

    Citation Envoyé par FunK92 Voir le message
    Deuxièment chose, je ne connais pas le but et la finalité de ton programme, mais mettre une liste chaînée est fortement déconseillé et très dangereux !


    Citation Envoyé par FunK92 Voir le message
    Avec ceci, voila ce que tu fait : si la liste est vide, alors début pointe vers ta nouvelle cellule et fin aussi ! Jusque la tout va bien.
    Puis vien ton else, ou tu fait dans le cas ou la liste ne serai vide : le pointeur suivante de ta cellule pointe vers debut et debut pointe vers le nouvelle element a insérer !
    Pour faire simple tu fait une liste circulaire sur un unique élément et en l'occurence le derniere element que tu veux insérer !
    C'est une pile qu'il fait, pas une liste circulaire. Le dernier element ajoute (le haut de la pile) pointe vers lui meme, le premier element (le bas de la pile) pointe vers NULL.

    Citation Envoyé par thaundeadboss Voir le message
    salut à tous j'ai un problème d'affichage d'une liste chainée l'insertion ça marche mais l'affichage n'affiche que le dernier élément saisie et ça plante voici le code:
    Ca ne plante pas, il y a juste un petit probleme de logique dans ton code
    Le probleme vient du pointeur fin comme te l'a fait remarque funk92. Il n'est jamais mis a jour, et meme mieux il est completement inutile. Voila comment je ferais (avec quelques remarques en commentaires):

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #include <stdio.h>
    // #include <conio.h>
    #include <stdlib.h>
    typedef struct etudiant etudiant;
    struct etudiant{
        int code;
        char nom[30];
        char prenom[20];
        float note[4];
        char cours[4][20];
        float moy;
        etudiant *suivant;
    };
    etudiant *debut=NULL;
    int id=0;
     
    void saisieinserer(){
        etudiant *e;
        e=malloc(sizeof(etudiant)); //cast du malloc inutile
        e->code=id+1;
        printf("Entrer le nom de l'etudiant: ");
        scanf("%s",e->nom); // attention au buffer overflow!!!
        printf("Entrer le prenom de l'etudiant: ");
        scanf("%s",e->prenom); // attention au buffer overflow!!!
        for(int i=0;i<4;i++) {
            printf("Entrer le cours numero %d:  ",i);
            scanf("%s",e->cours[i]); // attention au buffer overflow!!!
        } 
     
        if(debut==NULL) {
            debut=e;
        }
        else {
            e->suivant=debut;
            debut=e;
        }
    }
     
    void afficher(){
        etudiant *e;
        if(debut==NULL) {
            printf("La liste est vide");
        }
        else {
            e=debut;
            for (e = debut; e != NULL; e = e->suivant) {
                printf("%d\n",e->code);
                printf("%s\n",e->nom);
                printf("%s\n",e->prenom);
                for(int i=0;i<4;i++)
                    printf("--%s\n",e->cours[i]);
            }
        }
    }
     
     
    int main(){ // mettre un type a main
        saisieinserer();
        printf("-------------------\n"); // \n c'est plus joli ;-)
        saisieinserer(); // tu vas ecrire 30 fois cette ligne si tu as 30 eleves?
        printf("-------------------\n");
        afficher();
        // getch();
        return 0;
    }
    J'ai aussi commente conio.h et getch parce que je ne peux pas les utiliser mais tels quels ils ne servent a rien dans ton progamme. Attention ce n'est pas portable (a toi de voir si tu veux vraiment conio).

    Je te conseille de lire ca http://emmanuel-delahaye.developpez.com/inputs.htm pour tes entrees.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par FunK92 Voir le message
    Ton insertion n'est pas du tout correct :
    En fait, elle se fait en tête. Est-ce voulu ou non, on en sait rien.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par thaundeadboss Voir le message
    salut à tous j'ai un problème d'affichage d'une liste chainée l'insertion ça marche mais l'affichage n'affiche que le dernier élément saisie et ça plante voici le code:
    Ton code est illisible.
    Il n'y a absolument pas besoin de globales, ni de malloc() dans 'afficher()'...

    Ceci fonctionne :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    #include<stdio.h>
    #include<stdlib.h>
     
    #define NB_COURS 4
     
    typedef struct etudiant etudiant;
    struct etudiant
    {
       /* donnees */
       int code;
       char nom[30];
       char prenom[20];
       float note[NB_COURS];
       char cours[NB_COURS][20];
       float moy;
     
       /* chainage */
       etudiant *suivant;
    };
     
    struct liste
    {
       etudiant *debut;
       etudiant *fin;
       int id;
    };
     
    void saisieinserer (struct liste *p)
    {
       etudiant *e = malloc (sizeof *e);
       if (e != NULL)
       {
          {
             static const etudiant z = { 0 };
             *e = z;
          }
          e->code = p->id + 1;
     
          printf ("Entrer le nom de l'etudiant: ");
          scanf ("%s", e->nom);
     
          printf ("Entrer le prenom de l'etudiant: ");
          scanf ("%s", e->prenom);
     
          {
             int i;
             for (i = 0; i < NB_COURS; i++)
             {
                printf ("Entrer le cours numero %d/%d:  ", i + 1, NB_COURS);
                scanf ("%s", e->cours[i]);
             }
          }
     
          if (p->debut == NULL)
          {
             p->debut = e;
             p->fin = e;
          }
          else
          {
             /* insertion en tete */
             e->suivant = p->debut;
             p->debut = e;
          }
       }
    }
     
    void afficher (struct liste const *p)
    {
       if (p->debut == NULL)
       {
          printf ("La liste est vide\n");
       }
       else
       {
          etudiant *e = p->debut;
          do
          {
             printf ("%d\n", e->code);
             printf ("%s\n", e->nom);
             printf ("%s\n", e->prenom);
             {
                int i;
                for (i = 0; i < 4; i++)
                   printf ("--%s\n", e->cours[i]);
             }
             e = e->suivant;
          }
          while (e != NULL);
          printf ("-------------------\n");
       }
    }
     
    int main (void)
    {
       struct liste liste = { 0 };
     
       saisieinserer (&liste);
       afficher (&liste);
     
       saisieinserer (&liste);
       afficher (&liste);
     
       return 0;
    }
    Mais les saisies ne sont pas du tout sécurisées...

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

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

Discussions similaires

  1. probleme affichage d'une liste
    Par riadhhwajdii dans le forum JSF
    Réponses: 8
    Dernier message: 21/08/2009, 12h43
  2. probleme d'affichage d'une liste dans une jsp
    Par the_first_001 dans le forum Struts 1
    Réponses: 5
    Dernier message: 20/04/2009, 14h44
  3. Réponses: 2
    Dernier message: 19/02/2008, 11h42
  4. probleme d'affichage d'une liste
    Par ypoupou dans le forum Struts 1
    Réponses: 6
    Dernier message: 28/01/2008, 09h52
  5. probleme affichage d'une liste
    Par kespy13 dans le forum SL & STL
    Réponses: 2
    Dernier message: 07/10/2007, 15h29

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