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

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

ただいまの
回答率

91.02%

  • C

    3069questions

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

リスト構造と待ち行列

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 288

kakakaaka

score 11

リスト構造と待ち行列をしたいのですが、よくわかりません。
おすすめのサイトや説明おねがいします。

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
// 要素の構造
struct student {
  int num;
  char name[10];        // 名前の文字数は自由
};

// ポインタで渡された構造体を最後尾にデータを追加する
void enqueue(struct student *q) {
  int bango;
  char namae[10];
  bango = q->num;
  strcpy(q->namae, in_name);
}

struct student *dequeue(){
  struct student *p;
  if(root == NULL)
   return NULL;
  p = root;
  root = p->next;
  return p;
}

int main() {
  int in_num;
  char in_name[10];
  struct student *p;
  char *p_E = "E";
  char *p_D  = "D";
  char input[10];

  printf("Please input ENQ(E) or DEQ(D):");
     scanf("%s", input);
   if(strcmp(input, p_E) == 0){
      printf("Input number and name : ");
     while(scanf("%d %s", &in_num, &in_name) != EOF){
      p = (struct student *)malloc(sizeof(struct student));
      p->num = in_num;
      strcpy(p->name, in_name);
      enqueue(p);
     }
    }else if(strcmp(input, p_D) == 0){
      printf("Number=%d Name=%s\n",dequeue());
    }else(dequeue(p) == 0){
      printf("No data! ");
      break;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2017/12/11 08:52

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 3

+2

こんにちは。

お気楽C言語プログラミング超入門の「●連結リストによるキューの実装」は図解入りでサンプルソースもあるので解りやすそうですよ。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/10 17:30

    自分のイメージですが、待ち行列は「首都高の料金所の車の出入り」、キューは「ところてんを押し出しているところ」をイメージしちゃいますね。

    キャンセル

0

まずは待ち行列を配列で実装して練習するのも一考です。

提示のプログラムの形を生かすならば以下のグローバル変数を定義してpop/pushの実装ができます。

先頭ポインタhead(プログラム中ではrootという変数名)
末尾ポインタtail(または末尾の先をダブルポインタ)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/10 13:57

    待ち行列はキューとして考えるでしょうから、質問者さんが混乱しないよう、スタックに対する操作pop/pushは避けた方がよいと感じます。

    キャンセル

0

動きが異なりますが作成してみました。ご参考に

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 要素の構造
struct student {
  int num;
  char name[10];        // 名前の文字数は自由
  struct student *next; // 線形ライン
};

// ポインタで渡された構造体を最後尾にデータを追加する
struct student *enqueue(struct student *p, int in_num, char *in_name) {
  struct student *q;
  q = (struct student *)malloc(sizeof(struct student));
  q->num = in_num;
  strcpy(q->name, in_name);
  q->next = p;
  return(q);
}

struct student *dequeue(struct student *p){

  if(p == NULL)
    return NULL;
  printf("Number=%d Name=%s\n",p->num, p->name);
 struct student *q = p->next;
  free(p);
  return q;
}

void print_remain(struct student *p){
  while(p != NULL ){
    printf("\nNumber=%d Name=%s",p->num, p->name);
    p=p->next;
  }
}

int main() {
  int    in_num;
  char   in_name[10];
  struct student *p = NULL;  //先頭アドレス
  char   *p_E = "E";
  char   *p_D  = "D";
  char   input[10];

  printf("Please input ENQ(E) or DEQ(D):");
  while(scanf("\n%s", input) != EOF){
    if(strcmp(input, p_E) == 0){
      printf("Input number and name : ");
      while(scanf("\n%d%s", &in_num, &in_name) != EOF){
        p=enqueue(p, in_num, in_name);
        printf("Input number and name : ");
      }
    }else if(strcmp(input, p_D) == 0){
      p=dequeue(p);
    }else if(p == NULL){
      printf("No data! ");
    }
    printf("\nPlease input ENQ(E) or DEQ(D):");
  }
  print_remain(p);
  printf("\n");
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/11 18:19

    少なくとも dequeue() 関数が未完成だと、return と free(p) が語ってますねw

    キャンセル

  • 2017/12/11 18:44 編集

    ご指摘ありがとうございます。その通りでした。 typedef使うともう少しスッキリする気がします。

    キャンセル

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

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

関連した質問

  • 解決済

    cp -r コマンドのC言語による実装

    前提・実現したいこと ls -r コマンドのC言語のソースコードを参考にして cp -r コマンドを実装しているのですが どこを変えていいのかわかりません… 該当のソー

  • 解決済

    C言語の構造体で2分木を作るプログラムの実行時エラーの解決策を教えてください。

    初心者なので不備が多いかと思いますが、とりあえず動くようにしたいです。 自分でいろいろいじってみましたがどうしてもわかりません。 どこをどう直せばいいのかどなたかご教授お願い致

  • 解決済

    オーバーフローします...

    前提・実現したいこと アルファベット順に表示したいです どうやったらアルファベット順に表示できますか? もし,このままでいいならオーバーフローを直して欲しいです... アル

  • 解決済

    C言語のエラー修正について

    コード #include <stdio.h> #define New (element) RealNew( & element ) #define InputInt( number

  • 解決済

    C 言語strcpyについて

    線形リストを作ってその構造体の中にpathname配列に格納されている文字列を記憶させるプログラムを作っているのですが警告が出てきてうまく動作してくれません。"stack is s

  • 解決済

    char型の配列変数にchar型の変数を代入したい

    使用言語 C 環境 Visual Studio 2017 初めての質問です。 独学でプログラミングを始めたのですがわからないところがあり困っています。 char型の配列変数の使い方

  • 解決済

    c言語 リスト構造について...

    前提・実現したいこと 最近C言語でリスト構造を勉強したので自己流でリスト構造のプログラムを作成したのですが正常に作動しません。どなたか解決法を教えてください。 説明不足だったの

  • 受付中

    スタックをうまく動かす

    #include <stdio.h> #include <string.h> #define MAX 100 int stack[MAX]; //stackは配列を利用して実現

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

  • C

    3069questions

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