Lecture d'une pile en C

Résolu/Fermé
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 - 1 févr. 2009 à 20:41
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 - 1 févr. 2009 à 21:20
Bonsoir,

j'ai un code où j'ai crée une structure. Je rentre des données dans la pile et j'essaye de les afficher mais ça ne fonctionne pas l'affichage... Je pense que c'est quelque chose comme "fflush(stdin)" qu'il faut ou autre chose. Je poste ici mon code pour que vous y jetiez un coup d'œil...

===========>

#include <stdio.h>
#include <stdlib.h>
#define N 50

typedef struct liste
{
    char nom[N];
    char prenom[N];
    int age;
    struct liste *suivant;
}Liste;



int main()
{
    int choice=0, j, i;
    int  cpt=0, pos=0;
    char choix;
    Liste *pbase, *ptrav, *pbis;
    pbase=NULL;
    do
    {


        printf("\n==================MENU=====================\n");
        printf("-1- introduire les donnees de la pile\n");
        printf("-2- afficher les donnees de la pile\n");
        printf("-3- compteur de la pile\n");
        printf("-4- insertion apres le Neme element\n");
        printf("-5- insertion avant le Neme element\n");
        printf("votre choix===>");
        scanf("%d", &choice);
        switch (choice)
        {
        case 1 :

            printf("Introduire...O/N===>");
            scanf("%s", &choix);

            do
            {
                ptrav=malloc(sizeof(Liste));
                ptrav->suivant=pbase;
                pbase=ptrav;
                printf("nom : ");
                scanf("%s", &ptrav->nom[N]);
                printf("prenom : ");
                scanf("%s", &ptrav->prenom[N]);
                printf("age : ");
                scanf("%d", &ptrav->age);
                printf("Introduire...O/N===>");
                scanf("%s", &choix);

            }
            while (choix=='O');
            break;
        case 2 :

            ptrav=pbase;


            while (ptrav != NULL)
            {

                printf("%s\n", ptrav->nom);
                printf("%s\n", ptrav->prenom);
                printf("%d\n", ptrav->age);
                ptrav=ptrav->suivant;


            }
            break;
        case 3 :

            ptrav=pbase;

            while (ptrav != NULL)
            {
                ptrav=ptrav->suivant;
                cpt++;
            }

            printf("compteur = %d ", cpt);
            cpt=0;
            break;

        case 4 :
            ptrav=pbase;
            pbis=(Liste *)malloc(sizeof(Liste));
            printf("nom : ");
            scanf("%s", &pbis->nom[N]);
            printf("prenom : ");
            scanf("%s", &pbis->prenom[N]);
            printf("age : ");
            scanf("%d", &pbis->age);
            printf("position a inserer : ");
            scanf("%d", &pos);

            for (j=1;j<pos;j++)
                ptrav=ptrav->suivant;
            pbis->suivant=ptrav->suivant;
            ptrav->suivant=pbis;
            ptrav=pbase;
            break;
        case 5 :
            ptrav=pbase;
            pbis=(Liste *)malloc(sizeof(Liste));
            printf("nom : ");
            scanf("%s", &pbis->nom[N]);
            printf("prenom : ");
            scanf("%s", &pbis->prenom[N]);
            printf("age : ");
            scanf("%d", &pbis->age);
            printf("position a inserer : ");
            scanf("%d", &pos);

            if (pos==1)
            {
                pbis->suivant=pbase;
                pbase=pbis;
                ptrav=pbase;
            }
            else
            {
                for (i=1;i<pos-1;i++)
                    ptrav=ptrav->suivant;

                pbis->suivant=ptrav->suivant;
                ptrav->suivant=pbis;
                ptrav=pbase;
            }
            break;



        }

    }
    while (choice!=0);

    return 0;

}


Merci d'avance pour vos interventions...
A voir également:

6 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
1 févr. 2009 à 20:55
Salut,

            do
            {
                ptrav=malloc(sizeof(Liste));
                ptrav->suivant=pbase;
                pbase=ptrav;
                printf("nom : ");
                scanf("%s", ptrav->nom);
                getchar();
                printf("prenom : ");
                scanf("%s", ptrav->prenom);
                printf("age : ");
                scanf("%d", &ptrav->age);
                printf("Introduire...O/N===>");
                scanf("%s", &choix);

            }
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
1 févr. 2009 à 20:59
Re,

Je ne comprends pas
scanf("%s", &pbis->nom[N]);

nom c'est une chaîne de caractère et le nom c'est l'adresse du 1er pointeur donc pas besoin &
ensuite [N] on l'utilise pour la déclaration mais pas pour le scanf
0
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 140
1 févr. 2009 à 21:02
magnifique ça fonctionne...

Pourquoi???? Je ne comprend pas bien le getchar()

Merci d'avance...
0
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 140
1 févr. 2009 à 21:04
nom c'est une chaîne de caractère et le nom c'est l'adresse du 1er pointeur donc pas besoin &
ensuite [N] on l'utilise pour la déclaration mais pas pour le scanf 


oui exact, j'ai fait une grosse boulette!!!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
1 févr. 2009 à 21:11
Re,

En fait il faut t'imaginer ce qui se passe quand tu tapes au clavier
L'emplacement de getchar est plutôt après l'âge.

Par exemple, si tu tapes l'âge 10 et tu fais ENTRER, vu que ta variable lit l'entier il reste quand même le caractère '\n' qui est obtenu par l'action de la touche ENTRER.
Ce caractère il faut l'avaler pour qu'il ne soit pas lu par le prochain scanf.
0
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 140
1 févr. 2009 à 21:20
ok,

je pense avoir compris...Encore merci pour tes explications

Bonne soirée
0