質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

9405閲覧

スタック構造のpopのやり方が分かりません

y445144514451

総合スコア11

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

2クリップ

投稿2017/04/13 11:57

cでのスタック構造のポップのやり方が
プログラミングを始めたばかりでよくわからないです。
よろしくお願いします。

c

1#include<stdio.h> 2#include<stdlib.h> 3 4typedef struct _cell{ 5 int i; 6 struct _cell *next; 7}cell; 8 9typedef struct _stack{ 10 cell *head; 11}stack; 12 13/*スタックを生成する関数*/ 14stack* create(){ 15 stack *S = (stack *)malloc(sizeof(stack)); 16 S -> head = (cell *)malloc(sizeof(cell));/*ダミーセル*/ 17 S -> head -> next = NULL; 18 S -> head -> i = -1; 19 return S; 20} 21 22/*push*/ 23void push(stack *S,int i){ 24 cell *push = (cell *)malloc(sizeof(cell)); 25 push->i = i; 26 push->next = S->head->next; 27 S->head->next = push; 28} 29 30/*pop*/ 31int pop(){ /*ここのポップができない*/ 32 int i; 33 stack *S; 34 S = head->next; 35 head->next = S->next; 36 i = S->i; 37 free(S); 38 return i; 39} 40 41/*スタックの中身を表示する関数*/ 42void print(stack *S){ 43 cell *ptr = S->head->next;/*ダミーセルをスキップ*/ 44 while(ptr != NULL){ 45 printf("%d ",ptr->i); 46 ptr = ptr->next; 47 } 48 printf("\n"); 49} 50 51 52int main (){ 53 stack *S = create(); 54 55 push(S,5); 56 push(S,3); 57 push(S,6); 58 pop(S); 59 push(S,3); 60 push(S,7); 61 pop(S); 62 print(S); 63 64 return 0; 65} 66 67 68

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

このプログラムを読む限りではリスト構造の理解が前提となります。有限長配列を題材にしたものの方が敷居は低いと思います。

投稿2017/04/13 12:45

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

popの部分のみを修正しました。

c

1#include<stdio.h> 2#include<stdlib.h> 3#define HEAD_NULL_VAL -1 4 5typedef struct _cell{ 6 int i; 7 struct _cell *next; 8}cell; 9 10typedef struct _stack{ 11 cell *head; 12}stack; 13 14/*スタックを生成する関数*/ 15stack* create(){ 16 stack *S = (stack *)malloc(sizeof(stack)); 17 S -> head = (cell *)malloc(sizeof(cell));/*ダミーセル*/ 18 S -> head -> next = NULL; 19 S -> head -> i = HEAD_NULL_VAL; 20 return S; 21} 22 23/*push*/ 24void push(stack *S,int i){ 25 cell *push = (cell *)malloc(sizeof(cell)); 26 push->i = i; 27 push->next = S->head->next; 28 S->head->next = push; 29} 30 31/*pop*/ 32int pop(stack *S){ /*ここのポップができない*/ 33 int i; 34 cell *pop = S->head->next; 35 if (pop == NULL) return HEAD_NULL_VAL; 36 S->head->next = pop->next; 37 i = pop->i; 38 free(pop); 39 return i; 40} 41 42/*スタックの中身を表示する関数*/ 43void print(stack *S){ 44 cell *ptr = S->head->next;/*ダミーセルをスキップ*/ 45 while(ptr != NULL){ 46 printf("%d ",ptr->i); 47 ptr = ptr->next; 48 } 49 printf("\n"); 50} 51 52int main (){ 53 stack *S = create(); 54 55 push(S,5); 56 push(S,3); 57 push(S,6); 58 push(S,3); 59 push(S,7); 60 pop(S); 61 print(S); 62 63 return 0; 64}

投稿2017/04/13 23:32

編集2017/04/14 00:14
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2017/04/13 23:36

S は free() してはいけないし、pop は free() しなければならないと思います。
Zuishin

2017/04/13 23:38

また、pop は NULL の場合があります。この場合、アクセスバイオレーションが起こります。
A.Ichi

2017/04/13 23:45

ご指摘ありがとうございます。
Zuishin

2017/04/13 23:47

申し訳ないけどもう一つ。pop が NULL の場合の戻り値がありません。
A.Ichi

2017/04/13 23:49

NULLと0で返すと区別が付かないので何か良い値はないでしょうか?
Zuishin

2017/04/13 23:53

ダミーの値として -1 が与えられているので、それを使うのが適当ではないかと推測しますが、私からは何とも。
A.Ichi

2017/04/13 23:55

そうですねー1が良いですありがとうございます。
Zuishin

2017/04/14 00:05

これは間違いではないのですが、-1 が二カ所出てくるので、私なら #define するか、S->head->i を返します。今の仕様だと 0 以上の整数を扱うようになっているのだと思われますが、将来変わる可能性があるので。
A.Ichi

2017/04/14 00:15

ネイミングセンスの悪さは許して頂くとして、ご指摘有難うございます。
y445144514451

2017/04/19 02:15

わかりやすかったです。ありがとうございました!!
guest

0

まず pop() のシグネチャが違います。
オブジェクトではないのですから、スタックへの参照を引数で渡すのは必須です。
int pop(stack *S) でなければなりません。

次に pop() の中でローカル変数でスタックを宣言していますが、これは全く無意味なことです。使いません。

さらに、初期化もしてない先ほど宣言したスタックの中身を取り出そうとしていますが、言語道断です。

他の部分と比べて、pop() の品質のみが極端に落ちるのですが、これは別の人が書きましたか?
ならば課題だと思いますが、他人に聞いて作ってもらっても良いと許可を得ましたか?
他人に聞いても良いなら、指導者に聞いても良いはずですが、教えてくれますか?

投稿2017/04/13 15:31

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2017/04/13 15:37

pop() のみ書き直して実行したところ、問題なく動作しました。他の部分には一切手を入れる必要がありません。つまりは、push() を見ながらその逆を行うものを作ればいいだけですから、知識も他にいりません。今ここにあるコードの知識と、論理的思考ができさえすれば解ける問題ですから頑張ってください。
Zuishin

2017/04/14 00:10 編集

他の部分には一切手を入れる必要がないと書きましたが、実際に使うのであれば使い終わった(中身が残っているかもしれない)スタックを破棄する関数も作ってください。
y445144514451

2017/04/19 02:16

popの部分だけわからなかったので取り敢えずで書いていました。 とても参考になりました。ありがとうございます!
guest

0

紙の上に、スタックやセルを書いて考えてみたらどうでしょうか。

投稿2017/04/13 12:36

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問