我正在尝试找出如何对指向结构的指针数组进行排序,其中可能包含空指针。但我无法解决这个问题,并且在排序后不断发生崩溃。
我有两个结构,CAR
和 CARLIST
:
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/