#include <stdio.h>
#define MAX 20
/--- 身体データ型 ---/
typedef struct{
int height; /* 身長 /
double vision; / 視力 /
}
Body ;
/--- 身体検査データ型 ---/
typedef struct{
Body body; / 身体データ型 ---/
char name; / 氏名 /
} PhysCheck;
/--- 身体検査データ型スタックを実現する構造体 ---/
typedef struct{
int max; /スタックの容量/
int ptr; /スタックポインタ/
PhysCheck stk[MAX]; /スタック本体/
}PhysCheckStack;
/--- スタックの初期化 ---/
int Initialize(PhysCheckStack s, int max){
s->ptr = 0;
s->max = max;
return 0;
}
/--- スタックの後始末 ---/
void Terminate(PhysCheckStack s){
if (s->stk != NULL){
while( --s->ptr >= 0)
free(s->stk[s->ptr]); / 動的な文字列保存用配列を解放 /
free(s->stk);
}
s->max = s->ptr = 0;
}
/--- スタックにデータをプッシュ ---/
int Push(PhysCheckStack s, PhysCheck x){
if(s->ptr>=s->max) return -1; /スタック満杯/
if((s->stk[s->ptr] = calloc(strlen(x)+1,sizeof(char)))==NULL)
/ データをコピーするための動的な文字列保存用配列を確保することに失敗 /
return -1;
strcpy(s->stk[s->ptr], x);
s->ptr++;
return 0;
}
/--- スタックからデータをポップ ---/
int Pop(PhysCheckStack s, PhysCheck x){
if (s->ptr <= 0) return -1; / スタックは空 /
s->ptr--;
strcpy(x, s->stk[s->ptr]);
free(s->stk[s->ptr]); / ポップしたので,動的な文字列保存用配列を解放 /
return 0;
}
/--- スタックからデータをピーク ---/
int Peek(PhysCheckStack s, PhysCheck x){
if (s->ptr <= 0) return -1;
x = s->stk[s->ptr - 1];
return 0;
}
/--- スタックの容量 ---/
int Capacity(const PhysCheckStack s){
return s->max;
}
/--- スタックに積まれているデータ数 ---/
int Size(const PhysCheckStack s){
return s->ptr;
}
/--- スタックの全データの表示 ---/
void Print(const PhysCheckStack s){
int i;
for(i = 0; i < s->ptr; i++) printf("%s,%d,%f", s->stk[i].name, s->stk[i].body.height, s->stk[i].body.vision);
putchar('\n');
}
/--- スタックの探索 ---*/
int Search(PhysCheckStack *s, PhysCheck *x){
int i=0, j=0,p, n=0;
for(i=0; i<s->ptr; i++){
p=0;
while(s->stk[i].name[p]!='\0' && x->name[p]!='\0'){
if(s->stk[i].name[p]==x->name[p])p++;
else break;
}
if(x->name[p]=='\0' && s->stk[i].name[p]=='\0'){
j=i;
n++;
}
}
if(n==0)
return 0;
else printf("%s,%d,%f\n", s->stk[j].name, s->stk[j].body.height, s->stk[j].body.vision);
}
int main(void){
PhysCheckStack s;
Initialize(&s, MAX);
while (1){
int menu;
PhysCheck x;
printf("現在のデータ数:%d%d\n",Size(&s),Capacity(&s));
printf("(1) プッシュ(2) ポップ(3) ピーク(4) 表示(5) 探索(0) 終了:");
scanf("%d", &menu);
if(menu==0) break; switch (menu) { case 1: /* プッシュ */ printf("データ(身長):"); scanf("%d", &x.body.height); printf("データ(視力):"); scanf("%lf", &x.body.vision); printf("データ(名前):"); scanf("%s", &x.name); if (Push(&s, x) == -1) puts("\a エラー:プッシュに失敗しました。"); break; case 2: /* ポップ */ if (Pop(&s, &x) == -1) puts("\a エラー:ポップに失敗しました。"); else if("ポップしたデータは、名前:%s、身長:%d、視力:%fです。\n", x.name, x.body.height, x.body.vision); break; case 3: /* ピーク */ if (Peek(&s, &x) == -1) puts("\a エラー:ピークに失敗しました。"); else if("ピークしたデータは、名前:%s、身長:%d、視力:%fです。\n", x.name, x.body.height, x.body.vision); break; case 4: /* 表示 */ Print(&s); break; case 5:/* 探索 */ printf("名前:"); scanf("%s", &x.name); if(Search(&s,&x)==0) puts("\aパターンは存在しません."); break; }
}
return 0;
}
スタックを動的なものに変更したくプログラムを変えたのですが、/--- スタックにデータをプッシュ ---/のところにエラーがでてしまいます。どう解決していいかわかりません。
あなたの回答
tips
プレビュー