[C] tri sur liste chainée

Fermé
LunaSev Messages postés 9 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 24 mai 2007 - 24 mai 2007 à 17:27
 Monta_1SIL1_ISI - 12 mai 2010 à 00:17
Bonjour,
je n'arrive pas à faire un tri sur liste chainée. Il ne faut pas le faire lors de la saisie, mais à la demande de l'utilisateur (car je travaille sur une structure donc il faut pouvoir trier par nom, prénom, identifiant...).
C'est la seule partie du programme que je n'arrive pas à faire, et ça fait maintenant une semaine que je suis dessus!

Si quelqu'un pouvait m'aider, ce serait vraiment sympa!


sinon, j'ai une autre question, j'utilise la fonction strcmp , ou encore system("pause") mais je n'ai pas besoin de mettre de bibliothèque, il compile. Mais certaines fois, quand j'enregistre mon programme sous un autre nom, il ne veut plus compiler... Pourquoi?

Voici mon programme (la fonction tri est en gras!):
#include <stdio.h>
struct sDate
{
       int Jour;
       int Mois;
       int Annee;
};
typedef struct structurePersonne
{
       char Nom[20];
       char Prenom[20];
       char Sexe[1];
       struct sDate Date;
       char ident[5];
       int nbEnfant;
}sPersonne;
typedef struct n
{
        sPersonne personne;
        struct n* suivant;
}NOEUD;
/*marche*/      
NOEUD* initialiser()
{
          return NULL;
}
/*marche*/
sPersonne Copie(sPersonne copiage, sPersonne personne)
{
          memcpy(&copiage,&personne,sizeof(personne));
          return(copiage);
}
/*marche*/
NOEUD* insererEnTete(NOEUD* debut, sPersonne personne)
{
       NOEUD* nouveau;
       nouveau=(NOEUD*)malloc(sizeof(NOEUD));
       if(nouveau!=NULL)
       {
                 nouveau->suivant=debut;
                 nouveau->personne=Copie(nouveau->personne,personne);                
       }
       return nouveau;
}
/*marche*/
void affichage(sPersonne personne)
{
     printf("%20s|%20s|%4s|%2d-%2d-%4d|%5s|%9d\n",personne.Nom,personne.Prenom,personne.Sexe,personne.Date.Jour,personne.Date.Mois,personne.Date.Annee,personne.ident,personne.nbEnfant);
     return;
}

NOEUD* Chercher(NOEUD* rech,int recher)
{
       int j=0,i=0;
       sPersonne personne;
       NOEUD* trouver;
       int result;
       /*while((i>1)||(j==0))
       {*/
            if/*(*/(recher==1)/*||(i>1))*/
            {
                  printf("ENTRER NOM : ");
                  scanf("%s",personne.Nom);       
                  while (rech!=NULL)
                  {
                          result=strcmp(rech->personne.Nom, personne.Nom);
                          if (result==0) 
                          {
                                trouver=rech;
                                affichage(trouver->personne);
                                i++;
                          }
                          rech=rech->suivant;
                  }
            }
            if/*(*/(recher==2)/*||(i>1))*/
            {
                  printf("ENTRER PRENOM : ");
                  scanf("%s",personne.Prenom); 
                  while (rech!=NULL)
                  {
                          result=strcmp(rech->personne.Prenom, personne.Prenom);
                          if (result==0) 
                          {
                                 trouver=rech;
                                 affichage(trouver->personne);
                                 i++;
                          }
                          rech=rech->suivant;
                  }
            }
            if/*(*/(recher==3)/*||(i>1))*/
            {
                  printf("ENTRER IDENTIFIANT : ");
                  scanf("%s",personne.ident); 
                  while (rech!=NULL)
                  {
                          result=strcmp(rech->personne.ident, personne.ident);
                          if (result==0) 
                          {
                                 trouver=rech;
                                 affichage(trouver->personne);
                                 i++;
                          }
                          rech=rech->suivant;
                  }
            }
            if/*(*/(recher==4)/*||(i>1))*/
            {
                  printf("ENTRER SEXE : ");
                  scanf("%s",personne.Sexe); 
                  while (rech!=NULL)
                  {
                          result=strcmp(rech->personne.Sexe, personne.Sexe);
                          if (result==0) 
                          {
                                 trouver=rech;
                                 affichage(trouver->personne);
                                 i++;
                          }
                          rech=rech->suivant;
                  }
            }
            j++;
       /*}*/
       if(i==0) printf("la personne n'existe pas\n");
       if(i==1)
       return(trouver);
       else return 0;
}

NOEUD* ChercherPrec(NOEUD* personne,NOEUD*debut)
{
     int result=1;
     while ((debut!=NULL)&&(result!=0))
                  {
                          if(debut->suivant==personne)result=0;
                          if (result!=0) debut=debut->suivant;
                  }
     
     return(debut);
}

NOEUD* Modifier(NOEUD* modif)
{
     int choix,choix2=1;
     while(choix2==1)
     {
            printf("\nMODIFIER : \n1- NOM\n2- PRENOM\n3- SEXE\n4-DATE DE NAISSANCE\n5- IDENTIFIANT\n6-NOMBRE ENFANT\n");
            scanf("%d",&choix);
            switch(choix)
            {
                  case(1) :
                  {
                          printf("ENTRER LE NOUVEAU NOM : ");
                          scanf("%s",modif->personne.Nom);
                          break;
                  }
                  case(2) :
                  {
                          printf("ENTRER LE NOUVEAU PRENOM : ");
                          scanf("%s",modif->personne.Prenom);
                          break;
                  }
                  case(3) :
                  {
                          printf("ENTRER LE NOUVEAU SEXE : ");
                          scanf("%s",modif->personne.Sexe);
                          break;
                  }
                  case(4) :
                  {
                          printf("ENTRER LA NOUVELLE DATE DE NAISSANCE : ");
                          scanf("%d %d %d",&modif->personne.Date.Jour,&modif->personne.Date.Mois,&modif->personne.Date.Annee);
                          break;
                  }
                  case(5) :
                  {
                          printf("ENTRER LE NOUVEAU IDENTIFIANT : ");
                          scanf("%s",modif->personne.ident);
                          break;
                  }
                  case(6) :
                  {
                          printf("ENTRER LE NOUVEAU NOMBRE ENFANTS : ");
                          scanf("%d",&modif->personne.nbEnfant);
                          break;
                  }
            }
            printf("VOULEZ VOUS FAIRE UNE AUTRE MODIFICATION(1=OUI ou 0=NON) : ");
            scanf("%d",&choix2);
     }
                  
     return(modif);
}


main()
{
      NOEUD* debut;
      NOEUD* point;
      sPersonne personne; 
      int choix;
      int menu,recher,tri;         
      debut= initialiser();
      /*menu*/    
      while (choix!=0)
      {  
         printf("\n1- Ajouter une personne\n2- Supprimer une personne\n3- Consulter\n4- Rechercher\n5- Modifier\n6- Trier\n7- Quitter\n");
         scanf("%d",&menu);         
         switch(menu)
         {/*marche*/
             case(1):
             {
                /*entrer donnee*/
                 printf("NOM : ");
                 scanf("%s",personne.Nom);
                 printf("\nPRENOM : ");
                 scanf("%s",personne.Prenom);
                 printf("\nSEXE : ");
                 scanf("%s",personne.Sexe);
                 printf("\nDATE DE NAISSANCE : ");
                 scanf("%d",&personne.Date.Jour);
                 scanf("%d",&personne.Date.Mois);
                 scanf("%d",&personne.Date.Annee);
                 printf("\nIDENTIFIANT : ");
                 scanf("%s",personne.ident);
                 printf("\nNOMBRE D'ENFANTS : ");
                 scanf("%d",&personne.nbEnfant);                                 
                 debut = insererEnTete(debut, personne);
                 break;                               
             }             
             case(2):
             {     
                int recher=1;   
                NOEUD* cherch;
                NOEUD* trouver;
                NOEUD* prec;
                cherch=debut;
                trouver=Chercher(cherch,recher);
                prec=ChercherPrec(trouver,debut);
                prec->suivant=trouver->suivant;
                /*free(trouver);   */         
                break;         
             }
             /*marche*/
             case(3):
             {                
                point=debut;
                printf("%20s|%20s|%4s|%10s|%5s|%9s\n","NOM","PRENOM","SEXE","DATE NAISS","IDENT","NB ENFANT");
                while(point!=NULL)
                {
                       affichage(point->personne);
                       point=point->suivant;
                }                                                 
                 break;                           
             }             
             case(4):
             {   
                printf("1- Par nom\n2- Par prenom\n3- par identifiant\n4- par sexe\n");
                scanf("%d",&recher);
                NOEUD* cherch;
                NOEUD* trouver;
                cherch=debut;
                trouver=Chercher(cherch,recher);
                break;
             }             
             case(5):
             {  
                 int recher=1;   
                 NOEUD* cherch;
                 NOEUD* trouver;
                 cherch=debut;
                 trouver=Chercher(cherch,recher);
                 trouver=Modifier(trouver);             
                 break; 
             }             
             case(6):
             {
                printf("1- Par nom\n2- Par prenom\n3- par identifiant\n");
                scanf("%d",&tri);
                switch(tri)
                {                           
                           case(1):
                           {
                                   NOEUD* trier;
                                   trier=debut;
                                   NOEUD* suiv;
                                   NOEUD* prec1;
                                   NOEUD* prec2;
                                   NOEUD* intermediaire;
                                   affichage(trier->personne);
                                   while (trier!=NULL)
                                   {
                                         suiv=trier->suivant;
                                         affichage(suiv->personne);
                                         while(suiv!=NULL)
                                         {
                                                          if (strcmp(trier->personne.Nom,suiv->personne.Nom)== 1)
                                                          {
                                                               
                                                               prec2=ChercherPrec(suiv,debut);
                                                               affichage(prec2->personne);
                                                               
                                                               intermediaire->suivant=suiv->suivant;
                                                               suiv->suivant=trier->suivant;
                                                               trier->suivant=intermediaire->suivant;
                                                               prec2->suivant=trier;
                                                               if(trier!=debut)
                                                               {
                                                                      prec1=ChercherPrec(trier,debut);
                                                                      prec1->suivant=suiv;
                                                               }
                                                               
                                                               trier=suiv;
                                                               affichage(trier->personne);
                                                               
                                                               if (trier==debut)
                                                                       debut=trier;                                                               
                                                          }                   
                                                          suiv=suiv->suivant;
                                          }
                                          trier=trier->suivant;
                                  }                                                           
                                   break;
                           }
                           case(2):
                           {
                                   break;
                           }             
                }
                break; 
             } 
             /*marche*/
             case(7) :
             {
                 choix=0;         
                 break; 
             }  
         }
      }
      system("pause");
      return 0;
}


j'espère recevoir de l'aide, car là, je ne sais vraiment plus comment faire!

3 réponses

exemple facile(entiers et par valeurs) de tri? si ça peut aider ...
liste tri(liste L)
{
liste i,j,min;
int aux;
for (i=L; i->suiv != NULL; i=i->suiv)
{
min=i;
for (j=i->suiv; j != NULL; j=j->suiv)
{
if (j->val < min->val)
min=j;
}
if (min != i)
{
aux=min->val;
min->val = i->val;
i->val = aux;
}
}
return(L);
}
5