我正在写一个能找到BST中奇数/偶数/负数的函数。传入树和指向函数的指针。
int countIf (treelink tree, int (*pred)(TreeItem)) {
if ( tree == NULL ) return 0;
return (*pred)(tree->item) + countIf(tree->left,pred) + countIf(tree->right,pred);
}
函数指针pred可以是:
int isEven (TreeItem n) {
return !(n%2);
}
int isOdd (TreeItem n) {
return n%2;
}
int isNegative (TreeItem n) {
return (n < 0);
}
为什么countIF的代码不起作用?它只适用于某些情况,而不是全部。 谢谢
正在使用这组数字:7 5 11 3 6 9 15 1 4 8 10 14 16 但不是这样:7 -5 11 -9 3 10 15 1 4 8 14 16 6
答案 0 :(得分:0)
如果n % 2
为否定,则-1
的结果为n
。然后当你使用isOdd
而不是负数时,每个负奇数将从总数中减去。
至少有3种可能的修复方法:
& 1
(假定2&#39;补充)!!
将其反转为布尔值,然后再次反转(将强制它为0或1)abs(n) % 2
。这适用于超过2的模数。如果系统使用2的补码且值等于INT_MIN
,则不起作用(感谢@ user694733)。abs
:abs(n % 2)
,即使在INT_MIN
案例中也应该有效。 (-1) % 2
生成-1
的原因在于C11 6.5.5p6:
- 当整数被分割时,
醇>/
运算符的结果是代数商,丢弃了任何小数部分。如果商a/b
可表示,则表达式(a/b)*b + a%b
应等于a
;否则,a/b
和a%b
的行为都是未定义的。
现在,给定a = -1
和b = 2
截断意味着(-1) / 2
生成-0.5
并且小数截断,效果与将舍入为零,因此结果为0
。现在,因为((-1) / 2) * 2 + (-1) % 2
必须等于-1
;并且(-1) / 2
为0,因此((-1) / 2) * 2
为0,然后0 + (-1) % 2
为(-1) % 2
,规则必须评估为-1
。