Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1733 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Tri d'une liste doublement chainée

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Tri d'une liste doublement chainée

n°2169323
assil
Posté le 29-12-2012 à 14:39:29  profilanswer
 

J'ai programmé une fonction de tri pour ma liste, mais il n'affiche pas la dernière valeur.
Par exemple j'ai 4 valeurs a trier:
2
7
4
3
 
et la fonction tri comme ça:
2
3
4
 
Voila le code si quelqu'un peut me dire ce ça marche pas:
 


Message édité par assil le 30-12-2012 à 23:50:48
mood
Publicité
Posté le 29-12-2012 à 14:39:29  profilanswer
 

n°2169325
Profil sup​primé
Posté le 29-12-2012 à 15:18:28  answer
 

Moi j'aime bien l'indentation.

Code :
  1. void Tri_liste(Element** Entete)
  2. {
  3.  Element *courant;
  4.  courant=*Entete;
  5.  
  6.  if (courant->suivant==NULL)
  7.    return;
  8.  
  9.  Element *ptr,*tmp;
  10.  
  11.  courant=courant->suivant;
  12.  while(courant!=NULL)
  13.    {
  14.      ptr=courant;
  15.      tmp=courant->precedent;
  16.      courant=courant->suivant;
  17.      while (tmp!=NULL && tmp->prix>ptr->prix)
  18.        {
  19.          tmp=tmp->precedent;
  20.        }
  21.      ptr->precedent->suivant=ptr->suivant;
  22.      if (ptr->suivant!=NULL)
  23.        {
  24.          ptr->suivant->precedent=ptr->precedent;
  25.          if (tmp==NULL)
  26.            {
  27.              tmp=*Entete;
  28.              ptr->precedent=NULL;
  29.              ptr->suivant=tmp;
  30.              ptr->suivant->precedent=ptr;
  31.              *Entete=ptr->precedent;
  32.            }
  33.          else
  34.            {
  35.              tmp=tmp->suivant;
  36.              tmp->precedent->suivant=ptr;
  37.              ptr->precedent=tmp->precedent;
  38.              tmp->precedent=ptr;
  39.              ptr->suivant=tmp;
  40.            }
  41.        }
  42.    }
  43. }


 
Ceci dit, le code est un poil tordu pour moi, je ne peux que te conseiller d'ajouter quelque print pour bien saisir le déroulement de ton programme.

n°2169327
assil
Posté le 29-12-2012 à 15:36:22  profilanswer
 

Merci pour ta réponse, mais j'ai essayé tout ce que je peux sans rien trouver.

n°2169353
Trap D
Posté le 29-12-2012 à 22:40:09  profilanswer
 

J'ai corrigé le code  

Code :
  1. void Tri_liste(Element** Entete)
  2. {
  3.      Element *courant;
  4.      Element *ptr,*tmp, *tmp1;
  5.      courant=*Entete;
  6.    
  7.      if (courant->suivant==NULL)
  8.        return;
  9.    
  10.    
  11.      courant=courant->suivant;
  12.      while(courant!=NULL)
  13.      {
  14.          ptr=courant;
  15.          tmp=courant->precedent;
  16.          courant=courant->suivant;
  17.          while (tmp !=NULL && tmp->prix>ptr->prix)
  18.          {
  19.              tmp=tmp->precedent;
  20.          }
  21.   // on raccorde les elemnts qui entourent ptr
  22.   ptr->precedent->suivant=ptr->suivant;
  23.   if (ptr->suivant != NULL)
  24.   ptr->suivant->precedent = ptr->precedent;
  25.   if (tmp == NULL)
  26.   { // on ajoute en tete
  27.    ptr->precedent = NULL ;
  28.    (*Entete)->precedent = ptr;
  29.    ptr->suivant = *Entete;
  30.    *Entete = ptr;
  31.   }
  32.   else
  33.   {
  34.   ptr->suivant = tmp->suivant;
  35.   if (tmp->suivant != NULL)
  36.    tmp->suivant->precedent = ptr;
  37.   tmp->suivant = ptr;
  38.   ptr->precedent = tmp;
  39.   }
  40. }
  41. }


n°2169357
assil
Posté le 29-12-2012 à 23:09:53  profilanswer
 

Merci pour votre aide mais même avec ça, le tri marche pas et pour les valeurs 7,2,4 et 3 j'ai eu comme résultat 0,2,3 et 4.

n°2169375
Trap D
Posté le 30-12-2012 à 10:05:02  profilanswer
 

assil a écrit :

Merci pour votre aide mais même avec ça, le tri marche pas et pour les valeurs 7,2,4 et 3 j'ai eu comme résultat 0,2,3 et 4.

Mon code fonctionne très bien chez moi, le voici en intégralite :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. typedef struct _elem
  5. {
  6. int prix;
  7. struct _elem *precedent;
  8. struct _elem *suivant;
  9. } Element ;
  10. void Tri_liste(Element** Entete)
  11. {
  12.      Element *courant;
  13.      Element *ptr,*tmp;
  14.  puts("Tri de la liste" );
  15.      courant=*Entete;
  16.    
  17.      if (courant == NULL || courant->suivant==NULL)
  18.        return;
  19.    
  20.    
  21.      courant=courant->suivant;
  22.      while(courant!=NULL)
  23.      {
  24.          ptr=courant;
  25.          tmp=courant->precedent;
  26.          courant=courant->suivant;
  27.          while (tmp !=NULL && tmp->prix>ptr->prix)
  28.          {
  29.              tmp=tmp->precedent;
  30.          }
  31.   // on raccorde les elemnts qui entourent ptr
  32.   ptr->precedent->suivant=ptr->suivant;
  33.   if (ptr->suivant != NULL)
  34.   ptr->suivant->precedent = ptr->precedent;
  35.   if (tmp == NULL)
  36.   { // on ajoute en tete
  37.    ptr->precedent = NULL ;
  38.    (*Entete)->precedent = ptr;
  39.    ptr->suivant = *Entete;
  40.    *Entete = ptr;
  41.   }
  42.   else
  43.   {
  44.   ptr->suivant = tmp->suivant;
  45.   if (tmp->suivant != NULL)
  46.    tmp->suivant->precedent = ptr;
  47.   tmp->suivant = ptr;
  48.   ptr->precedent = tmp;
  49.   }
  50. }
  51. }
  52. Element *add(Element *Liste, int Val)
  53. {
  54. Element *elem = malloc(sizeof(*elem));
  55. Element *tmp ;
  56. if (elem == NULL)
  57.         {
  58.                 printf("Pb ajout de %d\n", Val);
  59.  return Liste;
  60.         }
  61. elem->prix = Val;
  62. elem->precedent = NULL;
  63. elem->suivant = NULL;
  64. if (Liste == NULL)
  65.  Liste = elem;
  66. else
  67. {
  68.  tmp = Liste;
  69.  while(tmp->suivant != NULL)
  70.   tmp = tmp -> suivant;
  71.  tmp->suivant = elem;
  72.  elem->precedent = tmp;
  73. }
  74. return Liste ;
  75. }
  76. void my_free(Element *Liste)
  77. {
  78. Element *tmp = Liste;
  79. Element *tmp2 ;
  80. while(tmp != NULL)
  81. {
  82.  tmp2 = tmp->suivant;
  83.  free(tmp);
  84.  tmp = tmp2;
  85. }
  86. }
  87. void printf_liste(Element *Liste)
  88. {
  89. Element *tmp = Liste;
  90. Element *tmp1 = Liste;
  91. puts("Affichage de la liste en sens direct" );
  92. while(tmp != NULL)
  93. {
  94.  printf("%d\n", tmp->prix);
  95.  tmp = tmp->suivant;
  96. }
  97. puts("Affichage de la liste en sens indirect" );
  98. tmp = Liste;
  99. while (tmp != NULL)
  100. {
  101.  tmp1 = tmp;
  102.  tmp = tmp->suivant;
  103. }
  104. while(tmp1 != NULL)
  105. {
  106.  printf("%d\n", tmp1->prix);
  107.  tmp1 = tmp1->precedent;
  108. }
  109. puts("\n" );
  110. }
  111. // Liste a sans element
  112. void t1(void)
  113. {
  114. Element *Liste = NULL;
  115. puts("Liste sans element" );
  116. printf_liste(Liste);
  117. Tri_liste(&Liste);
  118. printf_liste(Liste);
  119. my_free(Liste);
  120. }
  121. // liste avec un seul element
  122. void t2(void)
  123. {
  124. Element *Liste = NULL;
  125. puts("Liste avec un seul element" );
  126. Liste = add(Liste, 2);
  127. printf_liste(Liste);
  128. Tri_liste(&Liste);
  129. printf_liste(Liste);
  130. my_free(Liste);
  131. }
  132. // liste avec un plusieurs elements tries
  133. void t3(void)
  134. {
  135. Element *Liste = NULL;
  136. puts("liste avec un plusieurs elements tries" );
  137. Liste = add(Liste, 2);
  138. Liste = add(Liste, 3);
  139. Liste = add(Liste, 4);
  140. Liste = add(Liste, 5);
  141. Liste = add(Liste, 7);
  142. printf_liste(Liste);
  143. Tri_liste(&Liste);
  144. printf_liste(Liste);
  145. my_free(Liste);
  146. }
  147. // liste avec un plusieurs elements tries en sens inverse
  148. void t4(void)
  149. {
  150. Element *Liste = NULL;
  151. puts("liste avec un plusieurs elements tries en sens inverse " );
  152. Liste = add(Liste, 7);
  153. Liste = add(Liste, 5);
  154. Liste = add(Liste, 4);
  155. Liste = add(Liste, 3);
  156. Liste = add(Liste, 2);
  157. printf_liste(Liste);
  158. Tri_liste(&Liste);
  159. printf_liste(Liste);
  160. my_free(Liste);
  161. }
  162. // liste avec un plusieurs elements
  163. void t5(void)
  164. {
  165. Element *Liste = NULL;
  166. puts("liste avec un plusieurs elements quelconques" );
  167. Liste = add(Liste, 7);
  168. Liste = add(Liste, 10);
  169. Liste = add(Liste, 4);
  170. Liste = add(Liste, 9);
  171. Liste = add(Liste, 4);
  172. printf_liste(Liste);
  173. Tri_liste(&Liste);
  174. printf_liste(Liste);
  175. my_free(Liste);
  176. }
  177. int main(void)
  178. {
  179. t1();
  180. t2();
  181. t3();
  182. t4();
  183. t5();
  184. _getch();
  185. return 0;
  186. }


EDIT C'est quoi ce problème d'indentation ? Les tab ne sont pas transformés en espaces ?


Message édité par Trap D le 30-12-2012 à 10:55:59
n°2169378
assil
Posté le 30-12-2012 à 11:49:47  profilanswer
 

J'ai testé ton code mais lorsque j'ai essayé de l'implanté sur mon code sa marche pas:
 
Voila mon code avec 3 fonctions (chargement de la liste, tri de la liste et affichage):
 


Message édité par assil le 30-12-2012 à 23:51:29
n°2169382
gilou
Modérateur
Modzilla
Posté le 30-12-2012 à 12:57:47  profilanswer
 

Primo, ce sujet devrait se trouver en catégorie C++ (et je viens de le déplacer)
Secondo:

Code :
  1. class Element
  2. {
  3. public:
  4. string titre;
  5. string source;
  6. int numero;
  7. int prix;
  8. string niveaux_de_confidentialite;
  9. string adresse;
  10. int ID;
  11. int date;
  12. int age;
  13. string examen;
  14. Element* suivant;
  15. Element* precedent;
  16. ..........
  17. }


Surtout pas!
 

Code :
  1. class Donnees
  2. {
  3. public:
  4. string titre;
  5. string source;
  6. int numero;
  7. int prix;
  8. string niveaux_de_confidentialite;
  9. string adresse;
  10. int ID;
  11. int date;
  12. int age;
  13. string examen;
  14. ...........
  15. }
  16. class Element
  17. {
  18. Donnees* donnees;
  19. Element* suivant;
  20. Element* precedent;
  21. ..........
  22. }


Il n'y a aucune raison de mélanger les torchons avec les serviettes, ie ce qui fait partie du chaînage et ce qui fait partie des données.
De plus en procédant ainsi, ta fonction de tri n'a plus besoin de modifier la liste chaînée, elle a juste à échanger la valeur des pointeurs donnees.
 
A+,


Message édité par gilou le 30-12-2012 à 13:03:03

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Tri d'une liste doublement chainée

 

Sujets relatifs
Tri dynamique[Need HELP !] Garder la dernière version dans une liste
Tri tableau 2 dimensions[VBA] Créer une liste depuis une cellule
Créer une liste numérotée en PHPListe et lien de fichiers
Liste en ligne?imprimer des feuilles excel générées à partir d'une liste de données
access 97 - Liste des formulairesgarder des données en mémoire dans une liste déroulante
Plus de sujets relatifs à : Tri d'une liste doublement chainée


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR