###キューを行いたい
構造体リストを用いたキューを作りたいのですが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
試したこと
ポインタの数の変更
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/28 00:39