FC2ブログ
プログラム研究所
ソフトウェア開発やプログラミングの豆知識を載せています。
07 | 2018/08 | 09
S M T W T F S
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -

スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Tree構造への要素追加
最近はポインタをように取り扱うようなプログラムはあまり書かなくなったのだろうか。昔はよく書きました。今回紹介するのは昔『WRITING SOLID CODE(STEVE MAGUIRE 著)』という書籍で出会い、感動した二分木構造に要素を追加するときのコードです。

Tree構造への要素追加

階層ウィンドウを管理するデータ構造

typedef struct WINDOW { struct WINDOW* pwndChild; /* 子 がない場合は NULL */ struct WINDOW* pwndSibling; /* 兄弟がない場合は NULL */ char* strWndTitle; : : } window; /* 命名規則: wnd, *pwnd */ /* pwndDisplay はルートレベルのウィンドウを指している。 * このウィンドウはプログラムの初期化の際に割り当てられる */ window* pwndDisplay = NULL;

このようなバイナリツリー(二分木)の構造を操作する方法はちょっとしたアルゴリズムの本を探せばお手本が見つかりましたが、上手く書けているものもあればバグのあるサンプルが書かれている本もよくありました。

新しいウィンドウを追加する関数

void AddChild(window* pwndParent, window* pwndNewBorn) { window** ppwndNext; /* 新しいウィンドウは子を持っている可能性はあるが、兄弟はない */ ASSERT(pwndNewBorn->pwndSibling == NULL); /* * ポインタ中心のアルゴリズムを使って兄弟のチェインをたどる。 * 次のポインタがリストの最初の"次の兄弟のポインタ"になるように * ppwndNext を pwndParent->pwndChild を指すように設定する。 */ ppwndNext = &pwndParent->pwndChild; while (*ppwndNext != NULL) ppwndNext = &(*ppwndNext)->pwndSibling; *ppwndNext = pwndNewBorn; }

C言語で、ウィンドウシステムや、今でいうHTMLのような構造化ドキュメントを取り扱うようなプログラムを書いた時に、データ構造を設計し、データ構造へのアクセスルーチンをたくさん書きました。上記で紹介したようなコードの動きがイメージできたときは嬉しくなり、同じような設計をしたものです。


スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。