使用qsort对struct指针数组进行排序

前端之家收集整理的这篇文章主要介绍了使用qsort对struct指针数组进行排序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
尝试在这个结构数组上使用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

它不是按部门排序,而是按反向到达时间排序.我真的完全失去了导致这种行为的原因.

解决方法

您的代码表明您实际上正在尝试对指向struct的数组进行排序.

在这种情况下,您缺少一个间接级别.您也可以改变您的指示.

你的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&C++相关文章