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

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

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

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

Q&A

解決済

2回答

1836閲覧

C言語 キュー デキュー

junnnnchan

総合スコア26

C

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

0グッド

0クリップ

投稿2020/06/15 12:43

#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct {/*--- キューを実現する構造体 ---*/ int max; /* キューの容量 */ int num; /* 現在の要素数 */ int front;/* 先頭要素カーソル */ int rear; /* 末尾要素カーソル */ int **que; /* キュー本体(の先頭要素へのポインタ) */ } StringsQueue; /*--- キューの初期化 ---*/ int Initialize(StringsQueue *q, int max){ q->num = q->front = q->rear = 0; if ((q->que = calloc(max, sizeof(char *))) == NULL) { q->max = 0; /* 配列の確保に失敗 */ return -1; } q->max = max; return 0; } /*--- キューの後始末 ---*/ void Terminate(StringsQueue *q){ if (q->que != NULL) { free(q->que);/* 配列を解放 */ q->max = q->num = q->front = q->rear = 0; } } /*--- キューにデータをエンキュー ---*/ int Enque(StringsQueue *q, char *x){ if (q->num >= q->max)return -1; if ((q->que[q->rear] = calloc(strlen(x)+1, sizeof(char))) == NULL)return -1; /* キューは満杯 */ q->num++; strcpy( q->que[q->rear] ,x); q->rear++; if (q->rear == q->max) q->rear = 0; return 0; } /*--- キューからデータをデキュー ---*/ int Deque(StringsQueue *q, char *x){ if (q->num <= 0)/* キューは空 */ return -1; q->num--; x = q->que[q->front]; free(q->que[q->front]); q->front++; if (q->front == q->max) q->front = 0; return 0; } /*--- キューからデータをピーク 次のデキューで取り出される値を見る---*/ int Peek(const StringsQueue *q, char *x) { if (q->num <= 0) return -1; x = q->que[q->front]; return 0; } /*--- キューの容量 ---*/ int Capacity(const StringsQueue *q){ return (q->max); } /*--- キューに蓄えられているデータ数 ---*/ int Size(const StringsQueue *q){ return (q->num); } /*--- 全データの表示 ---*/ void Print(const StringsQueue *q){ int i; for(i = 0; i < q->num; i++) printf("%s ", q->que[(i + q->front) % q->max]); putchar('\n'); } int main(void){ StringsQueue que; if (Initialize(&que, 7) == -1) { puts("キューの生成に失敗しました。"); } while (1) { int m; char x[79]; printf("現在のデータ数:%d/%d\n", Size(&que), Capacity(&que)); printf("(1) エンキュー (2) デキュー (3) ピーク (4) 表示 (0) 終了:"); scanf("%d", &m); if (m == 0) break; switch(m){ case 1: printf("データ:"); scanf("%s", x); if (Enque(&que, x) == -1) puts("\a エラー:データのエンキューに失敗しました。"); break; case 2: if (Deque(&que, x) == -1) puts("\a エラー:デキューに失敗しました。"); else printf("デキューしたデータは%s です。\n", x); break; case 3: /* ピーク */ if (Peek(&que, x) == -1) puts("\a エラー:ピークに失敗しました。"); else printf("ピークしたデータは%s です。\n", x); break; case 4: /* 表示 */ Print(&que); break; } } Terminate(&que); return 0; }

<質問>
エンキューで
a
b
c
と入力し、
デキューを三回行うと



となってしまいます。デキューをしたら
a
b
c
と出力できるようにしたいです。なぜこのようになってしまっているのでしょうか。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

Enqueでrearに要素を足しているならDequeも同じrear側から要素を取らないとだめでは?

投稿2020/06/15 13:10

fu7mu4

総合スコア1088

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

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

0

ベストアンサー

C言語のコードを組むなら、デバッグできる環境を整えましょう。
Eclipseとか、WidnowsならVisualStudioとか。
任意の行で実行止めて、変数のナカミを参照できます。
また、1行づつ実行させ、変数やバッファの内容を参照できます。
そうすれば、当てずっぽでコードを書くことがなくなり、うまく動かない原因を探ることができるようになります

投稿2020/06/15 13:02

y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問