2013-11-27 1 views
0

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

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

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; 
} 

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

Благодаря

+0

_I'm уверен, что это не work_. Ты не уверен? Почему ты не уверен? – ryyker

+0

* «Я уверен, что это не работает» *. Не хотите ли вы уточнить, или это сумасшедшая игра? – Kninnug

+0

Я скомпилировал его и не распечатывал ни нисходящий, ни отсортированный – user2122151

ответ

0

Поскольку я не знают, что 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 
} 
0

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

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

Или просто:

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