排序结构数组

Sorting array of structs

我定义了一个结构数组

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

但是没用。我该怎么做? 它抛出关于未命名类型的错误。

两个问题:

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;

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

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

  • return (one - two); 仅适用于 onetwo 的相当小的值。如果存在整数算术溢出,它将调用未定义的行为。例如one == INT_MAXtwo == -1one - two的值不是C语言指定的,在普通平台上很可能是returnINT_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) - (one < two) 的计算结果为 -1,如果它们相等,则为 0,否则为 1 .在 C 语言中,如果为假,比较求值为 0,如果为真,则求值为 1

排序功能应该这样使用:

qsort(mystr, array_count, sizeof(*mystr), sort_function);
  • 第二个参数是mystr指向的数组中的结构体个数。
  • 第三个参数是单个结构的大小:sizeof(mystr)是指针的大小,而不是指向的内容的大小。
  • 避免像 magic 这样的神秘名称...对类型、函数和变量使用描述性名称。