Liste chainée passée en paramètre

tdaouas Messages postés 27 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 23 octobre 2017 - 2 août 2009 à 00:23
tdaouas Messages postés 27 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 23 octobre 2017 - 3 août 2009 à 10:16
J'ai écrit un petit programme qui appelle une procédure qui ajoute des éléments à une liste chainée simple. Mon problème c'est que la liste n'est pas modifiée et à chaque appel de la procédure je trouve la liste vide. Ci-dessous mon programme. Si quelqu'un peut m'aider à voir où se trouve le problème!

**********************************
#include <stdio.h>
#include <stdlib.h>

typedef struct noeud noeud;
struct noeud
{
int info;
struct noeud *suivant;
};

typedef noeud* ptNoeud;

char c;

void ajouter_liste (noeud *tete, int x){
noeud * p;
noeud * p1;

p = tete;
if (p==NULL) {
printf("Tete de la liste");
tete= malloc(sizeof(noeud));
tete->info = x ;
tete->suivant = NULL;

printf("%s%d%s\n","Ajout de ", x, " à la tête");
}
else {
printf("%s%d%s\n","Ajout de ", x, " à la liste");
while (p->suivant != NULL)
{
p = p->suivant ;
}
p1=malloc(sizeof(noeud));;
p1->info = x ;
p1->suivant = NULL ;
p->suivant = p1;
}
}
int main()
{
int v;
ptNoeud q = NULL;

ajouter_liste (q, 3) ;
ajouter_liste (q, 6) ;
ajouter_liste (q, 1) ;
ajouter_liste (q, 2);
printf("%s","Taper un caractère pour continuer...");
scanf("%s", &c);
return 0;
}
***************************************************

No dejes para mañana lo que puedes hacer hoy

2 réponses

TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
2 août 2009 à 09:52
Salut,

C'est tout à fait normal, c'est une histoire de portée des variable. Dans le main tu initialise ta variable q à NULL, or rien ne la modifie et son adresse n'est jamais passée afin qu'elle soit modifiée par effet de bord. Bref, deux solutions :
- Soit tu passe l'adresse de ton pointeur à ta fonction d'ajout. C'est très moche les effets de bords saiLEmal.
- Soit tu fait retourner a ta fonction d'ajout le pointeur vers le début de la liste. De cette manière, si tu lui passe NULL elle vas te retourner l'adresse du nouvel elle, sinon elle retourne ce qu'on lui a passé comme tête.

Un exemple de fonctions de manipulation de listes chaînées est disponible ici :
http://www.cppfrance.com/forum/sujet-AJOUT-ELEMENT-FIN-LISTE-CHAINEE_1302592.aspx
0
tdaouas Messages postés 27 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 23 octobre 2017
3 août 2009 à 10:16
Merci, oui je crois que le fait de faire une procédure d'ajout ne me laisse pas la possibilité de retourner quoi que ce soit, je vais donc transformer ma procédure en fonction qui retourne la tête de la liste.

*************************************
No dejes para mañana lo que puedes hacer hoy
0
Rejoignez-nous