排序结构数组

时间:2015-12-09 14:00:00

标签: c sorting qsort

我已经定义了一个结构数组

typedef struct sorting {
    int number
} SRT;

SRT *mystr = NULL;

我后来动态分配。 我希望按number int;

对其进行排序

我需要写什么样的函数才能让qsort这样做?我写了:

qsort(mystr,array_index,sizeof(mystr),magic);

int magic(const void *a, const void *b) {
    int one=((const struct mystr*)a)->number;
    int two(( const struct myst*)b)->number;

    return ( one-two);
}

但它没有用。我该怎么做? 它引发了关于不命名类型的错误。

2 个答案:

答案 0 :(得分:2)

您无法使用写入的函数对数组进行可靠的排序:

  • 它有语法错误,其中一些是拼写错误,另一些则表示类型,结构标记和变量名称之间的混淆。

  • return (one - two);仅适用于onetwo的合理较小值。如果存在整数算术溢出,它将调用未定义的行为。例如,如果one == INT_MAXtwo == -1,则{C}语言未指定one - two的值,而在通用平台上,它可能会返回INT_MIN,这是一个负值,导致错误的排序。

一个简单的解决方案就是:

int sort_function(const void *a, const void *b) {
    int one = ((const SRT*)a)->number;
    int two = ((const SRT*)b)->number;

    return (one > two) - (one < two);
}

如果(one > two) - (one < two)小于-1,则表达式one评估为two,如果0相等则为1,否则为0。在C中,如果为false,则比较评估为1,如果为真,则评估为qsort(mystr, array_count, sizeof(*mystr), sort_function);

排序功能应该这样使用:

mystr
  • 第二个参数是sizeof(mystr)指向的数组中的结构数。
  • 第三个参数是单个结构的大小:magic是指针的大小,而不是指向的大小。
  • 避免使用像 IDocumentQuery<T> context = session.Advanced.DocumentQuery<T>(); context = AddSearchToContext(context, _searchRequest.Search, _searchRequest.DataFilters.Any()); context = AddFiltersToContext(context, _searchRequest.DataFilters); context.Take(1).ToList(); RavenQueryStatistics stats = null; context.Statistics(out stats); return stats.TotalResults; 这样的神秘名称......对类型,函数和变量使用描述性名称。

答案 1 :(得分:0)

两个问题:

qsort(mystr,array_index,sizeof(mystr),magic);

mystr是指向SRT的指针,所以你传入指向结构的指针的大小,而不是结构的大小:

qsort(mystr,array_index,sizeof(STR),magic);

然后是这个:

int one=((const struct mystr*)a)->number;
int two(( const struct myst*)b)->number;

mystr是变量名,而不是类型,并且myst未在任何位置定义。你需要这里的类型名称:

int one=((const SRT *)a)->number;
int two=((const SRT *)b)->number;