Probleme avec une pile en c ???

Probleme avec une pile en c ??? - C++ - Programmation

Marsh Posté le 03-01-2003 à 17:14:06    

Voila j'ai un gros problemes avec une pile en c, qui ne depile pas ...
mon source :  
 
typedef int Element;
 
typedef struct Cellule {
    Element valeur;
    Element pere;
    struct Cellule * suivant;
} Cellule, *PILE;
 
void empiler(PILE *pile, Element valeur, Element pere ){
    PILE Q;
    Q = (PILE)malloc(sizeof(Cellule));
    Q->suivant = *pile;
    Q->valeur = valeur;
    Q->pere = pere;
    *pile = Q;
}
 
void depiler(PILE *pile){
    pile = (*pile)->suivant;  
}
 
void testepile (PILE *pile) {
    printf ("Teste pile\n" );
    empiler (pile, 3, 4);
    printf ("Sommet pile : %d, %d\n", (*pile)->valeur, (*pile)->pere);
    empiler (pile, 4, 5);
    printf ("Sommet pile : %d, %d\n", (*pile)->valeur, (*pile)->pere);
    depiler (pile);
    printf ("Sommet pile : %d, %d\n", (*pile)->valeur, (*pile)->pere);
}
 
int main (int argc, char *argv[]) {
    PILE p;            // pile
    testepile(&p);
}

 
Tout se compile mais ça me donne comme affichage :
-->
Teste pile
Sommet pile : 3, 4
Sommet pile : 4, 5
Sommet pile : 4, 5
 
alors que je devrais avoir  
Teste pile
Sommet pile : 3, 4
Sommet pile : 4, 5
Sommet pile : 3, 4
 
Merci de m'aider un petit peu ...
 

Reply

Marsh Posté le 03-01-2003 à 17:14:06   

Reply

Marsh Posté le 03-01-2003 à 17:48:50    

arras a écrit :


void depiler(PILE *pile){
    pile = (*pile)->suivant;  
}


tu modifies une variable, mais localement au bloc de la fonction, ta pile n'est pas modifiée du tout.
 

Reply

Marsh Posté le 03-01-2003 à 17:50:12    

effectivement il faut rajouter un niveau d'indirection et ne pas non plus oublier de libérer


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 03-01-2003 à 17:52:23    

void depiler(PILE *pile){
   *pile = (*pile)->suivant;  
}

 
je viens d'essayer cela et ça semble marcher
vous pensez que c vraiment utile de rajouter un niveau d'interaction ? vu que c juste pour supprimer la dessus de la pile

Reply

Marsh Posté le 03-01-2003 à 17:58:41    

suivant ton programme il faut
 

Code :
  1. void depiler(PILE **pile)
  2. {
  3.   PILE *tmp=pile;
  4.   *pile = (*pile)->suivant;
  5.    free(tmp); 
  6. }


 
mais attention
 
tu devrais plutot préfere un autre type d'implémentation
ou une pile n'est pas un simple pointeur de cellule, mais un type à part entiere, genre
 

Code :
  1. typedef struct
  2. {
  3.   Cellule *premier;
  4.   // et pourquoi pas d'autres infos, comme la hauteur
  5. } PILE;
  6. void depiler(PILE *pile)
  7. {
  8.   if(pile->premier!=NULL)
  9.   {
  10.     Cellule *tmp=pile->premier;
  11.     pile->premier=pile->premier->suivant;
  12.     free(tmp);
  13.   }
  14. }


 
tout ça à compléter


Message édité par Taz@PPC le 03-01-2003 à 17:59:25

---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 03-01-2003 à 18:03:20    

oki je comprends mieux
 
merci de votre aide ;)  :hello:

Reply

Sujets relatifs:

Leave a Replay

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