• ベストアンサー

C++初心者です。

コーディングというかフローを書いているんですが…。 課題で住所録もとい社員名簿のようなものを作っています。 既存の個人情報が入力されているファイルを開いて、 fgetsで1レコードずつ読み、それをトークンで分けて、入力情報についてのエラーチェック(文字数や文字種)をし、エラーがなければ構造体に代入していきます。 ちなみにファイルの中身はすでに昇順にソート済みと仮定します。 エラーチェックの関数はそれぞれの項目に対して完成しました。 ただ、これから追加入力できる機能を作るのですが、入力可能件数が無限なので、チェーン構造にしなければなりません。 もともと入力されていた情報もチェーンにためなければなりません。 ちなみにこの個人情報の構造体は全てChar型で用意していて、struct kojin型です。 また、次のstruct kojin型のアドレスと前のstruct kojin型のアドレスが持てるように、pnextとpprevもメンバになっています。 EOFまで読み込んで、チェーンをつなぎながら構造体に情報をためる方法を教えていただきたいです。 まだフローさえ書けない状態で、もう5日考えましたが、お手上げでした。 細かい中身はさておき、チェーンをつないで情報をためる方法を教えてください。 どうぞよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

簡単なサンプルを作ってみました。 C++はあまり経験がないので、すこし変かもしれませんが、やってることは簡単です。 どっちかというと、標準ライブラリを使ったり、クラスにするほうが楽だし、char型で個人情報を取っておくのもなんだかな~とか思います。 #include <iostream> #include <string.h> struct kojin { char name[16]; struct kojin* pnext; struct kojin* pprev; }; kojin* TOP =NULL; //リストの先頭 kojin* TAIL=NULL; //リストの後尾 char* list[] = { "ADA", "B", "BCPL", "C", "Cpulsplus", "Csharp","Comega", "D", NULL }; //ファイルからの入力を配列で模擬 kojin* kojin_addList(char* name){//リストにレコード追加 kojin* wk = new kojin; strcpy(wk->name, name); if(TOP==NULL){ //まだリストがない TAIL=TOP=wk; wk->pprev=wk->pnext=NULL; } else { kojin* addPoint=TAIL; //リストの最後を捕まえる addPoint->pnext=wk; //リストの最後に自分を追加 wk->pprev=addPoint; //自分の前はかつてのリストの最後 wk->pnext=NULL; //次のリストはまだ無い TAIL=wk; //最後尾保持変数を更新 } return wk; } void main(void){ for(char** p=list;*p!=NULL;p++) //リストに追加していく kojin_addList(*p); for(kojin *p=TOP;p!=NULL;p=p->pnext) //先頭からたどって表示 std::cout << p->name << std::endl; for(kojin *p=TAIL;p!=NULL;p=p->pprev)//後尾からたどって表示 std::cout << p->name << std::endl; }

totteoki
質問者

お礼

たくさん回答してくださってありがとうございます。 ただ現段階で私の知識がそこまで達していないので 理解することができませんでした。 申し訳ありません。 でもありがとうございました。

その他の回答 (3)

回答No.3

C++で、というのならチェーン(双方向リスト)は標準C++ライブラリに出来合いのがあります。 list<kojin> chain; kojin record; while ( EOFまで ) {  // ファイルから呼んでrecordに格納  chain.push_back(record); }

  • Mi8
  • ベストアンサー率25% (30/117)
回答No.2

C++なら StructでなくClass kojinを作ってそこで メンバ関数を作って、機能を満たせばいいのでは? そのほうが楽よ。

totteoki
質問者

お礼

回答ありがとうございます。 しかしまだCLASSを習っておらず、今までの知識で解かなければならないので、使えないのです。 わざわざすみません。

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

問題になっているデータ構造は「双方向リスト」というやつで、 データ構造の本には最初の方に載っています。 簡単に言えば、ポインタのつなぎかえをするだけなのですが、 あなたのレベルがわからないので、うまく説明はできません。 まず、「ポインタ」と「malloc()関数」を理解しているかどうかが問題になります。 (もっとも、ポインタとmalloc()を理解していたら、 すぐにできる問題ですが…) ここで聞くよりも、本を一冊買ってくる方が早いと思います。 この手の質問があるたびにおすすめしているのですが、 『定本 Cプログラマのためのアルゴリズムとデータ構造』 というのが非常にいい本です。 とりあえず買っておくといいでしょう。 わからなくて悩む時間を考えれば、本代などは安いものです。

参考URL:
http://www.amazon.co.jp/exec/obidos/ASIN/4797304952/
totteoki
質問者

お礼

今度その本を読んでみたいと思います。 ありがとうございました。

関連するQ&A