みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

スタックのデータ構造を作りたい

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;
}
******************************
コンパイルするとエラーが出まくりです。
何をどう直せばよいのか、どこが変なのかご教授いただきたいです。
よろしくお願いいたします。

投稿日時 - 2006-06-04 21:06:38

QNo.2195511

すぐに回答ほしいです

質問者が選んだベストアンサー

#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;
}

投稿日時 - 2006-06-05 04:35:15

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

エラーメッセージみてもわかりませんか?

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なら
初期化関数を用意するなどしましょう。

投稿日時 - 2006-06-04 23:10:16

ANo.1

とりあえずエラー書いてくださいよ、全部読むの大変なんだから。
学生以来なので、間違っていたらごめんなさい

ぱっと見で変そうなのはreturnした後に計算しても
int pop(Stack stc){
return(stc.a[head-1]);
stc.head--;
}

なぜvoid?
int main void{

投稿日時 - 2006-06-04 21:23:40

補足

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)でした。申し訳ないです。

投稿日時 - 2006-06-04 22:35:37

あなたにオススメの質問