trier une liste chainee

  • Auteur de la discussion jackman
  • Date de début

jackman

Habitué
salut

dans le liste chainee j ai resoudre plusieur probleme comme l affichage et l insertion au debut et fin et milieu maintenant j ai un probleme sur les tris d une liste chaine , j ai essaye mais je nai pas encore arriver voici ma fonction de tri :
[cpp] /*tri */
void trier(liste *adl)
{
Tnoeud *p , *q;
int aux;
p=adl->debut ;

while(p->suiv){

q=p->suiv;
while(q) {

if(compar(p->ele , q->ele ) > 0)
{
aux = p->ele;
p->ele = q->ele;
q->ele = aux;
} }

}


}[/cpp]

si il y a quelqu un peut corriger ou il a un autre solution , il me repond plus que possible .

merci d avance . :)
 

Emmanuel Delahaye

Expert

C'est une question d'algorithme.

En principe, on crée une deuxième liste et on déplace les éléments de la première dans la seconde selon le principe "tri par insertion" ou "insersion triée" puisqu'il est facile d'insérer dans une liste.

Ce qu'il faut, c'est bien définir et appliquer le critère de tri.
 

Anubis_

Expert


Si je comprends bien, ton idée est de comparer les noeuds deux à deux, et les échanger si le premier a une valeur supérieure au second. Comme tu as dû le constater, ça ne trie pas ta liste, et comme le dit Emmanuel Delahaye, pour être efficace, il faudrait résoudre le problème complétement autrement.
Cela dit, pour poursuivre dans ton idée, on peut l'adapter pour qu'elle fonctionne (mais ça ne sera pas du tout efficace, ça sera seulement drôle).

prends cette liste : [1]->[3]->[4]->[2]->[5]
après passage dans ton algo, ça devrait donner cela : [1]->[3]->[2]->[4]->[5]
ça n'est pas trié, pourtant on n'e est pas si loin. Si je repasse ce résultat intémédiaire dans ton algo, j'obtiens ça : [1]->[2]->[3]->[4]->[5], bingo !

à méditer : si on applique plusieurs fois ta procédure trier, cela finit par trier.

question : combien de fois faut-il l'appliquer ?
réponse : tant que la liste n'est pas triée
 

jackman

Habitué
dis moi vous pouvez m aider a l aide d une fonction parce que je n ai pas encore arriver .


merci d avance
 

Emmanuel Delahaye

Expert

C'est à toi d'écrire le code...
 

jackman

Habitué
dis moi tu ne peux pas modifier mon code que j ai mit au debut svp?

merci d avance
 

jackman

Habitué
voici le code que j ai fait :
[cpp] * /*tri */
void trier(liste *adl)
{
Tnoeud *p , *q;
int aux;
p=adl->debut ;

while(p->suiv){

q=p->suiv;
while(q) {

if(compar(p->ele , q->ele ) > 0)
{
aux = p->ele;
p->ele = q->ele;
q->ele = aux;
} }

}


}[/cpp]
moi je veux quelq un faire un petit modification sur mon code pour le tri ca marche bien .
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 057
Membres
1 586 394
Dernier membre
Manoushk
Partager cette page
Haut