J'ai besoin de trier un tableau de structures ayant chacun des membres avec différents types de données à l'aide de QSort.
typedef struct {
char* name;
int age;
float wage;
} employee;
3 Réponses :
Une fonction de comparaison appropriée pour le tri des objets de type Toutefois, chaque comparaison La fonction définit un moyen particulier de trier les objets. Si vous souhaitez fournir le tri sur différents critères, vous avez besoin d'une fonction de comparaison différente pour chaque méthode de commande. Cela n'a rien à voir sur le point de savoir si les membres ont tous le même type de données. P> P> Employee code> recevra des arguments qui pointent sur employé code> objets. Que chaque objet a des membres de plusieurs types affecte la manière dont vous impliqueriez une telle fonction, mais cela ne présente pas en soi une raison pour laquelle vous auriez besoin de plus d'une fonction.
Je voulais dire que je dois être capable de trier les employés par leur nom, leur âge, etc. séparément
Et cette réponse aborde cela, @ilyakozel.
Je n'ai lu pas jusqu'à la fin, désolé pour ça. Merci de m'aider
Dans tous les cas, vous devez écrire une fonction distincte pour chaque membre de données par lequel la matrice sera triée car dans la fonction, vous devez comparer les valeurs des membres de données concrets.
Cependant, vous pouvez écrire une fonction générale qui sera Fournir la fonction de comparaison requise pour un appel de QSort. p>
Voici un programme de démonstration. P>
Tom, 18, 3500.000000 Bob, 26, 4500.000000 Jim, 28, 4000.000000 Bob, 26, 4500.000000 Jim, 28, 4000.000000 Tom, 18, 3500.000000 Tom, 18, 3500.000000 Bob, 26, 4500.000000 Jim, 28, 4000.000000 Tom, 18, 3500.000000 Jim, 28, 4000.000000 Bob, 26, 4500.000000
Bon usage de const code> et (a> b) - (A idiome.
Cette fonction devrait accomplir ce que vous recherchez:
if (ret1 == 0) {
int ret2 = strcmp(emp1->name, emp2->name);
if (ret2 == 0)
return emp1->age - emp2->age;
else
return ret2;
} else if (ret1 > 0) {
return 1;
} else {
return -1;
}
Ainsi, pour effectuer les différentes commandes de tri, vous avez besoin de différentes corps à votre fonction, ou (meilleures et équivalentes) différentes fonctions - pas seulement une seule fonction.
@Jonathanleffler ne serait-ils pas des "blocs" et ne fonctionne pas?
Eh bien, si vous avez un mécanisme tel qu'une variable globale pour indiquer quel 'bloc' ( Déclaration composée ?) Pour exécuter, il pourrait s'agir de "blocs". Mais la variable globale est laide - elle serait plus simple (et sans doute plus performante, bien que à peine mesurable, donc) d'utiliser des fonctions de comparaison distinctes.
Réponse courte: oui.
Si vous souhaitez trier par différents membres, vous avez besoin d'un comparateur pour chaque membre.
Je dois fournir à un utilisateur la possibilité de trier les employés par nom par exemple
Très bien merci
Même s'ils sont les mêmes types de données, vous avez besoin de différents comparateurs, car le comparateur doit savoir quel membre comparer, non seulement comment comparer les valeurs.
La seule façon de le faire (de manière portant) avec un seul comparateur consiste à définir une variable globale avant d'appeler
qsort code>, puis vérifiez la variable globale dans le comparateur pour voir quel membre le comparateur. La solution non portable est la fonctionqsort_r code>, ce qui permet de transmettre des informations supplémentaires au comparateur. Voir cette question pour des informations de base sur les problèmes de portabilité avecqsort_r code>.