自身の持っている知識なのですが、基礎的なC言語の入門書は読み漁り、簡単なポインタ、構造体までは理解しているつもりです。
当方、C言語を覚え始めて1ヶ月の未熟者です。色々と至らない面があると思いますが、お手柔らかにお願い致します。
さて早速ですが質問に移りたいと思います。
現在、ポインタ、構造体の理解のために「住所録」の作成をしています。
仕様としましては、
「名前」「住所」「電話番号」を標準入力で入力させ、データの追加、参照、削除、検索を行えるようにする。
データの保存は配列ではなく自己参照構造体を使い、リスト構造として実現する。
fwrite、wreadを使用してファイルへの読み書きを行う。
データの追加、参照、削除、検索はそれぞれ別の関数で行えるようにする。
グローバルな構造体、変数は使わない。
以上を踏まえて製作しているのですが、手詰まりを起こしてしまいました。
まず、使用している構造体は
struct List:{char name[10] , char address[50] , char phone[15] , List *next_pointa}
これを踏まえて、*prev、*next、start_dmyの3つの構造体を作ります。
まず、データを入れないただのダミー構造体(start_dmy)を作ります。
このstart_dmyのnext_pointaが指しているアドレスから、リスト構造の読み込みを行います。
リスト構造の最後にはNULLを格納します。
[1000](start_dmy。データは空) ⇒ [1001](start_dmy.next_pointaの指すアドレス。ここからデータが入る) ⇒ [1002] ⇒ [1003] ⇒ [NUL[/url]
イメージとしては、上のようなリスト構造を考えています。
for(prev = start_dmy.next_pointa ; prev != NULL ; prev = prev->next_pointa); ←つまり、データ読み込みにはこのような命令を行う。
まず、以上を踏まえて(簡素化した)メイン関数とデータの追加の関数を書いてみると
main(){ struct List *prev; struct List start_dmy; prev = &start_dmy; prev->next_pointa = NULL; for(;;){ prev = add(prev); } } struct List *add(struct List prev){ struct List *next; next = ( struct List * )malloc( sizeof ( struct List )); //データ領域の確保 printf("\nデータの追加を行います。以下に従って入力してください。\n登録する人の名前?:");//とりあえず名前だけ scanf( "%s" , &next->name ); prev->next_pointa = next; next->next_pointa = NULL; prev = next; return prev; }このような形でリスト構造を実現しようとしているのですが、初めにprevとstart_dmyを対応付けているので、
add関数内で、prev->next_pointaをnextで確保した領域のアドレスとしても、それはstart_dmyにも同期してしまいます。
つまり先ほどの例だと
[1000](start_dmy。データは空) ⇒ [1001] ⇒ [1002] ⇒ [1003](start_dmy.next_pointaの指すアドレス、prev->next_pointaの指すアドレス) ⇒ [NUL[/url]
となってしまいます。(start_dmy.next_pointaはあくまで1001番地を指していたい。)
更に削除の際に、先頭のデータを削除・・・つまりstart_dmy.next_pointaを書き換えないといけない場合でも、
returnで指定するのが、prevとstart_dmyの2つの構造体を戻さないといけないため、上手く実装できません。
長くなりましたが、コレに対する対応策、
もしくはこのような方法を取らなくても(なるべくダミー構造体は使いたくない)良い案がありましたら是非ご教授お願いいたします。