c - 需要对指向结构的动态指针数组进行排序,其中可能包含 NULL 指针

标签 c pointers struct qsort

我正在尝试找出如何对指向结构的指针数组进行排序,其中可能包含空指针。但我无法解决这个问题,并且在排序后不断发生崩溃。

我有两个结构,CARCARLIST: CARLIST 有一组指向 CARS 的指针。我只是做对了。

感谢任何帮助...

typedef struct Car {
    int parked_Total_Minutes;
    char rz[10];
} CAR;

typedef struct CarList {
    CAR **p_cars;
    unsigned int count;
    unsigned int size;
} CARLIST;

int Compare_ParkedTime(const void *a, const void *b) {
     if (a == NULL)
          return -1;

     if (b == NULL)
          return 1;

     CAR *aa = *(CAR* const *)a;
     CAR *bb = *(CAR* const *)b;

     return  (bb->parked_Total_Minutes < aa->parked_Total_Minutes) - (aa->parked_Total_Minutes < bb->parked_Total_Minutes);
}

int main() {
    ....
    CARLIST *p_AllCars = (CARLIST *)malloc(sizeof(CARLIST));
    p_AllCars->count = 0;
    p_AllCars->size = 10;
    p_AllCars->p_cars = malloc(p_AllCars->size * sizeof(CAR *));

    for(int i = 0; i < p_AllCars->size; i++)
         p_AllCars->p_cars[i] = NULL;

    ... other logic generating cars ...

    qsort((void*)p_AllCars->p_cars, p_AllCars->size, sizeof(CAR*), Compare_ParkedTime);

    ...
}

最佳答案

比较函数获取待排序数组内部的指针。您应该首先从这个数组中读取指针,然后测试 NULL

如果两个指针都是 NULL 并且可能使空指针大于其他值,则您应该返回 0。

这是比较函数的更正版本:

int Compare_ParkedTime(const void *a, const void *b) {
    /* read the pointer values */
    CAR *aa = *(CAR * const *)a;
    CAR *bb = *(CAR * const *)b;

    /* sort NULL pointers to the end of the array */
    if (aa == NULL)
        return (bb != NULL);
    if (bb == NULL)
        return -1;

    /* sort by increasing value of parked_Total_Minutes. swap aa and bb for decreasing order */
    return (bb->parked_Total_Minutes < aa->parked_Total_Minutes) -
           (aa->parked_Total_Minutes < bb->parked_Total_Minutes);
}

关于c - 需要对指向结构的动态指针数组进行排序,其中可能包含 NULL 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54645080/

相关文章:

c - 在初始化 `float` 时转换为 `f` 和添加 `float` 作为后缀有什么区别?

c - multiArray 和 multiArray[0] 和 &multiArray[0] 一样吗?

c - 使用套接字的 Http 客户端程序无法正常工作

c++ - 这两种结构的写法是一样的吗?

serialization - 结构体到磁盘的高效 Go 序列化

c - 为什么 cuda 中的 in-kernel-printf 在显示在显示器上之前将字符串输出到主机?

c - 严格的别名规则真的是 "two-way street"吗?

c - 使用数组和 strcat 将字符附加到字符串

c++ - 无法在 VB.NET 中使用带有来自 Visual C++ DLL 的指针参数的函数

c - 如何在 Objective-C 的结构中将 NSString 的值存储为 char 数组?