Se connecter avec
S'enregistrer | Connectez-vous

trier une liste chainee

Dernière réponse : dans Programmation

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 :
  1. /*tri */
  2. void trier(liste *adl)
  3. {
  4. Tnoeud *p , *q;
  5. int aux;
  6. p=adl->debut ;
  7.  
  8. while(p->suiv){
  9.  
  10. q=p->suiv;
  11. while(q) {
  12.  
  13. if(compar(p->ele , q->ele ) > 0)
  14. {
  15. aux = p->ele;
  16. p->ele = q->ele;
  17. q->ele = aux;
  18. } }
  19.  
  20. }
  21.  
  22.  
  23. }


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

merci d avance . :) 

Autres pages sur : trier liste chainee

Lassé par la pub ? Créez un compte

nacerleroi11 a dit :
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 :

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.

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

merci d avance . :) 


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

voici le code que j ai fait :
  1. * /*tri */
  2. void trier(liste *adl)
  3. {
  4. Tnoeud *p , *q;
  5. int aux;
  6. p=adl->debut ;
  7.  
  8. while(p->suiv){
  9.  
  10. q=p->suiv;
  11. while(q) {
  12.  
  13. if(compar(p->ele , q->ele ) > 0)
  14. {
  15. aux = p->ele;
  16. p->ele = q->ele;
  17. q->ele = aux;
  18. } }
  19.  
  20. }
  21.  
  22.  
  23. }

moi je veux quelq un faire un petit modification sur mon code pour le tri ca marche bien .
Lassé par la pub ? Créez un compte