Tri Liste doublement chainée
Je me suis inspiré de ce codage de tri d'entier pour pouvoir l'effectuer avec des caractères, je cherche à trier des noms. Ne pouvant pas utiliser les deux dernières avec des caractères j'ai utilisé la fonction strcpy mais le résultat n'est pas ce que j'attendais .En effet, il place toujours le dernier nom en premier et après c'est un bordel. L'affichage des prénoms et numéro également sont mal placé. Ca fait plusieurs jours je suis bloqué, j'ai procédé à de nombreux test mais rien ne marche. Merci d'avance.
Code inspiré:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
void trier(liste la)
{// ici on va ranger les elements dans l'ordre croisssant avant de les afficher.
liste temp, temp1, temp3;
int min;
for(temp=la ; temp!=NULL ; temp=temp->next)
{
temp3=temp;
min=temp->val;
for(temp1=temp->next ; temp1!=NULL ; temp1=temp1->next)
{
if(min > temp1->val)
{
temp3=temp1; // le 3è temporaire est l'adresse de l'élement où se trouve le minimum
min=temp3->val;
}
}
temp3->val=temp->val; //echange des 2 elements...
temp->val=min;
}
} |
Mon codage:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
void tri_stable(t_elem *prem)
{
t_elem *temp, *temp1, *temp2;
char* min;
for(temp=prem ; temp!=NULL ; temp=temp->suiv)
{
temp2=temp;
min=temp->nom;
for(temp1=temp->suiv ; temp1!=NULL ; temp1=temp1->suiv)
{
if(strcmp(temp1->nom,min)<0)
{
temp2=temp1;
min=temp2->nom;
}
}
strcpy(temp2->nom,temp->nom);
strcpy(temp->nom,min);
printf("\nNom : %s\n",temp->nom);
printf("Prenom : %s\n",temp->prenom);
printf("Numero : %s\n\n",(temp->numero));
}
} |
Voici ma structure, ma fonction ajouter et mon main:
Structure :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
typedef struct elem
{
char nom[50]; //nom du client
char prenom[50]; //prenom du client
char numero[11]; //numero telephone du client
struct elem *suiv;
struct elem *prec;
} t_elem; |
Ajouter :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| void ajout_debut(t_elem **prem, t_elem *e) //Ajouter un element au debut
{
if (*prem) //Si deja des elements
{
e->suiv=*prem;
e->prec=NULL;
(*prem)->prec=e; //Lien vers precedent
*prem=e;
}
else //Si liste vide
*prem=e;
} |
Main :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| int main()
{
t_elem *premier=NULL; //premier element
t_elem *e; //nouvel element
int fin=0;
int choix;
printf("Operateur telephonique\n");
printf("------------------------\n");
while(fin!=1)
{
printf("1 Ajouter\n"
"2 Afficher\n"
"3 Trier\n");
scanf("%d",&choix);
switch(choix)
{
case 1: // Ajouter
init_elem(&e,premier);
ajout_debut(&premier,e);
break;
case 2: // Afficher chaine
//Afficher la liste :
afficher_chaine(premier);
break;
case 3:
tri_stable(premier);
break;
}
}
} |