メルマガ:あゆしゃのC言語プログラミング
タイトル:あゆしゃのC言語プログラミング(Vol.478) 新型木構造  2004/07/23


/*========================================================*/
    <<<あゆしゃのC言語プログラミング>>>
/*========================================================*/
 第478回 新型木構造
 発行    2004年7月23日(金曜日)
 発行数   約2800

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

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

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

 ファントム、2度目のクリアをしました。

 その時間をページにまとめました。

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

 クリアタイムは13時間17分。

 世界記録は12時間30分。

 ・・・届くぞ!

/*========================================================*/
 株日記
/*========================================================*/

野村のバーチャル株式投資倶楽部
http://www2.nomura.co.jp/vstock/VirtualServlet?
(ゲストでログインして Ayusya を探せば成績を参照できます)

★ここ一週間の Ayusya の成績
火曜日 1,009,650円 27,809番
水曜日 1,005,528円 30,458番
木曜日   996,284円 64,399番
土曜日   988,185円 68,938番
月曜日   988,185円 69,599番
火曜日   988,185円 69,953番
木曜日   990,122円 69,384番

{magclick}
/*========================================================*/
 今回のお題  << 新型木構造 >>
/*========================================================*/

 以前、木構造をクラスで実装しようとして、大失敗しました。

 今回はその反省を持って、木構造処理はべたな関数にします。

 また、再起を使わない木構造の追加処理を思いつき、それを
実装しましょう。

 それから、文字列も一緒にメモリ取得する方法を思いつき、
それも実装しましょう。


struct tree_t
{
    tree_t* left;
    tree_t* right;
    char key[ 1 ];
} *tree = NULL;

 左右の枝とキーがある、基本的な木構造の構造ですが、

 文字列の宣言が少し変です。

 これは、可変長の文字列配列であり、サイズは1とありますが、

 サイズを無視した文字列配列として扱おう、という方法です。

 構造体のメモリ取得と文字列のメモリ取得が一度に行えて、
便利です。

 この可変長文字列は、必ず構造体の最後に宣言します。

 WindowsAPI が、たまにやっている裏技です。


tree_t* new_tree( char* key, int len )
{
    tree_t* pt = ( tree_t* )calloc(
        1, sizeof( tree_t ) + len );
    if( pt ) {
        memcpy( pt->key, key, len );
    }
    return pt;
}

 メモリの取得処理です。

 取得サイズは、構造体のサイズ+文字列長となります。


tree_t* find_tree( char* key, int len )
{
    tree_t* pt = tree;
    while( pt ) {
        int c = strncmp( pt->key, key, len );
        if( ! c ) c = pt->key[ len ];
        if( ! c ) break;
        if( c > 0 ) pt = pt->left;
        else pt = pt->right;
    }
    return pt;
}

 単純に探すだけの処理です。

 コンペアの結果が0になったとき、長さの位置の文字を比較結果
とするところがポイントです。これがないと死にます。

 比較結果が正のとき、探すべき文字列が小さいので、左に分岐
します。


tree_t* add_tree( char* key, int len )
{
    tree_t** ppt = &tree;
    while( *ppt ) {
        tree_t* pt = *ppt;
        int c = strncmp( pt->key, key, len );
        if( ! c ) c = pt->key[ len ];
        if( ! c ) break;
        if( c > 0 ) ppt = &pt->left;
        else ppt = &pt->right;
    }
    if( ! *ppt ) *ppt = new_tree( key, len );
    return *ppt;
}

 いままで再起を使っていた追加処理ですが、

 ポインタのポインタを使うことによって、検索の処理と同じ
ような感じで処理が走ります。

 最後、あるべき場所にない場合、メモリ取得処理を発動します。


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

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

 次回は7月26日(月曜日)に、第479回をお送りします。
 お題は「木構造マクロ」

 いつでもどこでも簡単木構造!

 お楽しみに!

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

{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

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