###セグメンテーション違反を直したいです
c言語でスタックを作ったのですがpopを実行時にセグメンテーション違反が発生してしまいます。
popの関数ではスタックから値を一つ消したいのですが、スタックの中身がひとつもないときにpopを実行するとプログラムが終了するようにしたいです。
またpopによって中身が0個になった場合はそのことを表示したいです。
よろしくおねがいします。
該当のソースコード
c言語
1#include<stdio.h> 2#include<stdlib.h> 3#include<string.h> 4 5void push( char ); 6char pop(); 7void free_stack(); 8void print_stack(); 9struct cell{ 10 char c; 11 struct cell *next; 12}; 13typedef struct cell cell; 14 15cell *p; 16cell *listhead; 17 18//pushする関数 19void push(char s/*pushする文字*/){ 20 p=(cell*)malloc(sizeof( cell ) ); 21 p->c = s; 22 p->next = listhead; 23 listhead = p; 24} 25 26//popする関数 27char pop(){ 28 cell *tmp = NULL; 29 if(listhead == NULL ){ 30 printf("スタックは空です\n"); 31 free_stack(); 32 } 33 else{ 34 tmp=p->next; 35 listhead = tmp; 36 free(p); 37 } 38 print_stack(); 39 return tmp->c; 40} 41 42//end後スタックのメモリを開放する関数 43void free_stack(){ 44 cell *q; 45 while(p != NULL){ 46 q=p->next; 47 free(p); 48 p=q; 49 } 50 printf("プログラムを終了します\n"); 51} 52 53//スタックの内容を表示する関数 54void print_stack(){ 55 while(p != NULL){ 56 printf(" -> %c" , p->c); 57 p=p->next; 58} 59 printf("\n"); 60 61} 62 63int main(void){ 64 char in[100];//スタック 65 int n=0;//保存されているデータ数 66 67 do{ 68 printf("pushする文字かpop/endを入力して下さい --> "); 69 scanf("%s" , &in[n]); 70 //endの入力 71 if(strcmp(&in[n],"end") == 0){ 72 printf("スタックを空にしました\n"); 73 free_stack(); 74} 75 //popの処理 76 else if (strcmp(&in[n],"pop") == 0){ 77 printf("popされた文字は %c です\n" , pop()); 78 if(n>0){ 79 n--; 80 } 81} 82 //popやendでない時の処理 83 else if(strlen(&in[n]) != 1){ 84 printf("不正な入力です\n"); 85 free_stack(); 86 break; 87} 88 //適切な入力の処理 89 else{ 90 push(in[n]); 91 print_stack(); 92 n++; 93} 94 95 }while(strcmp(&in[n],"end") != 0); 96 97 98 return 0; 99} 100
回答3件
あなたの回答
tips
プレビュー