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