前提
C言語でリストを用いてキューを実現するプログラムを作っています。
数回エンキューを行い、それ以上の回数のデキューを行ったところ、設定した「queue is empty」というエラーメッセージが表示されず、コアダンプが発生しました。
実現したいこと
- キューに値が入っていないときにデキューを行った際に「queue is empty」と表示される
発生している問題・エラーメッセージ
$ ./a.exe enqueue: e, dequeue: d e Input key 1 enqueue: e, dequeue: d e Input key 2 enqueue: e, dequeue: d d key:1 enqueue: e, dequeue: d d key:2 enqueue: e, dequeue: d d Segmentation fault (コアダンプ)
該当のソースコード
C言語
1#include<stdio.h> 2#include<stdlib.h> 3 4typedef struct s_queue{ 5 int key; 6 struct s_queue *next; 7} QUEUE; 8 9QUEUE *queuetop, *queuerear; 10 11int main(void) 12{ 13 int n; 14 char s[2]; 15 queuetop = NULL; 16 queuerear = NULL; 17 18 printf("enqueue: e, dequeue: d\n"); 19 while(scanf("%1s", s) != EOF) { 20 switch (s[0]){ 21 case 'e': 22 case 'E': 23 printf("Input key\n"); 24 scanf("%d", &n); 25 enqueue(n); 26 break; 27 case 'd': 28 case 'D': 29 printf("key:%d\n", dequeue()); 30 break; 31 } 32 printf("enqueue: e, dequeue: d\n"); 33 } 34 return(0); 35} 36 37void enqueue(int k) 38{ 39 QUEUE *new; 40 QUEUE *newqueue(void); 41 42 new = newqueue(); 43 new->key = k; 44 if(queuerear == NULL){ 45 queuetop = new; 46 queuerear = new; 47 } 48 else { 49 queuerear->next = new; 50 queuerear = new; 51 } 52} 53 54int dequeue(void) 55{ 56 QUEUE *w; 57 int k; 58 59 if(queuetop == NULL){ 60 printf("queue is empty\n"); 61 exit(1); 62 } 63 else { 64 k = queuetop->key; 65 w = queuetop; 66 queuetop = w->next; 67 free(w); 68 } 69 return k; 70} 71 72QUEUE *newqueue(void) 73{ 74 QUEUE *p; 75 76 p = (QUEUE *)malloc(sizeof(QUEUE)); 77 if(p == NULL){ 78 fputs("malloc failed\n", stderr); 79 exit(1); 80 } 81 else { 82 return p; 83 } 84}
回答2件
あなたの回答
tips
プレビュー