好的伙计们,我想知道我在此代码中所做的以下评论。谢谢
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);
}
以下是三个问题的概要。
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)?
这是一个空检查,以确保您不在树结构中的叶节点上。
t->e 可能在 0-26 范围内。通过算术添加"A"字符,您可以得到 0 的"A",1 的 1 的"B",依此类推。
void (*visit)(tree_t *)
参数是指向函数的函数指针,该函数将tree_t
指针作为参数并返回 void。
void (*visit)(tree_t *)
是一个指向函数的指针,该函数不返回任何内容,并将指向tree_t
的指针作为单独的参数。
!t
是检查指向NULL
的指针的最优选方法之一。这意味着您已经到达树中的叶节点,您需要停止递归(基本情况)。
添加'A'
可能类似于我们在
if (isdigit(ch))
ch = ch-'0';