前提
C言語で最小の要素を見つける優先度付きキューを作っています。
実行後,iを入力し挿入する値を入力したところコアダンプが発生しました。
また、値が入っていない状態でdを入力してもコアダンプが発生しました。
実現したいこと
1回目の操作を正常終了するようにしたい。
(2回目以降の操作は試せていないため正しく動くか分からない)
発生している問題・エラーメッセージ
$ ./a.exe insert: i, delete: d i Input key 3 Segmentation fault (コアダンプ)
該当のソースコード
C言語
1#include<stdio.h> 2#include<stdlib.h> 3 4#define N 100 5 6int A[N+1]; 7 8void init(); 9void insert(int x, int *A, int *n); 10void upmin(int i, int *A, int n); 11void swap(int a, int b, int *A); 12int deletemin(int *A, int *n); 13void downheapmin(int i, int *A, int n); 14 15void init() 16{ 17 int i; 18 for(i = 0; i <= N; i++){ 19 A[i] = 0; 20 } 21} 22 23int main(void) 24{ 25 int n; 26 int *z = 0; 27 char s[2]; 28 29 init(); 30 printf("insert: i, delete: d\n"); 31 while(scanf("%1s", s) != EOF){ 32 switch (s[0]){ 33 case 'i': 34 case 'I': 35 printf("Input key\n"); 36 scanf("%d", &n); 37 insert(n, A, z); 38 break; 39 case 'd': 40 case 'D': 41 printf("key:%d\n", deletemin(A, z)); 42 break; 43 } 44 printf("insert: i, delete: d\n"); 45 } 46 return(0); 47} 48 49void insert(int x, int *A, int *n) 50{ 51 int n1; 52 53 n1 = *n; 54 if(n1 >= N){ 55 printf("Error: Priority queue A is full\n"); 56 exit(1); 57 } 58 A[n1] = x; 59 upmin(n1, A, n1+1); 60 *n = n1+1; 61} 62 63void upmin(int i, int *A, int n) 64{ 65 int j; 66 67 if(i >= N){ 68 printf("Error: The value of i is wrong\n"); 69 exit(1); 70 } 71 if(i == 0){ 72 return; 73 } 74 j = (i-1)/2; 75 if(A[i] < A[j]){ 76 swap(i, j, A); 77 upmin(j, A, n); 78 } 79} 80 81void swap(int a, int b, int *A) 82{ 83 int tmp; 84 85 tmp = A[a]; 86 A[a] = A[b]; 87 A[b] = tmp; 88} 89 90int deletemin(int *A, int *n) 91{ 92 int min, n1; 93 94 n1 = *n; 95 if(n1 < 1){ 96 printf("Error: Priority queue is empty\n"); 97 exit(1); 98 } 99 min = A[0]; 100 A[0] = A[n1-1]; 101 if(n1 > 1){ 102 downheapmin(0, A, n1-1); 103 } 104 *n = n1-1; 105 return(min); 106} 107 108void downheapmin(int i, int *A, int n) 109{ 110 int j; 111 112 if(i >= N){ 113 printf("Error: The value of i is wrong\n"); 114 exit(1); 115 } 116 j = 2*i + 1; 117 if(j >= n){ 118 return; 119 } 120 if((A[2*(i+1)] < A[2*i+1]) && (2*(i+1) < n)){ 121 j = 2*(i+1); 122 } 123 if(A[i] > A[j]){ 124 swap(i, j, A); 125 downheapmin(j, A, n); 126 } 127} 128
試したこと
1回目の操作でエラーが出るため、main関数のint *z=0がおかしいような気がしてポインタを外してみたのですが、同様にコアダンプが起こりました。
プログラミングは、気分でやるものでもまぐれ当たりを狙ってやるものでもありません。
筋道を通して行った試行とその結果を書いてください。
回答2件
あなたの回答
tips
プレビュー