- ベストアンサー
スタックのデータ構造を作りたい
C言語でスタックと、スタックにデータを入れるプッシュ、取り出すポップを作りたいと思っており そこで以下のようなものを作ってみました。 ********************************************** #include<stdio.h> typedef struct{ int a[100]; int head=0; }Stack; void push(Stack stc,int x){ stc.a[head]=x; stc.head++; } int pop(Stack stc){ return(stc.a[head-1]); stc.head--; } int main void{ int j; Stack s; push(s,5); push(s,90); j=pop(s); printf("%d",j); j=pop(s); printf("%d",j); return 0; } ****************************** コンパイルするとエラーが出まくりです。 何をどう直せばよいのか、どこが変なのかご教授いただきたいです。 よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#include<stdio.h> typedef struct{ int a[100]; int head; }Stack; void Stack_init(Stack *stc){ stc->head=sizeof(stc->a)/sizeof(int); } void push(Stack *stc, int x){ stc->a[--(stc->head)]=x; } int pop(Stack *stc){ return(stc->a[stc->head++]); } int main(void){ int j; Stack s; Stack_init(&s); push(&s,5); push(&s,90); j=pop(&s); printf("%d\n",j); j=pop(&s); printf("%d\n",j); return 0; }
その他の回答 (2)
- sakusaker7
- ベストアンサー率62% (800/1280)
エラーメッセージみてもわかりませんか? push()/pop() で配列の添え字に使っている head が未定義なのはそのとおりで、多分Stack構造体のメンバー変数 headを使うつもりなのがそうなっていないということですね。 push() で xが使われていないとでているのは前者の影響。 return(stc.a[head-1]); stc.head--; のようにreturn の後に置いてもそれは実行されません(メッセージの通り) ですから、 先に stc.head-- しておいて、その値を使って配列にアクセスする (わざわざ-1してアクセスしているのだから同じこと)か、 return stc.a[--stc.head]; のようにします。 最後に typedef struct{ int a[100]; int head=0; } Stack; ですが、型を定義している(typdef)ところで変数を初期化する ようなこと(int head=0;)はできません。 C++ならコンストラクタで初期化するところですが、Cなら 初期化関数を用意するなどしましょう。
とりあえずエラー書いてくださいよ、全部読むの大変なんだから。 学生以来なので、間違っていたらごめんなさい ぱっと見で変そうなのはreturnした後に計算しても int pop(Stack stc){ return(stc.a[head-1]); stc.head--; } なぜvoid? int main void{
補足
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland algo2-1.c: エラー E2139 algo2-1.c 6: 宣言に ; がない エラー E2451 algo2-1.c 10: 未定義のシンボル head(関数 push ) 警告 W8057 algo2-1.c 12: パラメータ 'x' は一度も使用されない(関数 push ) エラー E2451 algo2-1.c 15: 未定義のシンボル head(関数 pop ) 警告 W8066 algo2-1.c 16: 実行されないコード(関数 pop ) 警告 W8070 algo2-1.c 17: 関数は値を返すべき(関数 pop ) *** 3 errors in Compile *** エラーメッセージは上のようです。 voidについてはint main(void)でした。申し訳ないです。