|
/*========================================================*/ <<<あゆしゃの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 |