Problème de pointeur et de piles
Bonjour tout le monde !
Pour m'entraîner à la programmation en C, j'ai voulu recoder une structure de type pile avec une bonne partie des fonctions associées. Mais il se trouve que j'ai un problème de modification de références que je ne m'explique pas : dans la fonction enleverElement je n'arrive pas à enlever un élément du haut de la pile. C'est comme si la ligne n'était pas interprétée (après compilation) par la machine 8O.
Je vous donne mon code :
Code:
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
|
#include <stdlib.h>
#include <stdio.h>
#include "main.h"
int main(void) {
int compte = 0;
int valeur = 0;
Pile *pile = creerPile(1);
Pile *element2 = (Pile*) malloc(sizeof(Pile));
Pile *element3 = (Pile*) malloc(sizeof(Pile));
element2->valeur = 2;
element2->element_precedent = NULL;
element3->valeur = 3;
element3->element_precedent = NULL;
printf("Adresse de la pile : %d\n", pile);
printf("Adresse de l'element 2 : %d\n", element2);
printf("Adresse de l'element 3 : %d\n\n\n", element3);
ajouterNouvelElement(pile, element2);
pile = element2;
printf("Adresse de l'ancienne pile (element 1) : %d\n", pile->element_precedent);
printf("Adresse de la nouvelle pile (element 2) : %d\n\n\n", pile);
ajouterNouvelElement(pile, element3);
pile = element3;
printf("Adresse de l'ancienne pile (element 2) : %d\n", pile->element_precedent);
printf("Adresse de la nouvelle pile (element 3) : %d\n\n\n", pile);
valeur = enleverElement(pile);
printf("Adresse de l'ancien element empile : %d\n", pile->element_precedent);
printf("Adresse du haut de la pile : %d\n", pile);
free(pile);
return 0;
}
Pile *creerPile(int valeur) {
Pile *nouveauPointeur = (Pile*) malloc(sizeof(Pile));
// Pile *nouveauPointeur; Fait planter le programme, mais pourquoi ?
nouveauPointeur->valeur = valeur;
nouveauPointeur->element_precedent = NULL;
return nouveauPointeur;
}
void ajouterNouvelElement(Pile *pile, Pile *nouvelElement) {
nouvelElement->element_precedent = pile;
}
int enleverElement(Pile *pile) {
if (pile == NULL) {
exit(EXIT_FAILURE);
}
int nombreDepile = 0;
if (pile != NULL && pile->element_precedent != NULL) {
nombreDepile = pile->valeur;
pile = pile->element_precedent;
printf("%d\n", pile);
}
return nombreDepile;
} |
Je pense que mon problème se situe au niveau de cette ligne :
Code:
pile = pile->element_precedent;
mais je ne comprends pas sa source car la logique me semble bonne.
Je vous donne le .h qui va bien (les #ifndef ne sont pas mis ici mais ils existent bien dans mon code) :
Code:
1 2 3 4 5 6 7 8 9 10
| typedef struct Pile Pile;
struct Pile {
int valeur;
struct Pile *element_precedent;
};
Pile *creerPile(int valeur);
void ajouterNouvelElement(Pile *pile, Pile *nouvelElement);
int enleverElement(Pile *pile); |
Sauriez-vous expliquer ce comportement ?
Merci