Tri par insertion -> Adaptation pour chaine de car

Tri par insertion -> Adaptation pour chaine de car - C - Programmation

Marsh Posté le 04-04-2005 à 13:07:33    

Salut,
Je doit utiliser le tri par insertion simple pour trier des caractère
 

Code :
  1. i=1;
  2. while (i<10)
  3. {
  4.    tmp=tab[i];
  5.    j=i-1;
  6.    while (j>=0 && tmp<tab[j])
  7.    {
  8. tab[j+1]=tab[j];
  9. j--;
  10.    }
  11.    tab[j+1]=tmp;
  12.    i++;
  13. }


 
Il marche parfaitement.
Voilà mon adaptation:
 

Code :
  1. i=1;
  2. while (i<LGMAXP)
  3. {
  4. strcpy(tmp,(pindex+i)->sis);
  5. j=i-1;
  6. chaine=strcmp(tmp,(pindex+j)->sis);
  7. while (j>=0 && chaine<0)
  8. {
  9.  chaine=strcmp(tmp,(pindex+j)->sis);
  10.  strcpy((pindex+j+1)->sis,(pindex+j)->sis);
  11.  j--;
  12. }
  13. strcpy((pindex+j+1)->sis,tmp);
  14. i++;
  15. }


 
 
Hors il ne met que le premier élément par ordre alphabétique en premier et le dernier élément par ordre alphabétique en dernier...et il mélange totalement le reste des noms...


Message édité par finch911 le 04-04-2005 à 13:18:07
Reply

Marsh Posté le 04-04-2005 à 13:07:33   

Reply

Marsh Posté le 04-04-2005 à 13:30:40    

finch911 a écrit :


Code :
  1. i=1;
  2. while (i<LGMAXP)
  3. {
  4. strcpy(tmp,(pindex+i)->sis);
  5. j=i-1;
  6. chaine=strcmp(tmp,(pindex+j)->sis);
  7. while (j>=0 && chaine<0)
  8. {
  9.  chaine=strcmp(tmp,(pindex+j)->sis);
  10.  strcpy((pindex+j+1)->sis,(pindex+j)->sis);
  11.  j--;
  12. }
  13. strcpy((pindex+j+1)->sis,tmp);
  14. i++;
  15. }


Or, il ne met que le premier élément par ordre alphabétique en premier et le dernier élément par ordre alphabétique en dernier...et il mélange totalement le reste des noms...


Comment est défini pindex ? Peux-tu poster un code complet et compilable...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 04-04-2005 à 13:36:00    

Emmanuel Delahaye a écrit :

Comment est défini pindex ? Peux-tu poster un code complet et compilable...


Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <string.h>
  5. #define LGMAXP 10
  6. #define LGMAXS 20
  7. #define LGMAXE 8
  8. void trierindex();
  9. typedef struct {
  10. char sis [11];
  11. int indice;
  12. } org;
  13. void main ()
  14. {
  15. org tabo[LGMAXP]={"BRABN",2,"OPLO",4,"PRO",5,"GUSTAVE",6,"ALAIN",7,"XUPONT",0,"KAPOUL",9,"JAVERT",3,"GREG",2,"JOHN",3};
  16. trierindex(&tabo[0]);
  17. }
  18. void trierindex(org *pindex)
  19. {
  20. char tmp[11];
  21. int chaine,i,j;
  22. i=1;
  23. while (i<LGMAXP)
  24. {
  25.  strcpy(tmp,(pindex+i)->sis);
  26.  j=i-1;
  27.  chaine=strcmp(tmp,(pindex+j)->sis);
  28.  while (j>=0 && chaine<0)
  29.  {
  30.   chaine=strcmp(tmp,(pindex+j)->sis);
  31.   strcpy((pindex+j+1)->sis,(pindex+j)->sis);
  32.   j--;
  33.  }
  34.  strcpy((pindex+j+1)->sis,tmp);
  35.  i++;
  36. }
  37. printf("\n\n%s",pindex->sis);
  38. printf("\n%s",(pindex+1)->sis);
  39. printf("\n%s",(pindex+2)->sis);
  40. printf("\n%s",(pindex+3)->sis);
  41. printf("\n%s",(pindex+4)->sis);
  42. printf("\n%s",(pindex+5)->sis);
  43. printf("\n%s",(pindex+6)->sis);
  44. printf("\n%s",(pindex+7)->sis);
  45. printf("\n%s",(pindex+8)->sis);
  46. printf("\n%s",(pindex+9)->sis);
  47. }


 
 
J'ai mis des noms aléatoires. Ils sont la juste pour tester. Le numéros a coté ne sers a rien dans ce cas (il sert pour la gestion séquentielle indexé directe).


Message édité par finch911 le 04-04-2005 à 13:37:47
Reply

Marsh Posté le 04-04-2005 à 13:50:49    

ok j'ai trouver, fallait mettre la ligne 40 deux ligne plus tard...pour que le j-- fasse effet dessus...

Reply

Marsh Posté le 04-04-2005 à 14:30:40    

finch911 a écrit :

ok j'ai trouver, fallait mettre la ligne 40 deux ligne plus tard...pour que le j-- fasse effet dessus...


Une version plus 'professionelle'...


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define N(a) (sizeof(a)/sizeof*(a))
 
typedef struct
{
   char sis[11];
   int indice;
}
org;
 
char *str_dup (char const *s)
{
   char *s_dup = NULL;
   if (s != NULL)
   {
      size_t const size = strlen (s) + 1;
 
      s_dup = malloc (size);
 
      if (s_dup != NULL)
      {
         memcpy (s_dup, s, size);
      }
   }
   return s_dup;
}
 
 
void trierindex (org * pindex, size_t n)
{
   size_t i = 1;
 
   while (i < n)
   {
      char *tmp = str_dup (pindex[i].sis);
 
      if (tmp != NULL)
      {
         int j = i - 1;
         while (j >= 0 && strcmp (tmp, pindex[j].sis) < 0)
         {
            strcpy (pindex[j + 1].sis, pindex[j].sis);
            j--;
         }
         strcpy (pindex[j + 1].sis, tmp);
         free (tmp), tmp = NULL;
      }
      i++;
   }
}
 
int main (void)
{
   org tabo[] =
   {
      {"BRABN", 2,},
      {"OPLO", 4,},
      {"PRO", 5,},
      {"GUSTAVE", 6,},
      {"ALAIN", 7,},
      {"XUPONT", 0,},
      {"KAPOUL", 9,},
      {"JAVERT", 3,},
      {"GREG", 2,},
      {"JOHN", 3},
   };
 
   trierindex (tabo, N (tabo));
 
   {
      size_t i;
      for (i = 0; i < N (tabo); i++)
      {
         printf ("%s\n", tabo[i].sis);
      }
   }
   return 0;
}


 
Mais attention, les noms ont été déplacés (triés), mais pas les nombres. C'est voulu ?
 
Sinon, pourquoi ne pas utiliser qsort() ?


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define N(a) (sizeof(a)/sizeof*(a))
 
typedef struct
{
   char sis[11];
   int indice;
}
org;
 
int compare (void const *a, void const *b)
{
   org const *pa = a;
   org const *pb = b;
 
   return strcmp (pa->sis, pb->sis);
}
 
int main (void)
{
   org tabo[] =
   {
      {"BRABN", 2,},
      {"OPLO", 4,},
      {"PRO", 5,},
      {"GUSTAVE", 6,},
      {"ALAIN", 7,},
      {"XUPONT", 0,},
      {"KAPOUL", 9,},
      {"JAVERT", 3,},
      {"GREG", 2,},
      {"JOHN", 3},
   };
 
   qsort (tabo, N (tabo), sizeof *tabo, compare);
 
   {
      size_t i;
      for (i = 0; i < N (tabo); i++)
      {
         printf ("%s (%d)\n", tabo[i].sis, tabo[i].indice);
      }
   }
   return 0;
}


Message édité par Emmanuel Delahaye le 04-04-2005 à 14:43:08

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

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