使用Qsort在C程序中对地址进行排序

时间:2012-10-29 00:51:54

标签: c sorting qsort

我试图通过内存地址对指针数组进行排序:

#include <stdio.h>
#include <stdlib.h>

typedef struct flist {
    int size;
    struct flist *blink;
    struct flist *flink;
} *Flist;

int compare(const void *x, const void *y)
{
    Flist a = (Flist)x;
    Flist b = (Flist)y;

    if(a < b)
        return -1;
    else
        return 1;
}

int main()
{
    int a[] = {3, 1, 2, 4, 0};
    Flist b[5];
    int i;

    for(i = 0; i < 5; i++)
        b[a[i]] = (Flist)malloc(12);

    printf("Here is the array before sorting:\n");
    for(i = 0; i < 5; i++)
        printf("%p\n", b[i]);

    qsort(b, 5, sizeof(Flist), compare);

    printf("Here is the array after sorting:\n");
    for(i = 0; i < 5; i++)
        printf("%p\n", b[i]);
}

但是,该程序对地址的顺序没有影响:

这是排序前的数组:
0x759090
0x759030
0x759050
0x759010
0x759070
这是排序后的数组:
0x759090
0x759030
0x759050
0x759010
0x759070

任何建议都会非常感谢!

2 个答案:

答案 0 :(得分:2)

compare接收数组元素的地址。这些当然已经按顺序进行了。

要按值排序,您需要将compare更改为

int compare(const void *x, const void *y)
{
    Flist a = *(Flist*)x;
    Flist b = *(Flist*)y;

    if(a < b)
        return -1;
    else if (a == b)
        return 0;
    else
        return 1;
}

但由于指针并非都指向同一个数组(或者指向一个结尾),因此它在技术上是未定义的行为。

答案 1 :(得分:1)

您缺少一个间接级别:qsort发送正在排序的元素的地址,而不是元素本身。

在您的情况下,您将看到传递的Flist元素地址的地址。在转换为Flist*(指向指针的指针)之后,您需要取消引用传入的指针:

int compare(const void *x, const void *y) {
    Flist a = *((Flist*)x);
    Flist b = *((Flist*)y);

    if(a < b)
        return -1;
    else
        return 1;
}