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

これが3つの質問の要約です。

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-02T18:03:51.080 に答える
1

おそらく t->e は 0 から 26 の範囲です。「A」文字を算術的に加算すると、0 の場合は「A」、1 の場合は「B」というようになります。

void (*visit)(tree_t *)tree_t引数は、ポインタを引数として受け取り、void を返す 関数への関数ポインタです。

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

何も返さず、へのポインタをtree_t唯一のパラメータとして受け取る関数へのポインタです。

!t

を指しているポインターをチェックする最も好ましい方法の 1 つですNULL。これは、ツリーのリーフ ノードに到達し、再帰を停止する必要があることを意味します (基本ケース)。

の追加は、'A'私たちが行っていることと似ているかもしれません

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