###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
該当のソースコード
c
1 2#include <stdio.h> 3#include <stdlib.h> 4#include<string.h> 5 6/* 構造体 cell の宣言 */ 7struct cell { 8 int num; 9 struct cell *next; 10}; 11typedef struct cell cell; 12 13/**********************/ 14/* enq 操作を行う関数 */ 15/**********************/ 16void enq(struct cell **head, struct cell **tail, int val) 17{ 18 cell *p; 19 p=(cell*)malloc(sizeof( cell )); 20 p->num = val; 21 p->next = NULL; 22 if(head == NULL){ 23 head = &p; 24 tail = &p; 25 } 26 else{ 27 tail->next = &p; 28 tail = &p; 29 } 30} 31 32/**********************/ 33/* deq 操作を行う関数 */ 34/**********************/ 35int deq(struct cell **head){ 36 cell *p; 37 int deqdata; 38 deqdata = head->num; 39 &p = head; 40 head = head->next; 41 free(p); 42 return deqdata; 43} 44 45/******************************/ 46/* キューの中身を表示する関数 */ 47/******************************/ 48void print_queue(struct cell *head) 49{ 50 cell *p = head; 51 while(p != NULL){ 52 printf(" -> %d" , p->num); 53 p=p->next; 54 } 55 printf("\n"); 56 57} 58 59/******************************/ 60/* キューの中身を空にする関数 */ 61/******************************/ 62void free_queue(struct cell **head) 63{ 64 cell *q; 65 cell *p; 66 &p = head; 67 while(p != NULL){ 68 q=p->next; 69 free(p); 70 p=q; 71 } 72 printf("プログラムを終了します\n"); 73} 74 75int main(void) 76{ 77 int indata; 78 char in[100]; 79 struct cell *listhead=NULL; /* リストの先頭を指すポインタ.データが無い場合はNULLとする. */ 80 struct cell *listtail; /* リストの末端を指すポインタ */ 81 while(1){ 82 printf("操作を入力してください(enq/deq/end) ==>"); 83 scanf("%s" , in); 84 //end入力時 85 if(strcmp(in , "end") == 0){ 86 free(&listhead); 87 } 88 89 //enq入力時 90 if(strcmp(in , "enq") == 0){ 91 printf("追加する値を入力して下さい ==>"); 92 scanf("%d" , &indata); 93 enq(&listhead , &listtail , indata); 94 print_queue(listhead); 95 if(listhead == NULL){ 96 listtail = NULL; 97 } 98 } 99 100 //deq入力時 101 if(strcmp(in , "deq") == 0){ 102 if(listhead == NULL){ 103 printf("キューにデータはありません\n"); 104 free_queue(&listhead); 105 break; 106 } 107 else{ 108 printf("%dはキューから消去されました\n" , deq(&listhead)); 109 print_queue(listhead); 110 } 111 112 } 113 114 } 115 116 117 return(0); 118} 119
(追記ソースコード)
#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); }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/26 14:56
2021/05/26 15:02