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

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

ただいまの
回答率

90.33%

  • C

    3995questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 2,061

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

#include<stdio.h>
#include<stdlib.h>

typedef struct _cell{
  int i;
  struct _cell *next;
}cell;

typedef struct _stack{
  cell *head;
}stack;

/*スタックを生成する関数*/
stack* create(){
  stack *S = (stack *)malloc(sizeof(stack));
  S -> head = (cell *)malloc(sizeof(cell));/*ダミーセル*/
  S -> head -> next = NULL;  
  S -> head -> i = -1;
  return S;  
}

/*push*/
void push(stack *S,int i){
  cell *push = (cell *)malloc(sizeof(cell));
  push->i = i;
  push->next = S->head->next;
  S->head->next = push;
}

/*pop*/
int pop(){           /*ここのポップができない*/
  int i;
  stack *S;  
  S = head->next;
  head->next = S->next;
  i = S->i;
  free(S);
  return i;
}

/*スタックの中身を表示する関数*/
void print(stack *S){
  cell *ptr = S->head->next;/*ダミーセルをスキップ*/
  while(ptr != NULL){
    printf("%d ",ptr->i);
    ptr = ptr->next;
  }
  printf("\n");
}


int main (){
  stack *S = create();

  push(S,5);
  push(S,3);
  push(S,6);
  pop(S);
  push(S,3);
  push(S,7);
  pop(S);
  print(S);

  return 0;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+4

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+1

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

#include<stdio.h>
#include<stdlib.h>
#define HEAD_NULL_VAL -1

typedef struct _cell{
  int i;
  struct _cell *next;
}cell;

typedef struct _stack{
  cell *head;
}stack;

/*スタックを生成する関数*/
stack* create(){
  stack *S = (stack *)malloc(sizeof(stack));
  S -> head = (cell *)malloc(sizeof(cell));/*ダミーセル*/
  S -> head -> next = NULL;
  S -> head -> i = HEAD_NULL_VAL;
  return S;
}

/*push*/
void push(stack *S,int i){
  cell *push = (cell *)malloc(sizeof(cell));
  push->i = i;
  push->next = S->head->next;
  S->head->next = push;
}

/*pop*/
int pop(stack *S){           /*ここのポップができない*/
  int i;
  cell *pop = S->head->next;
  if (pop == NULL) return HEAD_NULL_VAL;
  S->head->next = pop->next;
  i = pop->i;
  free(pop);
  return i;
}

/*スタックの中身を表示する関数*/
void print(stack *S){
  cell *ptr = S->head->next;/*ダミーセルをスキップ*/
  while(ptr != NULL){
    printf("%d ",ptr->i);
    ptr = ptr->next;
  }
  printf("\n");
}

int main (){
  stack *S = create();

  push(S,5);
  push(S,3);
  push(S,6);
  push(S,3);
  push(S,7);
  pop(S);
  print(S);

  return 0;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/14 08:36

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

    キャンセル

  • 2017/04/14 08:38

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

    キャンセル

  • 2017/04/14 08:45

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

    キャンセル

  • 2017/04/14 08:47

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

    キャンセル

  • 2017/04/14 08:49

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

    キャンセル

  • 2017/04/14 08:53

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

    キャンセル

  • 2017/04/14 08:55

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

    キャンセル

  • 2017/04/14 09:05

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

    キャンセル

  • 2017/04/14 09:15

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

    キャンセル

  • 2017/04/19 11:15

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/14 00:37

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

    キャンセル

  • 2017/04/14 09:09 編集

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

    キャンセル

  • 2017/04/19 11:16

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

    キャンセル

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C

    3995questions

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