Написание функции сравнения для qsort - PullRequest
0 голосов
/ 31 июля 2011

Я пишу функцию сравнения, которая сравнивает и упорядочивает имена в порядке возрастания фамилии и, если обе фамилии совпадают, в порядке убывания имен. Функция, которую я сейчас имею, не будет этого делать.

Вот функция:

int namecmp(const void *p, const void *q)
{
    const name *pp = p;
    const name *qq = q;
    int n;

    if((n = strcmp(pp->last, qq->last)) != 0)
        return n;

    return qq->first - pp->first;
}

Я пытаюсь организовать динамический массив структур, вот мои структуры.

typedef struct
{
char last[NAMESIZE];
char first[NAMESIZE];
}name;

typedef struct
{
int id;
name name;
float score;
}record;

typedef struct {
record *data; /* the dynamic array */
size_t nalloc; /* number of records allocated */
size_t nused; /* number of records in use */
} record_list;

и вот как называется qsort.

qsort(list->data, list->nused, sizeof(list->data[0]), namecmp);

Любая помощь будет оценена.

РЕДАКТИРОВАТЬ: я сделал то, что вы предложили, теперь у меня неправильный вывод.

мой вывод:

3456789 Burns, Monty: 100.00
4567890 Simpson, Lisa: 95.00
1234567 Simpson, Homer: 35.50
6666666 Simpson, Bart: 45.00
2345678 Flanders, Ned: 99.50

РЕДАКТИРОВАТЬ 2:

Как сохранить строку в структуре.

            if(sscanf(line,"%s", lastname) == 1)
        {

            if(strlen(lastname) < NAMESIZE)
            {
                lastname[0] = toupper((int)lastname[0]);
                strcpy(rec->name.last, lastname);
                break;
            }
        }

Ответы [ 2 ]

4 голосов
/ 31 июля 2011

Вам также необходимо вызвать strcmp для имени, иначе это не сработает (так как это просто вычитание адресов в памяти).Измените последнюю строку на

return strcmp(pp->first, qq->first);
0 голосов
/ 31 июля 2011

Функция сравнения имеет два сравнения (отредактированное), но в другом порядке. Первый имеет strcmp (p, q), а оператор return имеет strcmp (q, p). Сделайте их такими же, и это сработает !!

Шаша

...