Ajout dynamique d'un élément dans une pile
Le
Thoxmasx Betxtemxs
Bonjour!
Je cherche désespérément à réaliser une fonction me permettant d'ajouter un
élément dans une pile dynamique.
Voici la déclaration de ma pile:
struct tsNoeud {
double Valeur;
struct tsNoeud *Suivant;
};
typedef struct tsNoeud tNoeud;
Et voici ma fonction permettant d'ajouter un élément dans ma pile:
void Ajouter_Element(tNoeud *Pile, double Val)
{
tNoeud *Nouveau_Noeud;
Nouveau_Noeud = (tNoeud *) malloc(sizeof(tNoeud));
Nouveau_Noeud->Valeur = Val;
Nouveau_Noeud->Suivant = Pile;
Pile = Nouveau_Noeud;
}
Mon problème est que ma valeur pile pointe effectivement sur Nouveau_Noeud,
mais, de retour dans le programme principal, ma pile passée en paramètre ne
pointe plus sur le nouvel élément?!?
Merci de votre aide
Thomas B.
Je cherche désespérément à réaliser une fonction me permettant d'ajouter un
élément dans une pile dynamique.
Voici la déclaration de ma pile:
struct tsNoeud {
double Valeur;
struct tsNoeud *Suivant;
};
typedef struct tsNoeud tNoeud;
Et voici ma fonction permettant d'ajouter un élément dans ma pile:
void Ajouter_Element(tNoeud *Pile, double Val)
{
tNoeud *Nouveau_Noeud;
Nouveau_Noeud = (tNoeud *) malloc(sizeof(tNoeud));
Nouveau_Noeud->Valeur = Val;
Nouveau_Noeud->Suivant = Pile;
Pile = Nouveau_Noeud;
}
Mon problème est que ma valeur pile pointe effectivement sur Nouveau_Noeud,
mais, de retour dans le programme principal, ma pile passée en paramètre ne
pointe plus sur le nouvel élément?!?
Merci de votre aide
Thomas B.

Poser une question


Tiens, pour une fois je vais peut être pouvoir être utile sans dire une
co**erie...
Je pense que ça vient du fait que *Pile est une variable locale dont le
contenu est perdu à la fin de la fonction.
Tu pourrais faire :
tNoeud *Ajouter_Element(tNoeud *Pile, double Val)
{
tNoeud *Nouveau_Noeud;
Nouveau_Noeud = (tNoeud *) malloc(sizeof(tNoeud));
Nouveau_Noeud->Valeur = Val;
Nouveau_Noeud->Suivant = Pile;
return Pile;
}
Je n'aurais peut-être pas fait de cette façon pour créer une pile, mais peu
importe.
Votre problème est simple: vous passez un pointeur vers le sommet de la pile
par valeur (C ne sait faire que ça), c'est à dire que vous passsez à la
fonction une copie de la VALEUR de ce pointeur, dans la variable LOCALE (ou
paramètre) Pile.
Deux solutions (pour ne régler que ce problème):
void Ajouter_Element(tNoeud **pPile, double Val)
{
tNoeud *Nouveau_Noeud;
Nouveau_Noeud = (tNoeud *) malloc(sizeof(tNoeud));
Nouveau_Noeud->Valeur = Val;
Nouveau_Noeud->Suivant = *pPile;
*pPile = Nouveau_Noeud;
}
ou alors:
tNoeud* Ajouter_Element(tNoeud *Pile, double Val)
{
tNoeud *Nouveau_Noeud;
Nouveau_Noeud = (tNoeud *) malloc(sizeof(tNoeud));
Nouveau_Noeud->Valeur = Val;
Nouveau_Noeud->Suivant = Pile;
return Nouveau_Noeud;
}
Dans les deux cas, vous pourriez définir quleques types pointeurs, genre :
typedef tNoeud* ptNoeud;
Pierre
gasp...pourquoi cacher une jolie * par un ignoble "pt" ?
message de news: 403df421$0$21655$
Il existe des situations dans lesquelles un typedef est indispensable, dans
le domaine des pointeurs de fonctions peut-être?
Pierre
En effet, cette version:
void Ajouter_Element(tNoeud **pPile, double Val)
{
tNoeud *Nouveau_Noeud;
Nouveau_Noeud = (tNoeud *) malloc(sizeof(tNoeud));
Nouveau_Noeud->Valeur = Val;
Nouveau_Noeud->Suivant = *pPile;
*pPile = Nouveau_Noeud;
}
fonctionne très bien. Je dois juste utiliser la syntaxe suivante pour
l'appeler:
Ajouter_Element(&MaPile,MaValeur );
Je trouve que cette solution est un peu plus esthétique que l'autre, non?
Thomas B.
"Pierre Maurette" dans le message de news:403dedb5$0$21675$