- ベストアンサー
ノード作成時、特別な処理を行わないプログラム
ファイルから読み込んだデータを構造体へ格納するプログラムを作成したのですが、最初のノードを作成する際にも特別な処理を行わないプログラムを作成するように指示されて、どのようにしていけば良いのかわからず困っています。 良ければどなたかヒントなどご指導いただける方いましたらよろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define NAME_LENGTH 20 /* 名前を格納する文字列の長さ */ #define ADDRESS_LENGTH 30 /* 住所を格納する文字列の長さ */ /* 構造体の定義 */ typedef struct p_tag{ /* タグ */ char name[NAME_LENGTH]; /* 名前 */ char address[ADDRESS_LENGTH]; /* 住所 */ int age; /* 年齢 */ struct p_tag *next; /* 自分自身の型へのポインタ変数 */ } personal_t; /* 住所データ型の定義 */ /* リスト構造の新しいノードを作成する関数 makeNewNode() 引数 char *aName 名前(文字列)の先頭アドレス char *aAddr 住所(文字列)の先頭アドレス int aAge 年齢 返値 personal_t * 新しく作成したノードの先頭アドレス */ personal_t *makeNewNode(char *aName, char *aAddr, int aAge) { personal_t *pNewData; /*** personal_t 型のメモリ領域を確保 ***/ pNewData = (personal_t *) malloc( sizeof(personal_t) ); /*** 氏名・住所・年齢のデータを設定する nextはNULLにする ***/ strcpy( pNewData->name, aName ); strcpy( pNewData->address, aAddr ); pNewData->age = aAge; pNewData->next = NULL; return( pNewData ); } /* main() 引数 なし 返値 int 正常終了の時 0 異常終了の時 -1 (ファイルの読み込み失敗など) */ int main( void ) { personal_t *pTop = NULL; /* リストの先頭ノードのアドレスを持つ変数 */ personal_t *pNew; /* 新しく作成したノードのアドレスを持つ変数 */ personal_t *pNow; /* 現在見ているノードのアドレスを持つ変数 */ FILE *fp; /* データファイルのファイルポインタ */ char name[ NAME_LENGTH ]; /* ファイルから読み込んだ名前を一時的に保持する変数 */ char address[ ADDRESS_LENGTH ]; /* ファイルから読み込んだ住所を一時的に保持する変数 */ int age; /* ファイルから読み込んだ年齢を一時的に保持する変数 */ /*** データファイル exer4.txt を読み込み用に開く. ファイルが開けなかった場合,エラーメッセージを表示し異常終了する.***/ fp = fopen( "exer4.txt", "r" ); if ( NULL == fp ) { printf( "ファイルが開けませんでした.\n" ); return( -1 ); } /* データファイルから1件目のデータを読み込む ファイルの終わり(返値がEOF)ならばエラーメッセージを表示し異常終了する.*/ if ( EOF == fscanf( fp, "%s %s %d", name, address, &age ) ) { printf( "データの読み込みに失敗しました.\n" ); fclose( fp ); return( -1 ); } /*** 1件目のデータを格納するために,最初のノードを作成する ***/ pTop = makeNewNode( name, address, age ); /*** 現在見ているノードを最初のノードにセットする ***/ pNow = pTop; /* 2件目以降のデータをファイルの最後(EOF)まで読み込み, 新しく作成したノードに格納していく */ while( EOF != fscanf( fp, "%s %s %d", name, address, &age ) ) { /*** 新しいノードを作成 ***/ pNew = makeNewNode( name, address, age ); /*** 現在見ているノードに新しいノードを連結し,新しいノードを現在見ているノードとする ***/ pNow->next = pNew; pNow = pNew; } /* ファイルを閉じる */ fclose( fp ); /*** リストを終わりまでたどりながらデータを表示する ***/ /* 現在見ているノードを最初のノードにセットする */ pNow = pTop; /* pTop がないと最初のノードのアドレスが分からなくなる */ /* リストの終わりまでたどり着くと,pNowがNULLになる */ while( pNow != NULL ) { /* 出力 */ printf( "%-10s %-10s %d\n", pNow->name, pNow->address, pNow->age); /* 次のデータへ */ pNow = pNow->next; } return( 0 ); }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
- plh
- ベストアンサー率50% (4/8)
- yaemon_2006
- ベストアンサー率22% (50/220)
お礼
なるほど。 特別な処理を行わないという解釈がいまいちわからなかったのですが、 一回の処理で記述すれば上手くいきそうですね。 参考になりました。ありがとうございます