Crée une liste chainé dans une fonction

carton99 Messages postés 103 Date d'inscription vendredi 29 janvier 2010 Statut Membre Dernière intervention 18 mars 2012 - 2 déc. 2009 à 17:55
carton99 Messages postés 103 Date d'inscription vendredi 29 janvier 2010 Statut Membre Dernière intervention 18 mars 2012 - 2 déc. 2009 à 22:13
Bonjour,
j'ai un probleme sur les listes , je doit absolument régler ce probleme car je doit faire une fonction récursive.

voila le code

Population mafonction(Population M)
{
Population trie_sup;
trie_sup=(Population*) malloc(sizeof(population));
Population temp;
temp=trie_sup;
int i=5;//peu importe c'est pour faire apparaitre le probleme
while(i>0)
{
i--;
trie_sup->valeur=1;
trie_sup=(population*) malloc(sizeof(population));
trie_sup=trie_sup->suivant;
}
trie_sup->valeur=1;
trie_sup->suivant=NULL;

trie_sup=temp;
return trie_sup;
}



Voila le code est juste la pour montrer mon probleme , je précise que je doit compiler sur ubuntu et il n'y a pas d'erreur .

le probleme c'est que en mon return devrai me renvoyer une liste avec 6 données .
Sauf que en réalité il ne m'en cré que un seul le premier , c'est comme si trie_sup=trie_sup->suivant n'avait aucun effet.

J'aimerai qu'on m'explique pourquoi sa marche pas ,et comment faire , surtout que si je ferai sa dans mon "main" le programme se comporterais corectement .

5 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
2 déc. 2009 à 18:05
// Remplace
trie_sup=(population*) malloc(sizeof(population)); 

// par
trie_sup->suivant=(population*) malloc(sizeof(population)); 
0
carton99 Messages postés 103 Date d'inscription vendredi 29 janvier 2010 Statut Membre Dernière intervention 18 mars 2012
2 déc. 2009 à 18:09
dsl en faite j'ai modifier mon code pour qu'il sois plus simple à lire en réalité j'aavai inversé la ligne que tu me demande de modifier.


Population mafonction(Population M)
{
Population trie_sup;
trie_sup=(Population*) malloc(sizeof(population));
Population temp;
temp=trie_sup;
int i=5;//peu importe c'est pour faire apparaitre le probleme
while(i>0)
{
i--;
trie_sup->valeur=1;
trie_sup=trie_sup->suivant;
trie_sup=(population*) malloc(sizeof(population));
}
trie_sup->valeur=1;
trie_sup->suivant=NULL;

trie_sup=temp;
return trie_sup;
}
0
carton99 Messages postés 103 Date d'inscription vendredi 29 janvier 2010 Statut Membre Dernière intervention 18 mars 2012
2 déc. 2009 à 18:33
oki merci pour la réponse .

Bon d'apres ce que j'ai compris pour crée un nouvel element on est obligé de respecter ce type de code:

trie_sup->suivant=(population*) malloc(sizeof(population));

et ce type de code est interdit , en tous cas ne marche pas :

trie_sup=trie_sup->suivant;
trie_sup=(population*) malloc(sizeof(population));
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
2 déc. 2009 à 20:39
Si tu fais "trie_sup=trie_sup->suivant;" sans faire de copie de trie_sup, "tu perds la tête", et forcément tu ne retourneras pas ce qu'il faut.

Je t'invite à lire ceci, qui est un cours sur les pointeurs + listes chaînées, avec explications, dessins et exemples en C.
http://0217021.free.fr/Cours/pointeurs.pdf
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
carton99 Messages postés 103 Date d'inscription vendredi 29 janvier 2010 Statut Membre Dernière intervention 18 mars 2012
2 déc. 2009 à 22:13
Non je stoke dès le début la valeur de tête.
Et ce que je voulai dire c'est que je trouve pas cette syntaxe tres pratique.
Enfait apres qq essai le probleme est récurent .Voici un exmeple simple:

while(maliste1!=NULL)
{
maliste1=maliste1->adresse_suivante;
}
maliste1=maliste2;
maliste1=tete_de_liste1;

NE FONCTIONNE PAS mais me parait le plus logique à programmé principalement pour gerer les cas spéciaux ex liste vide.

Par contre

while(maliste1->adresse_suivante->!=NULL)
{
maliste1=maliste1->adresse_suivante;
}
maliste1->adresse_suivante=maliste2;
maliste1=tete_de_liste1;

Fonctionne corectement mais plus dificile pour gérer les cas spéciaux
De toute facon je n'ai pas le choix
0
Rejoignez-nous