BMI指数、身長、体重、名前を出力するプログラムを作成せよ。
ただし、入力データ件数は不定、名前の1文字目に"0"が入力された時データ入力を終了する。
という内容の課題を以前質問させて頂きました。
みなさんのおかげでソースを理解するに至ったのですが、いざ自分で組んでみるとエラーが出てしまいます。
#include <stdio.h>
#include <stdlib.h>
typedef struct field{
char name[32];
double h,w,bmi;//h:身長、w:体重
struct field *next;
}person;
void add(person **plist, person *newstr);
void output(person *p);
void pfree(person *p);
int main(void){
person *list,t;
int i;
list=NULL;
i=0;
while(1){ //入力件数が不定なのでループ内のbreakで終了させる
printf("%d人目_",i++);
printf("名前 > "); fgets(t.name,sizeof(t.name),stdin);
if(t.name[0]==0){ //名前の1文字目が0なら処理終了
break;
}
printf("身長[cm] > "); scanf("%lf",&t.h);
printf("体重[kg] > "); scanf("%lf",&t.w);
t.h /= 100; //身長の単位が[cm]なので[m]に直す
t.w /= 100;
t.bmi = t.w/(t.h*t.h); //BMI指数を求める
t.next = NULL;
add(&list,&t);//線形リストに追加
}
output(list); //線形リストを出力
pfree(list); //領域を解放
return 0;
}
void add(person **plist,person *newstr){
person *p,*q,*r;
p = *plist;
if(p == NULL){
q = NULL;
}
while(p != NULL){
if(newstr->bmi < p->bmi){ //BMI指数が自分より大きければ処理終了
break;
}else{
q = p;
p = p->next;
}
r = (person*)malloc(sizeof(person));
*r = *newstr;
r->next = p;
if(q != NULL){
q->next = r;
}else{
*plist = r;
}
}
}
void output(person *p){
while(1){ //入力件数が不定なので、ループ内のbreakで終了させる
if(p==NULL){ //ポインタがNULLなら処理終了
break;
}else{
printf("BMI > %lf,",p->bmi);
printf("身長[cm] > %lf,",p->h);
printf("体重[kg] > %lf,",p->w);
printf("名前 > %s.\n",p->name);
p=p->next; //次を指すアドレスを代入
}
}
}
void pfee(person *p){ //領域を解放する関数
//NULLポインタを見つけ次第、
//そこから先頭に向かって順に領域を解放していく。
if(p->next!=NULL){
pfree(p->next);
}
free(p);
}
1>kadai2-1.obj : error LNK2019: 未解決の外部シンボル "void __cdecl pfree(struct field *)" (?pfree@@YAXPAUfield@@@Z) が関数 _main で参照されました。
1>C:\Users\USER\documents\visual studio 2010\Projects\kadai2-1\Debug\kadai2-1.exe : fatal error LNK1120: 外部参照 1 が未解決です。
です。
初めて見たエラーです。どのようにすれば解決できるのでしょうか?
また、ソース内でおかしな点がありましたらご指摘お願いします。