メルマガ:あゆしゃのC言語プログラミング
タイトル:あゆしゃのC言語プログラミング(Vol.416) SOM3 CStringで木構造  2004/01/23


/*========================================================*/
    <<<あゆしゃのC言語プログラミング>>>
/*========================================================*/
 第416回 SOM3 CStringで木構造
 発行    2004年1月23日(金曜日)
 発行数   約3200

{magclick}
/*========================================================*/
 はじめに ( 決り文句 )
/*========================================================*/
・このメールマガジンはまぐまぐさんから発行しています。
・ジャンルは、マルチメディアのプログラム、C言語です。
・このメールマガジンは、横60文字で作成しています。
 また、インデントはすべて半角スペース4つで構成しています。
・ここで扱うプログラムは、C言語と半光年以内のものです。
・登録解除は、まぐまぐさんのホームページでお願いします。
・まぐまぐさんのバックナンバー(下欄参照)を活用して下さい。
・ここは私の復習の場です。内容は約1ヶ月内外に私が勉強した
 内容になっています。最新の技術があれば、へたれもあります。
・わかりやすさを優先させる為、たまに嘘があるかもしれません。

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

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

 先日、録画しているビデオの減りが少ないことに、気がつき
ました。

 正月モードとして、毎日お昼のNHK英会話を録画し忘れてい
ました。

 正月ボケですね。

{magclick}
/*========================================================*/
 今回のお題  << SOM3 CStringで木構造 >>
/*========================================================*/

 VC++も7.0になったところで、リッチに、木構造のキーを
CStringとしてみましょう。

 ついでに、クラスにして見ましょう。

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

// ツリークラス
class CTree;
CTree* g_pTree_finded = NULL; // 文字列発見時のポインタ
CTree* g_pTree = NULL; // 文字列検索用木構造
class CTree
{
public:
    CString st;
    CTree* left;
    CTree* right;
    int id;
    CTree() {
        left = NULL;
        right = NULL;
        id = 0;
    }
    ~CTree() {
        if( left ) {
            delete left;
            left = NULL;
        }
        if( right ) {
            delete right;
            right = NULL;
        }
    }
    // 文字列を検索する
    static CTree* Find( CTree* pt, CString& stFind )
    {
        if( ! pt ) { // 未登録なのでここに新規作成
            pt = new CTree;
            if( pt ) pt->st = stFind;
            g_pTree_finded = pt;
        }
        else {
            int cmp = pt->st.Compare( stFind ); // 2つの文
            if( cmp == 0 ) g_pTree_finded = pt; // 見つけた
            else if(cmp<0) pt->right=Find(pt->right,stFind);
            else pt->left=Find(pt->left,stFind); // より小さ
        }
        return pt;
    }
};

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

 クラスの宣言の中に関数を書いては駄目なのですが、21世紀
なのでよいとしましょう。

 メンバはいつものとおり、キーと左と右です。

 今回はキーがCStringとなって、21世紀な感じです。

 コンストラクタとデストラクタはともかく、Find関数は、
比較の部分がCStringだったり、新規作成のところがnewだったり
して、21世紀な感じです。

 ・・・よく見ると、メンバにidというのがいます。

 というのも、なるべく簡単にしたかったので、アイテムの情報を
木構造ではなく配列で取ったのです。

 そしてidを配列のインデックスとして使用しよう、という魂胆
です。

 アイテム情報自体を木構造にしても良かったのですが、まぁ、
いいでしょう。

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

 こうして作った木構造を使って、

// アイテム情報
#define ITEM_MAX 256
struct item_t
{
    CString name; // このアイテムの名称
    CString image; // このアイテムの画像
    int id; // このデータのID
    int sales; // 今期の総売上
    int last_sales; // 前期の総売上
    int market_price; // 相場
    int needs; // 需要バランス
    int rest; // 残り
} items[ ITEM_MAX + 1 ];
int items_num = 1;

// アイテム情報を名前で取得
item_t* FindItem( CString name )
{
    item_t* ret = NULL;
    g_pTree_finded = NULL;
    g_pTree = CTree::Find( g_pTree, CString( "i" + name ) );
    if( g_pTree_finded ) // 検索または登録に成功した場合
    {
        if( g_pTree_finded->id == 0 ) // 未登録情報ならば
        {
            if( items_num < ITEM_MAX ) // 新規登録のスペース
            {
                g_pTree_finded->id = items_num++; // IDを登
                ret = items + g_pTree_finded->id;
                ret->name = name;
                ret->id = g_pTree_finded->id;
            }
        }
        else ret = items + g_pTree_finded->id;
    }
    return ret;
}

 という感じにしてみました。

 アイテム番号0番は、合計などの特殊なデータとして予約
します。

 CString木構造のFindを呼び出すときに、キーに"i"を追加して
いますが、これは木構造をアイテム専用として使うという意味が
あります。
 お店なども同じ木構造を使おう、という魂胆です。

 ・・・やっぱり自体を木構造にしたほうが簡単だったかな・・・

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

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

 次回は1月26日(月曜日)に、第417回を送ります。
 お題は「SOM4 木構造の作成」

 作り直しましょう。でもキーはCStringで。

 お楽しみに!

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

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

発行者 あゆしゃ

まぐまぐアイディー
0000020674

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

あゆしゃの世界
http://ayusya.hp.infoseek.co.jp/

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

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

めーらっくす <<過去ログがタイトル別になっています>>
http://www.mailux.com/mm_dsp.php?mm_id=MM3E1AEE285AB4F

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