GNT sans publicité, site mobile, fonctionnalitées exclusives...

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.
Lire les 10 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Zouplaz
Le #585137
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?!?



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;
}

Pierre Maurette
Le #584886
"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?!?
Bonjour,

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

Stephane Legras-Decussy
Le #584885
"Pierre Maurette" dans le message de news: 403dedb5$0
typedef tNoeud* ptNoeud;


gasp...pourquoi cacher une jolie * par un ignoble "pt" ?

Pierre Maurette
Le #584884
"Stephane Legras-Decussy" <pas de mail @ pas de mail> a écrit dans le
message de news: 403df421$0$21655$

"Pierre Maurette" dans le message de news: 403dedb5$0
typedef tNoeud* ptNoeud;


gasp...pourquoi cacher une jolie * par un ignoble "pt" ?
Certes. Il est vrai que le ptNoeud n'est pas plus signifiant.

Il existe des situations dans lesquelles un typedef est indispensable, dans
le domaine des pointeurs de fonctions peut-être?
Pierre


Thoxmasx Betxtemxs
Le #584883
Merci pour la réponse!
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$
"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?!?
Bonjour,

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






Publicité
Suivre les réponses
Poster une réponse
Anonyme