好了,伙计们,我想知道我在这段代码中所做的以下注释。谢谢,
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);
}
发布于 2012-05-02 18:03:51
下面是这三个问题的概要。
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)?
这是一个null检查,以确保您不在树结构中的叶节点上。
发布于 2012-05-02 17:58:21
可能t->e在0-26的范围内。通过算术添加'A‘字符,你可以得到'A’表示0,'B‘表示1,依此类推。
参数是指向函数的函数指针,该函数接受tree_t
指针作为参数并返回void (*visit)(tree_t *)
。
发布于 2012-05-02 17:58:24
void (*visit)(tree_t *)
是一个指向函数的指针,该函数不返回任何内容,并接受指向tree_t
的指针作为单独的参数。
!t
是检查指向NULL
的指针的最首选方法之一。这意味着你已经到达树中的叶节点,你需要停止你的递归( base case )。
添加'A'
可能与我们在中所做的类似
if (isdigit(ch))
ch = ch-'0';
https://stackoverflow.com/questions/10419107
复制相似问题