プログラミング言語 C
関数 add_tree は 再帰型の関数である。
word は main関数で まず tree の top level (root) に 呈示される。
各 stage では、word は すでに ノードに 格納されている (他の) word と 比較され、関数 add_tree によって 呼び出された 再帰により 左または右の sub tree へと 振り分けられる。
結果、word は tree 内の word と 一致 - その場合には カウントが インクリメントされる - するか、null point に 出会って 新規に tree に 追加されることになる。
新しく ノードが つくられると、add_tree は (返り値として) そのノードの ポインタを返して、(上位にある) 親ノードに 連結される。
- struct Tnode *talloc(void);
- /* talloc : Tnode を作成する */
- char *str_dup(char *);
- /* str_dup : string の複製をつくる */
- /* add_tree : 親ノードの下に word のノードを加える */
- struct Tnode *add_tree(struct Tnode *p, char *w)
- {
- int cond;
- if (p == NULL) {
- p = talloc(); /* 新しくノードをつくる */
- p->word = str_dup(w);
- p->cnt = 1;
- p->left = p->right = NULL;
- /* str_cmp : 文字列の長さを比較する */
- } else if ((cond = str_cmp(w, p->word)) == 0)
- p->cnt++; /* repeated word */
- else if (cond < 0) /* 少ないときは left sub tree へ */
- p->left = add_tree(p->left, w);
- else /* 多いときは right sub tree に */
- p->right = add_tree(p->right, w);
- return p;
- }
新しいノードの 記憶領域 (storage) は talloc の ルーティンによって 確保され、tree のノードを 収容するのに 適切な free space に そのポインタを 返す。
そして 新しい word は 関数 str_dup により 退避スペースへと コピーされる (これに関しては 後述)。
(なお、上のプログラムには) カウントが 初期化され (左右の) 子ノードに null point が入る (部分がある)。 ここのコードは tree の末端 (leaves) で 新しく ノードが 追加されるときにのみ 実行される。
また - 不本意だが - str_dup と talloc の 返り値の エラーチェックについては (今回は) 省略した。(p171)