Programmation liste chainées

Fermé
shinn Messages postés 47 Date d'inscription lundi 14 avril 2008 Statut Membre Dernière intervention 8 décembre 2010 - Modifié par shinn le 9/12/2010 à 01:20
lucieb31 Messages postés 345 Date d'inscription mercredi 14 janvier 2009 Statut Membre Dernière intervention 28 juillet 2012 - 9 déc. 2010 à 11:44
Bonjour,

Je sollicite votre aide pour m'aider à réaliser une liste chaînée ordonnée. Chaque participant se voit octroyer un temps, et c'est en fonction de ce temps que je doit ordonner la liste.

voilà le programme que j'ai fait :

if (tmp != 0 && strcmp(ntmp,"0")!=0)
{
/*********************CREATION LISTE DES QUALIFIES********************/

/******* Insertion entête *******/
if (p1==NULL)
{
printf("\nje suis a la creation d'entete liste 1\n");
p1=(struct Skieur *) malloc (sizeof (struct Skieur));

premier=p1;
strcpy(p1->name,ntmp);
printf("\nle nom est : %s\n",p1->name);
p1->tp1=tmp;
p1->suivant=NULL;
}

else
{

/******** Insertion des elements dans la liste***********/
printf("\nje suis a la creation de la suite liste 1\n");
p1=premier;
//premier = p1;
q1=(struct Skieur *) malloc (sizeof (struct Skieur));
strcpy(q1->name,ntmp);
printf("\nle nom est : %s\n",q1->name);
q1->tp1=tmp;
if (q1 == NULL)
{
printf("liste vide");
}
else
{
while(p1->suivant!=NULL && tmp > p1->tp1)
{
printf("%d\t%d",p1->tp1,tmp);
p1 = p1->suivant;
}
}
q1->suivant = p1->suivant;
p1->suivant = q1;
q1->precedent = p1;
}

}



le but de ce programme est de créer un liste triée, seulement le tri ne se fai pas bien du tout:



LISTE DES QUALIFIES DE LA PREMIERE MANCHE:

A la place n.1: a avec un temps de: 124 s
A la place n.2: g avec un temps de: 41 s
A la place n.3: f avec un temps de: 12 s
A la place n.4: z avec un temps de: 145 s
A la place n.5: r avec un temps de: 127 s
A la place n.6: e avec un temps de: 562 s
A la place n.7: q avec un temps de: 248 s
A la place n.8: y avec un temps de: 426 s
A la place n.9: t avec un temps de: 854 s
A la place n.10: s avec un temps de: 965 s
A la place n.11: d avec un temps de: 968 s

LISTE DES DISQUALIFIES DE LA PREMIERE MANCHE:

Appuyez sur une touche pour continuer...

Process returned 0 (0x0) execution time : 47.290 s
Press any key to continue.


voilà j'ai entrée des valeurs au hasard et le tri se fait très très mal.
Je pense que cela vient d'une erreur de ma part, mais je ne sais pas ou.
Si vous avez besoin d'info supplémentaires, je ss dispo toute la soirée.
merci d'avance



A voir également:

2 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
9 déc. 2010 à 11:05
Premier problème, tu ne traite jamais le cas où le temps de q1 est plus petit que le temps de premier. Parant de le là, tout les temps inférieurs à 124 seront mal classer. Après, pourquoi 145 est mal placer, je ne sais pas...
je voi que tu as un champ precedent. Tu l'utilises mal, car tu ne le mets pas complétement à jour.
0
lucieb31 Messages postés 345 Date d'inscription mercredi 14 janvier 2009 Statut Membre Dernière intervention 28 juillet 2012 62
9 déc. 2010 à 11:44
Comme l'a dit char sniper, si le temps de q1 est plus petit que le temps de p1 il faut pas que tu fasse :
q1->suivant = p1->suivant;
p1->suivant = q1;
q1->precedent = p1;
mais plutot :
q1->suivant = p1;
q1->precedent = p1->precedent;
p1->precedent = q1;
Sachant que dans ton insertion entete, il faut que tu mette p1 ->precedent = NULL.
145 est mal placé pck il est plus grand que les precedent donc il se met a la suite.
0