c - 使用 qsort 对结构指针数组进行排序

标签 c struct qsort

我在尝试对这个结构数组使用 qsort 时得到了奇怪的结果。

我有这个结构:

struct access_data{
    int sector;
    int arrival_time;
    int checked;
    int processed;
};

我从一个文件构造了一个 access_data 指针数组,以便它们按到达时间排序,但稍后我需要按扇区对它们进行排序,因此我有以下内容:

int compare_data(const void* a, const void* b){
    if (((access_data*)a)->sector < ((access_data*)b)->sector)
        return 1;
    else if (((access_data*)a)->sector > ((access_data*)b)->sector)
        return -1;
    else
        return 0;
}

void scan(access_data* data[], int len, int sec_to_sec_seek){
    qsort(data, len, sizeof(access_data*), &compare_data);

    show_data(data, len);
}

show_data 只是打印数据,但我在示例输入中得到以下信息;再次,已经按到达时间排序:

data[0]: arrival_time: 7, sector: 3
data[1]: arrival_time: 6, sector: 8
data[2]: arrival_time: 5, sector: 6
data[3]: arrival_time: 4, sector: 5
data[4]: arrival_time: 3, sector: 12
data[5]: arrival_time: 2, sector: 10
data[6]: arrival_time: 1, sector: 1
data[7]: arrival_time: 0, sector: 2

根本不是按扇区排序,而是按到达时间倒序排序。我真的完全不知道是什么导致了这种行为。

最佳答案

您的代码表明您实际上正在尝试对指向结构的指针数组进行排序。

在这种情况下,您缺少一个间接级别。您的方向也颠倒了。

您的 compare_data 例程适用于对结构数组进行反向排序,但您希望根据指针指向的内容对指针数组进行排序。

int compare_pointed_to_data(const void* a, const void* b) {
    // a is a pointer into the array of pointers
    struct access_data *ptr_to_left_struct = *(access_data**)a;
    struct access_data *ptr_to_right_struct = *(access_data**)b;

    if ( ptr_to_left_struct->sector < ptr_to_right_struct->sector)
        return -1;
    else if (ptr_to_left_struct->sector > ptr_to_right_struct->sector)
        return 1;
    else
        return 0;
}

关于c - 使用 qsort 对结构指针数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23689687/

相关文章:

c - 在c中分配内存时写入、读取无效

c - 大于 BST 中某个数字的节点之和

对指向字符串的指针数组进行排序时崩溃

c - 如何修复qsort覆盖值,为什么会这样?

c - 在C中使用kbhit控制机器人的BGI绘图

c - mpi 中的进程以什么顺序执行...我的意思是排名顺序?例如 : rank==0 first and rank==1 next?

c - 二叉树实现: issues with insert_tree()

c++ - 我应该如何在 typedef 中定义一组位数?

c - 对绑定(bind)结构元素进行排序

c - K&R快速排序问题