メルマガ:あゆしゃのC言語プログラミング
タイトル:あゆしゃのC言語プログラミング(Vol.481) 木構造処理拡張機能  2004/07/30


/*========================================================*/
    <<<あゆしゃのC言語プログラミング>>>
/*========================================================*/
 第481回 木構造処理拡張機能
 発行    2004年7月30日(金曜日)
 発行数   約2700

★日本初の本格的求職広告(匿名・無料)でお仕事探しを応援しています!!
ご希望条件に合った求人企業から直接メールを受けることができます。HPと
メルマガのW広告で効果大!転職、就職に加え契約、派遣、SOHO等にも対応。
画期的サービスとして新聞・雑誌で多数紹介、お喜びの声続々。求人広告多数
無料メルマガご購読は今スグどうぞ→■ http://www.aweb.jp/jobpn.htm ■

{magclick}
/*========================================================*/
 はじめに ( 決り文句 )
/*========================================================*/
・このメールマガジンは、主にまぐまぐさんから発行しています。
・ジャンルは、マルチメディアのプログラム、C言語です。
・横60文字で作成し、インデントは大抵半角スペース4つです。
・ここで扱うプログラムは、C言語と半光年以内のものです。
・登録解除は、メルマガのホームページでお願いします。
・過去ログはバックナンバー(下欄参照)を活用して下さい。
・内容は私が感じたもので、最新の技術も、へたれもあります。
・わかりやすさを優先させる為、たまに嘘があるかもしれません。
・セキュリティ突破のため、暗号化された単語があります。

/*========================================================*/
 ご挨拶
/*========================================================*/

 こんにちは。あゆしゃです。

 先日、ベクターよりお便りが届きました。

 ミニクロックの登録が完了したのです。

ミニクロックのページ
http://www.vector.co.jp/soft/winnt/personal/se335096.html

作者紹介ページ
http://www.vector.co.jp/vpack/browse/person/an039171.html

 なんだか、とてもうれしいです。


 早速ですが、バージョンアップを考えましょう。

 たったこれしきのことで、タスクトレイのわずかなスペースを
占有してしまうのは、もったいないのです。

 タスクトレイにアイコンを追加するかしないかを、選択できる
ようにしましょう。

 また、改善したい点として、ダブルクリックで文字列をコピー
するとき、一瞬「移動中です」と表示されるのがうっとうしい
です。
 さらに、コピーされたかされなかったが分からないので、
「コピーしました」というメッセージを表示させるように
しましょう。

 バージョンは 1.0.4.0、今度はバージョンアップ実験です。

 処理の内容は次回にて。

{magclick}
/*========================================================*/
 今回のお題  << 木構造処理拡張機能 >>
/*========================================================*/

 木構造を使うときに、作っておくと便利な機能がいくつかあり
ます。

・要素のカウント
・ソート
・最も左、最も右を検出
 (ソートとあわせてループ処理をするため)

 カウントは、今回作ろうとしているデスクトップショットには
必要ありませんが、LogAnaly を(もし)作り直すならば、役に
たつでしょう。

 追加するたびにカウンタをインクリメントするのもいいでしょう
が、「現在の時点で絶対に正確な値を保障する」という点では、
カウンタはいまいち心配です。

 また、だーっと追加処理した後に、よっこらせっとカウントを
取得する、という処理の流れも、忙しくなくていい感じです。


 カウントは、普通に再起して0から始まるカウンタを更新すれば
オーケーです。

int count_tree_at( tree_t* pt )
{
    if( ! pt ) return 0;
    return
        count_tree_at( pt->left ) +
        count_tree_at( pt->right ) + 1;
}
// ユーザプログラム呼び出し用
int count_tree() { return count_tree_at( tree ); }

 こんな感じですか。


 ソートは、メンバーに次と前を追加しておき、順番に連結させ
ればオーケーです。

 この関数の直後、ループ処理を行うために最も左の要素を取得
する関数を使うケースが多いので、

 右側から順番に連結していき、最後に最も左の要素を返すように
しましょう。

tree_t* sort_tree_at( tree_t* pt, tree_t* next )
{
    if( pt ) {
        next = sort_tree_at( pt->right, next );
        pt->next = next;
        if( next ) next->prev = next;
        next = sort_tree_at( pt->left, pt );
    }
    return next;
}
// ユーザプログラム呼び出し用
tree_t* sort_tree() { return sort_tree_at( tree, NULL ); }

 こんな感じですか。
 少し複雑なので説明しますと、

        next = sort_tree_at( pt->right, next );

 まず最初に、右側に再起します。
 このとき、現在最新の右(次)の要素を渡します。

 関数が終了すると、最も左(前)の要素を返してくるので、
それを次の処理の最も右(次)の要素とします。

        pt->next = next;

 現在の要素に次を登録します。

        if( next ) next->prev = next;

 そのポインタがNULLではない(初回ではない)場合、次の要素の
前として、自分を登録します。

        next = sort_tree_at( pt->left, pt );

 最後に、右と同じように左を呼び出すのですが、このとき、
第2引数に自分自身を指定します。

 そうすることで自分自身が最新の右であるように処理されます。

 返ってきた値は、左側に存在する要素の中で最も左のものです。

 もし左が存在しない場合は、自分自身が返されてきます。


 必要に応じて必要な要素をマクロで指定するようにしましょう。
 たとえば、

struct shop_t
{
    struct item_t
    {
        DEF_TREE_ITEM( item_t );
        DEF_SORTTREE_ITEM( item_t );
    } *item;
    DEF_TREE_FUNC( item_t, item );
    DEF_SORTTREE_FUNC( item_t, item );
    DEF_FINDTREE_FUNC( item_t, item );
    DEF_TREE_ITEM( shop_t );
    DEF_SORTTREE_ITEM( shop_t );
} *shop = NULL;
DEF_TREE_FUNC_EX( shop_t, shop, pt->free_item() );
DEF_SORTTREE_FUNC( shop_t, shop );
DEF_FINDTREE_FUNC( shop_t, shop );

 フル装備だと、こんな感じですか。

/*========================================================*/

 いちいちフル装備していると面倒です。

struct shop_t
{
    struct item_t
    {
        DEF_TREE_ALLITEM( item_t );
    } *item;
    DEF_TREE_ALLFUNC( item_t, item );
    DEF_TREE_ALLITEM( shop_t );
} *shop = NULL;
DEF_TREE_ALLFUNC_EX( shop_t, shop, pt->free_item() );

 こんな感じでしょうね。

{magclick}
/*========================================================*/
 さいごに
/*========================================================*/

 というわけで、ツール集に追加しました。

http://ayusya.hp.infoseek.co.jp/ProgramCTool.html

 ちょっとがんばって、一生懸命¥を右側にあわせました。

 また、翻訳ソフトを使ってコメントを一生懸命英語にしました。

 なお、ITEM と FUNC を間違える場合が多いので、FUNCS に
しました。

 カンマを渡す技や、引き数を省略する技がちゃんと使ってあり
ます。

 しかし、動くのかなぁ? <おぃぉぃ

{magclick}
/*========================================================*/
 次回予告
/*========================================================*/

 次回は8月2日(月曜日)に、第482回をお送りします。
 お題は「ミニクロック1040」

 お楽しみに!

/*========================================================*/
 最後の決り文句
/*========================================================*/
 このメールマガジンは、まぐまぐさんから発行しています。
 このメールマガジンを解除したい場合は、まぐまぐさんをご利用
ください。このメルマガのまぐまぐアイディーは最後にあります。
 このメールマガジンには広告が挿入されていますか?
 このメールマガジンの内容に文面の引用はありませんか?
 めーらっくすの場合はめーらっくすの利用方に従ってください。
 このメールマガジンの内容の、転用、流用、宣伝、リンク、
単語のみの検索機能があると便利かな なんて大歓迎です。

{magclick}
/*========================================================*/
 
/*========================================================*/

発行者 あゆしゃ

ホームページ::あゆしゃの世界
http://ayusya.hp.infoseek.co.jp/

ご意見・ご感想・ご質問メール
mailto:ayusya@flamenco.plala.or.jp

まぐまぐ::アイディー
0000020674

まぐまぐ::登録と解除
http://www.mag2.com/m/0000020674.htm

まぐまぐ::バックナンバー
http://jazz.tegami.com/backnumber/frame.cgi?id=0000020674

めーらっくす::アイディー
MM3E1AEE285AB4F

めーらっくす::登録と解除
http://www.mailux.com/mm_dsp.php?mm_id=MM3E1AEE285AB4F 

めーらっくす::バックナンバー★最近のものならこちらが便利★
http://www.mailux.com/mm_bno_list.php?mm_id=MM3E1AEE285AB4F

ブラウザの閉じるボタンで閉じてください。