Besoin d’aide pour utiliser qsort avec un tableau de structures

Maintenant, j’ai vu divers exemples, mais je ne comprends pas ce qu’ils veulent dire.

Voici ma structure

typedef struct profile{ char gender[1]; double soc; . . . } PROFILE; 

où soc est le numéro de sécurité sociale que je vais sortinger.

Je sais que vous avez besoin d’une fonction de comparaison, mais je ne sais pas comment trouver exactement ce dont j’ai besoin.

Voici un exemple d’utilisation de qsort pour un tableau de structures en C

 /* qsort example */ #include  #include  typedef struct { int price; int id; } order; order list[6]; int i = 0; int compare (const void * a, const void * b) { order *orderA = (order *)a; order *orderB = (order *)b; return ( orderB->price - orderA->price ); } int main () { srand ( time(NULL) ); printf("Before sorting\n"); for(i=0; i<6; i++){ list[i].price = rand()%10; list[i].id = i; printf ("Order id = %d Price = %d \n",list[i].id, list[i].price); } printf("AFTER sorting\n"); int n; qsort (list, 6, sizeof(order), compare); for (n=0; n<6; n++) printf ("Order id = %d Price = %d \n",list[n].id, list[n].price); return 0; } 

J'espère que ça aide

Katerina Dimisortings

(tout ce qui concerne pitsi)

Votre Soc ne devrait presque certainement pas être de type double , mais voici un exemple de ce qu’une fonction de comparaison doit renvoyer:

 int compare(const void *p1, const void *p2) { const struct profile *elem1 = p1; const struct profile *elem2 = p2; if (elem1->soc < elem2->soc) return -1; else if (elem1->soc > elem2->soc) return 1; else return 0; } 

Merci de signaler le const void *.

Voici un exemple complet (archivé): Tri des structures avec la fonction C qsort ()

La version ssortingcte d’un comparateur prend deux indicateurs de vide constants:

 int compare(const void *v1, const void *v2) { const struct profile *p1 = v1; const struct profile *p2 = v2; if (p1->gender > p2->gender) return(+1); else if (p1->gender < p2->gender) return(-1); else if (p1->soc > p2->soc) return(+1); else if (p1->soc < p2->soc) return(-1); else return(0); } 

Ceci compare le champ genre en premier, puis le champ soc. Voici comment vous gérez toute comparaison en plusieurs parties.

Pour sortinger le tableau, utilisez qsort() et transmettez une fonction de comparaison.

En voici une qui produit le résultat correct pour toutes les valeurs possibles du membre de price :

 typedef struct profile { char gender[1]; double soc; int price; ... } PROFILE; int compare_price(const void *a, const void *b) { const PROFILE *oa = a; const PROFILE *ob = b; return (oa->price > ob->price) - (oa->price < ob->price); } int compare_soc(const void *a, const void *b) { const PROFILE *oa = a; const PROFILE *ob = b; return (oa->soc > ob->soc) - (oa->soc < ob->soc); } 

Remarques:

  • la simple soustraction de valeurs produit des résultats incorrects si la différence ne tient pas dans le type int . Par exemple, -2 et INT_MAX ne peuvent pas être comparés correctement avec la méthode de soustraction. Cela ne fonctionnerait pas non plus pour les valeurs en virgule flottante.

  • la méthode ci-dessus peut être utilisée pour tous les types comparables, y compris double sauf NaN .

Si vous souhaitez gérer NaN , voici comment les regrouper à la fin:

 #include  int compare_soc_nan_at_the_end(const void *a, const void *b) { const PROFILE *oa = a; const PROFILE *ob = b; if (isnan(oa->soc)) { return isnan(ob->soc) ? 0 : 1; } else if (isnan(ob->soc)) { return -1; } else { return (oa->soc > ob->soc) - (oa->soc < ob->soc); } }