Cendre | 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 :
- /****************** Définition structure ******************/
- typedef struct maillon
- {
- int a;
- struct maillon* suivant;
- } Maillon;
- /***************** Définition Remplissage *****************/
- void Remplir (Maillon* tete, int* liste, int n)
- {
- int i;
- Maillon *p = (Maillon*)malloc (sizeof (Maillon));
- Maillon *q = (Maillon*)malloc (sizeof (Maillon));
- p = tete;
- q->a = *liste;
- p->a = q->a;
- liste ++;
- for (i=0; i<n-1; i++)
- {
- q->a = *liste;
- p->suivant = q;
- liste++;
- p = p->suivant;
- q++;
- }
- p->suivant = NULL;
- }
- /****************** Fonction Affichage ******************/
- void Affichage (Maillon* tete)
- {
- Maillon* courant = NULL;
- courant = tete; // Pour partir du début
-
- while (courant != NULL)
- {
- printf("%d ", courant->a);
- courant = courant->suivant; // Passage au maillon suivant
- }
- }
- /****************** Fonction Eclatement ******************/
- void Eclatement (Maillon* tete, Maillon* L1, Maillon* L2, int n)
- {
- int i, numListe=0, l1=0, l2=0;
- Maillon* p = tete;
- Maillon* p1 = L1;
- Maillon* p2 = L2;
- for (i=0; i<n; i++)
- {
- switch (numListe)
- {
- case 0 :
- if (i && l1)
- {
- p1->suivant = (Maillon*)malloc(sizeof(Maillon));
- p1 = p1->suivant;
- }
- p1->a = p->a;
- l1++;
- break;
- case 1 :
- if (i && l2)
- {
- p2->suivant = (Maillon*)malloc(sizeof(Maillon));
- p2 = p2->suivant;
- }
- p2->a = p->a;
- l2++;
- break;
- }
- /* switch (numListe)
- {
- case 0 :
- p1->a = p->a;
- l1++;
- break;
- case 1 :
- p2->a = p->a;
- l2++;
- break;
- }*/
- if (i!=n-1)
- {
- if (p->a > p->suivant->a)
- {
- numListe = (numListe + 1)%2;
- }
- }
- p = p->suivant;
- }
- p1->suivant = NULL;
- p2->suivant = NULL;
- }
- /******************** Fonction Fusion ********************/
- void Fusion (Maillon* L1, Maillon* L2, Maillon* tete, int taille)
- {
- int a=0, b=0;
- Maillon* p = tete;
- Maillon* p1 = L1;
- Maillon* p2 = L2;
- while (p1 != NULL || p2 != NULL)
- {
- // (1)
- while (p1 == NULL && p2 != NULL)
- {
- p->a = p2->a;
- p = p->suivant;
- p2 = p2->suivant;
- }
- // (2)
- while (p2 == NULL && p1 != NULL)
- {
- p->a = p1->a;
- p = p->suivant;
- p1 = p1->suivant;
- }
- // (3)
- while (p1 != NULL && p2 != NULL)
- {
- // Cas < <
- if (p1->a < p1->suivant->a && p2->a < p2->suivant->a)
- {
- if (p1->a < p2->a)
- {
- p->a = p1->a;
- p = p->suivant;
- p1 = p1->suivant;
- }
- else
- {
- p->a = p2->a;
- p = p->suivant;
- p2 = p2->suivant;
- }
- }
- // Cas > <
- if (p1->a > p1->suivant->a && p2->a < p2->suivant->a)
- {
- if (p1->a < p2->a && !a)
- {
- p->a = p1->a;
- p = p->suivant;
- a=1;
- }
- else
- {
- p->a = p2->a;
- p = p->suivant;
- p2 = p2->suivant;
- }
- }
- // Cas < >
- if (p1->a < p1->suivant->a && p2->a > p2->suivant->a)
- {
- if (p2->a < p1->a && !b)
- {
- p->a = p2->a;
- p = p->suivant;
- b=1;
- }
- else
- {
- p->a = p2->a;
- p = p->suivant;
- p2 = p2->suivant;
- }
- }
- // Cas > >
- if (p1->a > p1->suivant->a && p2->a > p2->suivant->a)
- {
- if (!a && !b)
- {
- if (p1->a < p2->a)
- {
- p->a = p1->a;
- p = p->suivant;
- a=1;
- }
- else
- {
- p->a = p2->a;
- p = p->suivant;
- b=1;
- }
- }
- if (a && !b)
- {
- p->a = p2->a;
- p = p->suivant;
- b=1;
- }
- if (!a && b)
- {
- p->a = p1->a;
- p = p->suivant;
- a=1;
- }
- else
- {
- p1 = p1->suivant;
- p2 = p2->suivant;
- a = 0;
- b = 0;
- }
- }
- }
- }
- }
|
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!
|