Rechercher : dans
Par :

[C] tri sur liste chainée

Dernière réponse le 15 jan 2008 à 14:42:04 LunaSev, le 24 mai 2007 à 17:27:12 
 Signaler ce message aux modérateurs

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!
Configuration: Windows XP
Internet Explorer 7.0

Meilleures réponses pour « [C] tri sur liste chainée » dans :
Langage C - Les listes chaînées Voir La notion de structure autoréferrentielle Une structure autoréferrentielle (parfois appelée structure récursive) correspond à une structure dont au moins un des champs contient un pointeur vers une structure de même type. De cette façon on crée...
Liste simplement chaînée VoirLISTES SIMPLEMENT CHAINÉES Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la liste IV. Opérations sur les listes chaînées A. Initialisation B. Insertion d'un élément dans la liste 1. Insertion...
Introduction à la STL en C++ (standard template library) VoirIntroduction Principales classes de la STL std::pair std::list std::vector std::set std::map Les iterators iterator et const_iterator reverse_iterator et const_reverse_iterator Les algorithmes ...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...
Langage C - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...

1

ibcol, le 15 jan 2008 à 14:26:33

Lunasev,
jai bcp aimé ton programme .Meme sil n est pas achevé , moi j y trouve deja plein de truc interessant
Tu me rends service sans l savoir
Merci

Répondre à ibcol

2

 SebManfred, le 15 jan 2008 à 14:42:04

Salut,
tout d'abord, essaie tant que possible de faire des fonctions monoblock comme ton main... ton porgramme est encore assez petit, et on peut s'y retrouver, mais plus ça va aller, et plus tu vas avoir des programmes volumineux.
fais donc une fonction tri() que tu appelle juste après ton case 6: et juste avant ton break;
ensuite, il s'agit de réodonner les maillons de ta chaine, tu n'as pas besoin de tout ces pointeurs noeud, tu possède déjà les maillons, il suffit de les prendre d'une chaine pour les mettre dans une autre mais dans le bon ordre. par exemple, si tu as une chaine avec des maillons A, B et C, et que dans l'ordre de ton tri, a vient avant C mais après B, tu commence par A, tu le prend de la chaine source et tu le met dans la chaine destination, puis tu prend le maillon B et tu le met AVANT le maillon A dans ta chaine destination et tu termine par le maillon C que tu mets après le maillon A, et ta chaine est triée.
attention, n'oublie pas, quand tu prend un maillon dans ta chaine source, de modifier ton pointeur de tête pour qu'il pointe vers le maillon suivant, sinon, tu vas perdre des liens vers tes maillons et tu vas avoir une fuite mémoire (grand classique)
attention également, lorsque tu mets un maillon en queue de chaine, de bien mettre ton pointeur suivant à null, sinon, tu vas pointer sur le reste de ta liste source

Répondre à SebManfred
Collection CommentÇaMarche.net