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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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;
 
        }
    }
}