Pas de dépendances
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char nom[50]; int age; } Personne; void Afficher(Personne P[],int n) { int i; for(i=0;i<n;i++) printf("\t%s \t %d ans\n",P[i].nom,P[i].age); } int Tri_age(const void* a,const void* b) { Personne* pa=(Personne*)a; Personne* pb=(Personne*)b; return pa->age - pb->age; } int Tri_nom(const void* a,const void* b) { Personne* pa=(Personne*)a; Personne* pb=(Personne*)b; return strcmp(pa->nom,pb->nom); } int main() { Personne P[4] = {{"Pierre",20},{"Yves",50},{"Steph",18},{"Claude",27}}; printf("Affichage brut :\n"); Afficher(P,4); printf("Tri selon age :\n"); qsort(P,4,sizeof(Personne),Tri_age); Afficher(P,4); printf("Tri selon nom :\n"); qsort(P,4,sizeof(Personne),Tri_nom); Afficher(P,4); return 0; }
Nous avons vu dans l'exemple précédent que qsort permet de trier des tableaux de int. Mais on peut aussi l'utiliser pour trier des structures, selon des critères choisis. Ici, je définis une structure Peronne, et je fais un tableau de 4 éléments, que je remplis au début du main. J'affiche (dans le désordre), puis je trie selon l'age, j'affiche, puis je trie selon le nom, et je réaffiche. Notez les fonctions appelées par qsort Tri_age, et Tri_nom. Les choses sont simples : les pointeurs void* que je reçois sont des pointeurs vers les éléments du tableau. L'élément du tableau ici étant une structure Personne, mes deux premières lignes castent les pointeurs. Pour l'age il me suffit de renvoyer la différence entre les ages. Pour les nom, la fonction strcmp le fait pour moi (elle renvoie 0 si les chaines sont égales, un nombre négatif si la première est alphabétiquement avant, et positif si elle est alphabétiquement après).