LunaSev
Messages postés9Date d'inscriptionmercredi 4 avril 2007StatutMembreDernière intervention24 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!
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);
}
SebManfred
Messages postés484Date d'inscriptionmardi 28 août 2007StatutMembreDernière intervention20 mai 2011128 15 janv. 2008 à 14:42
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