Tri d'une liste doublement chainée

Tri d'une liste doublement chainée - C++ - Programmation

Marsh Posté le 29-12-2012 à 14:39:29    

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
Reply

Marsh Posté le 29-12-2012 à 14:39:29   

Reply

Marsh Posté le 29-12-2012 à 15:18:28    

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.

Reply

Marsh Posté le 29-12-2012 à 15:36:22    

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

Reply

Marsh Posté le 29-12-2012 à 22:40:09    

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. }


Reply

Marsh Posté le 29-12-2012 à 23:09:53    

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.

Reply

Marsh Posté le 30-12-2012 à 10:05:02    

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
Reply

Marsh Posté le 30-12-2012 à 11:49:47    

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
Reply

Marsh Posté le 30-12-2012 à 12:57:47    

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é!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed