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

  FORUM HardWare.fr
  Programmation
  C

  Aide tri Eclatement/fusion

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Aide tri Eclatement/fusion

n°1662645
Cendre
Posté le 23-12-2007 à 18:25:59  profilanswer
 

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!
mood
Publicité
Posté le 23-12-2007 à 18:25:59  profilanswer
 

n°1662697
Trap D
Posté le 23-12-2007 à 22:21:05  profilanswer
 

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 ?


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

  Aide tri Eclatement/fusion

 

Sujets relatifs
Besoin d'aide pour programmation page d'InscriptionPHP :Récupération d'une donnée à l'aide d'une requête
Aide client FTPCherche une aide pour terminer mon projet
Aide creation logiciel EBP (analyse et conception)Aide pour une requete
Dos besoins d'aideAide pour optimiser mon code => insert bdd
[Résolu] [WSQL] Besoin d'aide - Procedurebesoin aide pour requête
Plus de sujets relatifs à : Aide tri Eclatement/fusion


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