C语言调用比较函数判断Student结构体数组是否有序问题
问题解决方案
- 关于compar函数的调用问题
你原代码中compar(i,i+1)的写法完全错误,compar要求的入参是两个指向待比较元素的指针,不是数组索引。正确的传参方式是compar(&stu[i], &stu[i+1]):stu是Student数组的首地址,&stu[i]就是第i个元素的指针,自动匹配compar要求的const void *参数类型。 - 不需要写3个if语句判断比较字段
比较逻辑已经完全封装在你传入的compar回调函数里了,要比较不同字段只需要单独实现对应的比较函数即可,areStudentsSorted函数内部不需要感知当前比较的是哪个字段,自然不需要额外分支。 - 循环边界修复
你原代码中for (int i = 0; i <= numelem; i++)会出现数组越界,正确的循环范围是i从0到numelem-2,也就是for (int i = 0; i < numelem - 1; i++),保证i+1最大为数组最后一个合法索引numelem-1。 - 逻辑返回修复
只要有一组相邻元素的比较结果>0,就直接返回false,全部遍历完无异常才返回true。
修复后的完整代码
bool areStudentsSorted(Student * stu, int numelem, int (*compar)(const void *, const void *)) { // 空数组或仅1个元素默认已排序 if (numelem <= 1) { return true; } for (int i = 0; i < numelem - 1; i++) { // 传入相邻两个元素的指针给比较函数 if (compar(&stu[i], &stu[i+1]) > 0) { // 出现逆序直接返回false return false; } } // 全部元素符合排序要求返回true return true; }
如果需要比较ID字段,只需要额外实现对应的比较函数即可,不需要修改areStudentsSorted的内部逻辑:
int compareID(const void * p1, const void * p2){ const Student *stu1 = p1; const Student *stu2 = p2; return stu1->ID - stu2->ID; }
调用时直接传入对应函数指针即可:
if (!areStudentsSorted(stu, numelem, compareID)) { return EXIT_FAILURE; }
内容的提问来源于stack exchange,提问作者aerialace8
相关产品推荐
相关产品推荐

