Aide tri Eclatement/fusion

Aide tri Eclatement/fusion - C - Programmation

Marsh Posté le 23-12-2007 à 18:25:59    

Bonjour,
 
Alors voila, je suis actuellement en école d'ingénieur et j'ai un petit TP (langage C) qui me pose un petit soucis.
Voici le sujet (ça serait inutile de vous l'expliquer sans le répéter), il s'agit du TP numéro 6 concernant du tri par fusion : http://91.121.25.51/Sujets-TP.pdf
 
Bon pour la partie Eclatement, ça marche il n'y pas de problème, par contre c'est dans la fusion que j'ai un peu de mal.
 
Voici mon code :
 

Code :
  1. /****************** Définition structure ******************/
  2. typedef struct maillon
  3. {
  4. int a;
  5. struct maillon* suivant;
  6. } Maillon;
  7. /***************** Définition Remplissage *****************/
  8. void Remplir (Maillon* tete, int* liste, int n)
  9. {
  10. int i;
  11. Maillon *p = (Maillon*)malloc (sizeof (Maillon));
  12. Maillon *q = (Maillon*)malloc (sizeof (Maillon));
  13. p = tete;
  14. q->a = *liste;
  15. p->a = q->a;
  16. liste ++;
  17. for (i=0; i<n-1; i++)
  18. {
  19.  q->a = *liste;
  20.  p->suivant = q;
  21.  liste++;
  22.  p = p->suivant;
  23.  q++;
  24. }
  25. p->suivant = NULL;
  26. }
  27. /****************** Fonction Affichage ******************/
  28. void Affichage (Maillon* tete)
  29. {
  30. Maillon* courant = NULL;
  31.     courant = tete;  // Pour partir du début
  32.    
  33. while (courant != NULL)
  34.     {
  35.  printf("%d ", courant->a);
  36.         courant = courant->suivant;   // Passage au maillon suivant
  37.     }
  38. }
  39. /****************** Fonction Eclatement ******************/
  40. void Eclatement (Maillon* tete, Maillon* L1, Maillon* L2, int n)
  41. {
  42. int i, numListe=0, l1=0, l2=0;
  43. Maillon* p = tete;
  44. Maillon* p1 = L1;
  45. Maillon* p2 = L2;
  46. for (i=0; i<n; i++)
  47. {
  48.  switch (numListe)
  49.  {
  50.  case 0 :
  51.   if (i && l1)
  52.   {
  53.    p1->suivant = (Maillon*)malloc(sizeof(Maillon));
  54.    p1 = p1->suivant;
  55.   }
  56.   p1->a = p->a;
  57.   l1++;
  58.   break;
  59.  case 1 :
  60.   if (i && l2)
  61.   {
  62.    p2->suivant = (Maillon*)malloc(sizeof(Maillon));
  63.    p2 = p2->suivant;
  64.   }
  65.   p2->a = p->a;
  66.   l2++;
  67.   break;
  68.  }
  69. /*  switch (numListe)
  70.  {
  71.  case 0 :
  72.   p1->a = p->a;
  73.   l1++;
  74.   break;
  75.  case 1 :
  76.   p2->a = p->a;
  77.   l2++;
  78.   break;
  79.  }*/
  80.  if (i!=n-1)
  81.  {
  82.   if (p->a > p->suivant->a)
  83.   {
  84.    numListe = (numListe + 1)%2;
  85.   }
  86.  }
  87.  p = p->suivant;
  88. }
  89. p1->suivant = NULL;
  90. p2->suivant = NULL;
  91. }
  92. /******************** Fonction Fusion ********************/
  93. void Fusion (Maillon* L1, Maillon* L2, Maillon* tete, int taille)
  94. {
  95. int a=0, b=0;
  96. Maillon* p = tete;
  97. Maillon* p1 = L1;
  98. Maillon* p2 = L2;
  99. while (p1 != NULL || p2 != NULL)
  100. {
  101.  // (1)
  102.  while (p1 == NULL && p2 != NULL)
  103.  {
  104.   p->a = p2->a;
  105.   p = p->suivant;
  106.   p2 = p2->suivant;
  107.  }
  108.  // (2)
  109.  while (p2 == NULL && p1 != NULL)
  110.  {
  111.   p->a = p1->a;
  112.   p = p->suivant;
  113.   p1 = p1->suivant;
  114.  }
  115.  // (3)
  116.  while (p1 != NULL && p2 != NULL)
  117.  {
  118.   // Cas < <
  119.   if (p1->a < p1->suivant->a && p2->a < p2->suivant->a)
  120.   {
  121.    if (p1->a < p2->a)
  122.    {
  123.     p->a = p1->a;
  124.     p = p->suivant;
  125.     p1 = p1->suivant;
  126.    }
  127.    else
  128.    {
  129.     p->a = p2->a;
  130.     p = p->suivant;
  131.     p2 = p2->suivant;
  132.    }
  133.   }
  134.   // Cas > <
  135.   if (p1->a > p1->suivant->a && p2->a < p2->suivant->a)
  136.   {
  137.    if (p1->a < p2->a && !a)
  138.    {
  139.     p->a = p1->a;
  140.     p = p->suivant;
  141.     a=1;
  142.    }
  143.    else
  144.    {
  145.     p->a = p2->a;
  146.     p = p->suivant;
  147.     p2 = p2->suivant;
  148.    }
  149.   }
  150.   // Cas < >
  151.   if (p1->a < p1->suivant->a && p2->a > p2->suivant->a)
  152.   {
  153.    if (p2->a < p1->a && !b)
  154.    {
  155.     p->a = p2->a;
  156.     p = p->suivant;
  157.     b=1;
  158.    }
  159.    else
  160.    {
  161.     p->a = p2->a;
  162.     p = p->suivant;
  163.     p2 = p2->suivant;
  164.    }
  165.   }
  166.   // Cas > >
  167.   if (p1->a > p1->suivant->a && p2->a > p2->suivant->a)
  168.   {
  169.    if (!a && !b)
  170.    {
  171.     if (p1->a < p2->a)
  172.     {
  173.      p->a = p1->a;
  174.      p = p->suivant;
  175.      a=1;
  176.     }
  177.     else
  178.     {
  179.      p->a = p2->a;
  180.      p = p->suivant;
  181.      b=1;
  182.     }
  183.    }
  184.    if (a && !b)
  185.    {
  186.     p->a = p2->a;
  187.     p = p->suivant;
  188.     b=1;
  189.    }
  190.    if (!a && b)
  191.    {
  192.     p->a = p1->a;
  193.     p = p->suivant;
  194.     a=1;
  195.    }
  196.    else
  197.    {
  198.     p1 = p1->suivant;
  199.     p2 = p2->suivant;
  200.     a = 0;
  201.     b = 0;
  202.    }
  203.   }
  204.  }
  205. }
  206. }


 
 
 
Bon déjà il faut savoir que la fusion ne marche pas en fin de liste (je n'ai pas pris en compte dans les comparaison lorsque pX->suivant est NULL), tout simplement parce que je trouvais que c'était déjà asser le bazarre, et qu'avant de m'attaquer à cette partie, j'avais besoin d'un regard extérieur qui puisse me dire comment optimiser un peu de bronx.
Donc voila, ce que j'aimerais, c'est que vous me disiez ce qui peut et doit être simplifier, comment optimiser de bout de code pour le rendre un peu plus "beau".
 
Merci d'avance
 
PS : si vous voyez des erreurs/abérations dans le code, et que vous voulez me le signaler, merci de juste m'indiquer l'endroit sans me donner tout de suite la solution ^^.


---------------
Site de téléchargement d'animés : en reconstruction!
Reply

Marsh Posté le 23-12-2007 à 18:25:59   

Reply

Marsh Posté le 23-12-2007 à 22:21:05    

Salut
 
As-tu écris ton algo de fusion, en pseudo langage avant de l'écrire en C ? Il me parait bien compliqué.
Il me semble qu'une boucle avec un "tant que les deux listes à fusionner ne sont pas vides" est suffisant.
Ensuite lorsque l'une des listes est vide, le travail restant est évident.
A qiuoi te servent les deux nombres a et b ?

Reply

Sujets relatifs:

Leave a Replay

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