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 :

empiler depiler et afficher


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Par défaut empiler depiler et afficher
    salut
    j'ai un petit truc qui ne marche pas ,il s'agit d'empiler et dépiler une pile et en fie afficher :
    tout va bien sauf que lorsque j'empile plusieurs données et je les affiches ,je ne trouve que le derniers répéter plusieurs fois !
    voici le code complet :
    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
    #include<stdio.h>    
    #include<conio.h> 
    #include<stdlib.h>      
    typedef struct element 
                {
                           int donnee;
                           struct element *precedent;
                }maillon;
    typedef maillon* Pile;
    Pile empiler(Pile mapile,int donnee)
    {
    Pile      nv=(Pile)malloc(sizeof(maillon));
         nv->donnee=donnee;
         nv->precedent=mapile;//on fait pointer le precedent de ce nouveau sur le sommet
         mapile=nv;//et le sommet deveint le nv element;
         return mapile;
    }
    Pile depiler(Pile mapile)
    {
         if(mapile==NULL)
           {
                         printf("la pile est vide ");
                         return NULL;
           }
           if(mapile->precedent==NULL)
           {
                                      free(mapile);
                                      return NULL;
           }
     
     
         Pile nvSommet=mapile->precedent;//o fait stocker l'avant dernier dans une variable temporaire et puis on libert le sommet 
         free(mapile);
         return nvSommet;
    }
    void affichePile(Pile mapile)
    {
         if(mapile==NULL)
         printf("il y a rien à afficher ");
        else
        {
        Pile tmp=mapile;
     
            while(tmp!=NULL)
         {
                         printf("%d",mapile->donnee);
                         tmp=tmp->precedent;
         }
         }
    }
     
    int main()
    {
        Pile mapile=NULL;
        mapile=empiler(mapile,1);
        mapile=empiler(mapile,2); 
        mapile=empiler(mapile,3);
        mapile=empiler(mapile,4);   
        affichePile(Pile mapile)
     
    }
    sous le console j'ai 4444!!!

    merci de m'aider à trouver le problème

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Dans la fonction d'affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%d",tmp->donnee);

    Juste une suggestion. Ce genre d'écriture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mapile = empiler(mapile,1);
    mapile = empiler(mapile,2);
    (...)
    pourrait être optimisé.
    Modifier tes fonctions d'empilement et de dépilement pourrait te permettre d'alléger l'écriture. Lors du premier empilement, ta fonction d'empilement donne une valeur à "mapile". Lors des empilements suivants, elle continue ta liste chaînée, comme tu le fais, sans modifier "mapile".
    Lorsque tu dépiles, la fonction de dépilement effectue l'opération inverse. Si tu dépiles la seule valeur restante, la fonction te remet la valeur "mapile" à NULL.

    Du coup, pour empiler une valeur, il suffirait d'écrire simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    empiler(&mapile,1);
    empiler(&mapile,2);
    (...)
    Et pour dépiler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    depiler(&mapile);
    (...)
    Avec ce système, le passage en argument de l'adresse du pointeur est nécessaire afin que tes fonctions puissent modifier sa valeur "à distance", sinon cela serait impossible à faire.

    EDIT : modif explication

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Par défaut
    salut merci pour votre participation
    n'oubliez pas que "mapile" est un pointeur regardez la définition de maillon* .
    autre chose ,"empiler " et "depiler" ,toute les deux ,ont des retourne donc je dois absulment affecter leurs retournes à une variables de types "Pile".

    saviez vous d'où vient l'erreur?
    a+

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    saviez vous d'où vient l'erreur?
    jeroman t'a signalé l'erreur. Elle se situe dans la fonction d'affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            while(tmp!=NULL)
         {
                         printf("%d",tmp->donnee);
                         tmp=tmp->precedent;
         }

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Par défaut
    salut
    vraiment je ne vois pas d'erreurs !
    la fct affiche prend en argument "maplie" et tant qu'on a pas arrivé à la fin on affiche tmp->donnee.
    a+

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Relis ton code! tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            while(tmp!=NULL)
         {
                         printf("%d",mapile->donnee);
                         tmp=tmp->precedent;
         }
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            while(tmp!=NULL)
         {
                         printf("%d",tmp->donnee);
                         tmp=tmp->precedent;
         }

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

Discussions similaires

  1. [WD16] Afficher qu'une seule valeur sur un graphe empilé
    Par wojc01 dans le forum WinDev
    Réponses: 4
    Dernier message: 13/08/2011, 19h24
  2. Réponses: 1
    Dernier message: 26/04/2011, 14h04
  3. Réponses: 3
    Dernier message: 13/10/2010, 09h37
  4. comment ne pas afficher les zéro dans un diagramme à barres empilées
    Par sebastien84 dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 10/10/2007, 12h17

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