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 .
Je vous donne mon code :
Je pense que mon problème se situe au niveau de cette ligne :
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 #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; }
mais je ne comprends pas sa source car la logique me semble bonne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part pile = pile->element_precedent;
Je vous donne le .h qui va bien (les #ifndef ne sont pas mis ici mais ils existent bien dans mon code) :
Sauriez-vous expliquer ce comportement ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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);
Merci
Partager