好的,伙计们,我想知道我在这段代码中发表的以下评论。谢谢,
void visit(tree_t *t){
printf("%c ", t->e + 'A'); // why t->e + 'A', and not just t->e?
}
void tree_preorder(tree_t *t, void (*visit)(tree_t *)){ // i just don't know the parameter void (*visit)(tree_t *). what exactly is (*visit)(tree_t *)?
if (!t) return; // what's the condition (!t)?
visit(t);
tree_preorder(t->l, visit);
tree_preorder(t->r, visit);
}
答案 0 :(得分:2)
这是三个问题的缩写。
printf("%c ", t->e + 'A'); // why t->e + 'A', and not just t->e?
这是做ascii表的假设。
这会将字符移位0x41(65)。因此,如果你有一个int范围为0 - 25的树,你可以打印出一个有效的A - Z
字符(*visit)(tree_t *)
这是一个函数指针。它将在每个节点上调用
// what's the condition (!t)?
这是一个空检查,以确保您不在树结构中的叶节点。
答案 1 :(得分:1)
可能t-> e在0-26的范围内。通过算术地添加'A'字符,你得到'A'代表0,'B'代表1,等等。
void (*visit)(tree_t *)
该参数是一个指向函数的函数指针,该函数将tree_t
指针作为参数并返回void。
答案 2 :(得分:0)
void (*visit)(tree_t *)
是一个指向函数的指针,该函数不返回任何内容,并将指向tree_t
的指针作为一个单独的参数。
!t
是检查指向NULL
的指针的最佳方法之一。这意味着您已到达树中的叶节点,您需要停止递归(base case)。
'A'
的添加可能类似于我们在
if (isdigit(ch))
ch = ch-'0';