0

好的,我想知道我在这段代码中所做的以下评论。谢谢,

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);
}
4

3 回答 3

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)?

这是一个空检查,以确保您不在树结构中的叶节点处。

于 2012-05-02T18:03:51.080 回答
1

t->e 可能在 0-26 范围内。通过算术添加'A'字符,你得到'A'代表0,'B'代表1,等等。

void (*visit)(tree_t *) 参数是一个函数指针,指向一个将tree_t指针作为参数并返回 void 的函数。

于 2012-05-02T17:58:21.213 回答
0
void (*visit)(tree_t *)

是一个指向函数的指针,它不返回任何内容,并将指针tree_t作为单独的参数。

!t

是检查指向 的指针的最优选方法之一NULL。这意味着您已到达树中的叶节点,您需要停止递归(基本情况)。

的添加'A'可能类似于我们在

if (isdigit(ch))
    ch = ch-'0';
于 2012-05-02T17:58:24.183 回答