Вам просто нужно определить две разные функции сравнения.Каждая функция сравнения должна иметь два указателя для аннулирования (в этом случае вы должны привести их к типу Emp **
) и затем вернуть отрицательное целое число, ноль или положительное целое число, если первая запись меньше, равна илибольше, чем второе, соответственно.
Для сортировки на основе итогов вы можете просто вычесть вторую total
из первой.Если первое итоговое значение меньше второго, это приводит к отрицательному числу, и наоборот, если первое итоговое значение больше второго.Когда они равны, возвращается ноль.
int compareByTotal(const void *first, const void *second)
{
int firstTotal = (*(Emp **)first)->total;
int secondTotal = (*(Emp **)second)->total;
return firstTotal - secondTotal;
}
Второй, поскольку это сравнение строк, может возвращать значение strcmp
(которое подчиняется тем же соглашениям о возвращаемых значениях):
int compareByName(const void *first, const void *second)
{
const char *firstName = (*(Emp **)first)->name;
const char *secondName = (*(Emp **)second)->name;
return strcmp(firstName, secondName);
}
Тогда вы можете просто позвонить qsort
, передав им имена функций:
/* given: */
Emp *nameArray[empSize];//an array of pointers to point to entries alphabetically
Emp *salesArray[empSize]; //an array of pointers to pointing to entries by sales
/* use: */
qsort(nameArray, empSize, sizeof(*nameArray), &compareByName);
qsort(salesArray, empSize, sizeof(*salesArray), &compareByTotal);