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

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

ただいまの
回答率

87.59%

c言語 コンパイルエラー

解決済

回答 1

投稿 編集

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

score 16

c言語のコンパイルエラーを改善したいです

c言語の構造体リストを用いたキューを作りたいのですがコンパイル時にエラーが発生してしまいます。
何が原因でエラーが起きていて、どのように直せば良いのでしょうか教えて欲しいです。

発生している問題・エラーメッセージ

mondai2.c: In function ‘enq’:
mondai2.c:27: error: request for member ‘next’ in something not a structure or union
mondai2.c: In function ‘deq’:
mondai2.c:38: error: request for member ‘num’ in something not a structure or union
mondai2.c:39: error: lvalue required as left operand of assignment
mondai2.c:40: error: request for member ‘next’ in something not a structure or union
mondai2.c: In function ‘free_queue’:
mondai2.c:66: error: lvalue required as left operand of assignment

該当のソースコード

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

/* 構造体 cell の宣言 */
struct cell {
  int num;
  struct cell *next;
};
typedef struct cell cell;

/**********************/
/* enq 操作を行う関数 */
/**********************/
void enq(struct cell **head, struct cell **tail, int val)
{
      cell *p;
      p=(cell*)malloc(sizeof( cell ));
      p->num = val;
      p->next = NULL;
      if(head == NULL){
    head = &p;
    tail = &p;
      }
      else{
    tail->next = &p;
    tail = &p;
      }
}

/**********************/
/* deq 操作を行う関数 */
/**********************/
int deq(struct cell **head){
  cell *p;
  int deqdata;
  deqdata = head->num;
  &p = head;
  head = head->next;
  free(p);
  return deqdata;
}

/******************************/
/* キューの中身を表示する関数 */
/******************************/
void print_queue(struct cell *head)
{
    cell *p = head;
    while(p != NULL){
      printf(" -> %d" , p->num);
      p=p->next;
    } 
    printf("\n");

}

/******************************/
/* キューの中身を空にする関数 */
/******************************/
void free_queue(struct cell **head)
{
     cell *q;
    cell *p;
    &p = head;
    while(p != NULL){
      q=p->next;
      free(p);
      p=q;
    }
    printf("プログラムを終了します\n"); 
}

int main(void)
{
  int indata;
  char in[100];
  struct cell *listhead=NULL;    /* リストの先頭を指すポインタ.データが無い場合はNULLとする. */
  struct cell *listtail;    /* リストの末端を指すポインタ */
  while(1){
    printf("操作を入力してください(enq/deq/end) ==>");
    scanf("%s" , in);
    //end入力時
    if(strcmp(in , "end") == 0){
      free(&listhead);
    }

    //enq入力時
    if(strcmp(in , "enq") == 0){
      printf("追加する値を入力して下さい ==>");
      scanf("%d" , &indata);
      enq(&listhead , &listtail , indata);
      print_queue(listhead);
    if(listhead == NULL){
      listtail = NULL;
    }
    }

    //deq入力時
    if(strcmp(in , "deq") == 0){
      if(listhead == NULL){
    printf("キューにデータはありません\n");
    free_queue(&listhead);
    break;
      }
      else{
    printf("%dはキューから消去されました\n" , deq(&listhead));
    print_queue(listhead);
      }

    }

  }


  return(0);
}

(追記ソースコード)

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

/* 構造体 cell の宣言 */
struct cell {
  int num;
  struct cell *next;
};
typedef struct cell cell;

/**********************/
/* enq 操作を行う関数 */
/**********************/
void enq(struct cell **head, struct cell **tail, int val)
{
      cell *p;
      p=(cell*)malloc(sizeof( cell ));
      p->num = val;
      p->next = NULL;
      if(head == NULL){
    head = &p;
    tail = &p;
      }
      else{
    (*tail)->next = &p;
    tail = &p;
      }
}

/**********************/
/* deq 操作を行う関数 */
/**********************/
int deq(struct cell **head){
  cell *p;
  int deqdata;
  deqdata = (*head)->num;
  p = head;
  *head = (*head)->next;
  free(p);
  return deqdata;
}

/******************************/
/* キューの中身を表示する関数 */
/******************************/
void print_queue(struct cell *head)
{
    cell *p = head;
    while(p != NULL){
      printf(" -> %d" , p->num);
      p=p->next;
    } 
    printf("\n");

}

/******************************/
/* キューの中身を空にする関数 */
/******************************/
void free_queue(struct cell **head)
{
     cell **q;
    cell **p;
    &p = head;
    while(p != NULL){
      q=(*p)->next;
      free(p);
      p=q;
    }
    printf("プログラムを終了します\n"); 
}

int main(void)
{
  int indata;
  char in[100];
  struct cell *listhead=NULL;    /* リストの先頭を指すポインタ.データが無い場合はNULLとする. */
  struct cell *listtail;    /* リストの末端を指すポインタ */
  while(1){
    printf("操作を入力してください(enq/deq/end) ==>");
    scanf("%s" , in);
    //end入力時
    if(strcmp(in , "end") == 0){
      free(&listhead);
    }

    //enq入力時
    if(strcmp(in , "enq") == 0){
      printf("追加する値を入力して下さい ==>");
      scanf("%d" , &indata);
      enq(&listhead , &listtail , indata);
      print_queue(listhead);
    if(listhead == NULL){
      listtail = NULL;
    }
    }

    //deq入力時
    if(strcmp(in , "deq") == 0){
      if(listhead == NULL){
    printf("キューにデータはありません\n");
    free_queue(&listhead);
    break;
      }
      else{
    printf("%dはキューから消去されました\n" , deq(&listhead));
    print_queue(listhead);
      }

    }

  }


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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

tail->next(*tail).nextと同じですが、

struct cell **tail

ということは、(*tail)は構造体ではないのでエラーとなります。
*tailでは「構造体へのポインタ」であり、**tailこそ構造体(struct cell)になるわけですね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2021/05/26 23:56

    回答ありがとうございます。
    このエラーについて理解することができました。

    キャンセル

  • 2021/05/27 00:02

    このことを踏まえソースコードを書き直してみたのですがあっているでしょうか?
    また今度はfreeの方法が分かりません。 このことについても教えてほしいです。

    キャンセル

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

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

関連した質問

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