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

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

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

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

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

Q&A

解決済

2回答

3432閲覧

c言語 構造体リストを用いたキュー

tamintya

総合スコア34

C

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

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

0グッド

0クリップ

投稿2021/05/27 15:38

編集2021/05/27 15:49

###キューを行いたい
構造体リストを用いたキューを作りたいのですがenqとfreeの方法が分かりません。
enqはfreeをコメントにして仮で実行してみました。
freeはうまくポインタ変数を合わせる方法が分からないです。

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

enq実行時何も表示されない。 また2回目を行うとセグメンテーション違反と表示される。 コンパイルエラー mondai2.c: In function ‘free_queue’: mondai2.c:68: 警告: assignment from incompatible pointer type

該当のソースコード

c

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

試したこと

ポインタの数の変更

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

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

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

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

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

guest

回答2

0

head = &p;

tail = &p;

*head=p;
*tail=p;

じゃないと

listhead , listtail に値が反映されません

デバッグ環境を整えて、各変数の内容を見てみてはどうでしょうか。

投稿2021/05/27 22:25

編集2021/05/27 22:27
y_waiwai

総合スコア88042

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

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

tamintya

2021/05/28 00:39

回答ありがとうございます。
guest

0

ベストアンサー

C

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

投稿2021/05/27 22:09

episteme

総合スコア16612

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

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

tamintya

2021/05/28 00:39

回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問