qsort запись (массив символов) в порядке убывания

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

Код для распечатки записей:

void print_records_by_name(record_list *list, int argc, const char *argv[])
{
    size_t i;

    if (argc == 2) {
        if (strcmp(argv[1], "+n") == 0) {
            qsort(list->data, list->nused, sizeof(record), sort_name_asc);
        } else if (strcmp(argv[1], "-n") == 0) {
            qsort(list->data, list->nused, sizeof(record), sort_name_des);
        }
    }

    for (i = 0; i < list->nused; i++) {
        fprintf(stdout, "%s %s %d\n", list->data[i].name.last, list->data[i].name.first, list->data[i].score);
    }
}

У меня есть код для сортировки по возрастанию:

int sort_name_asc(const void *p, const void *q)
{
    const record *pp = p;
    const record *qq = q;
    int n1, n2;

    n1 = strcmp(pp->name.first, qq->name.first);
    n2 = strcmp(pp->name.last, qq->name.last);

    if (n2 == 0) {
        return n1;
    }

    return n2;
}

Это то, что у меня есть для убывания:

int sort_name_des(const void *p, const void *q)
{
    const record *pp = p;
    const record *qq = q;
    int n1, n2;

    n1 = strcmp(qq->name.first, pp->name.first); /*just switched the pp and qq*/
    n2 = strcmp(qq->name.last, pp->name.last); /*just switched pp and qq*/

    if (n2 != 0) {
        return n1;
    }

    return n2;
}

Я скомпилировал его, и он не работает, есть идеи, как это сделать?

Спасибо


person user2122151    schedule 27.11.2013    source источник
comment
Я почти уверен, что это не работает. Ты не уверен? Почему ты не уверен?   -  person ryyker    schedule 27.11.2013
comment
Я почти уверен, что это не работает. Не могли бы вы уточнить, или это предполагается игра в угадайку?   -  person Kninnug    schedule 27.11.2013
comment
Я скомпилировал его, и он не распечатывает его ни по убыванию, ни по сортировке   -  person user2122151    schedule 27.11.2013
comment
Посмотрите на выходные данные функции strcmp(), которые помогут вам понять, какие моды нужно сделать, и решить эту проблему...   -  person ryyker    schedule 27.11.2013
comment
qsort(list->data, list->nused, sizeof(record), sort_name_des); эта строка выглядит неправильно. Является ли list-›data массивом вещей или просто одним элементом?   -  person ryyker    schedule 27.11.2013
comment
это из динамической памяти, так что это будет в массиве вещей   -  person user2122151    schedule 27.11.2013
comment
Ну, это как сказать, что оно пришло извне, поэтому оно будет фиолетовым. Какое отношение поступление из динамической памяти имеет к типу данных? Можете ли вы уточнить, пожалуйста?   -  person ryyker    schedule 28.11.2013
comment
@ user2122151 - я до сих пор не уверен, точно что вы спрашиваете или как выглядят ваши данные, но в середине всего этого вы, кажется, спрашиваете, как отсортировать массив строк в обоих порядке возрастания и убывания. Я привел небольшой пример ниже, чтобы увидеть, сработает ли это для вас.   -  person ryyker    schedule 28.11.2013


Ответы (2)


Поскольку вы поменяли местами указатели во второй функции, вам нужно сохранить ту же логику.

if (n2 == 0) {
    return n1;
}

Или просто:

int sort_name_des(const void *p, const void *q)
{
    return -sort_name_asc(p, q);
}
person egur    schedule 27.11.2013

Поскольку я не знаю, как выглядит record_list *list, то есть:

Я не уверен, что утверждение qsort(list->data, list->nused, sizeof(record), sort_name_asc); верно, что list->data действительно является массивом, или что list->used действительно является количеством элементов в массиве...

Итак, я просто проиллюстрирую сравнение строк в порядке возрастания и убывания и надеюсь, что это поможет вам:

Примечание: функции сравнения идентичны, за исключением возвращаемого значения...

#include <ansi_c.h>

static int sortstringAscending( const void *str1, const void *str2 );
static int sortstringDescending( const void *str1, const void *str2 );

int main(void)
{
    int i;
    char string1[10][4] = {"eee","bbb","jjj","ddd","aaa","fff","ggg","iii","hhh","ccc"};

    //Important that you populate the qsort function with the right values
    //that is qsort(StringArray, numElemetsInArray, sizeOfEachElement, sortFunction);

    qsort(string1, 10, 4,sortstringAscending);
    for(i=0;i<10;i++) printf("string %d is: %s\n", i, string1[i]);
    printf("\n");
    qsort(string1, 10, 4,sortstringDescending); 
    for(i=0;i<10;i++) printf("string %d is: %s\n", i, string1[i]);

    getchar();

    return 0;
}

static int sortstringAscending( const void *str1, const void *str2 )
{
    const char *rec1 = (const char *)str1;
    const char *rec2 = (const char *)str2;
    int val = strcmp(rec1, rec2);

    return val;
}

static int sortstringDescending( const void *str1, const void *str2 )
{
    const char *rec1 = (const char *)str1;
    const char *rec2 = (const char *)str2;
    int val = strcmp(rec1, rec2);

    return -1*val;//Because of the way strcmp() works, 
                  //this simple change causes the results 
                  //to be reversed for a string array
}
person ryyker    schedule 27.11.2013