一度入力された数字は受け付けず、昇順に出力する二分木を作りたい
現在のプログラムでは、一度入力された数字は受け付けないが、新たに要素を入力しようとするとコアダンプし
昇順に表示できないようになっています。
また、3種類以上の要素が入力できないようになっています。
これらを解決したいです、よろしくお願いいたします。
発生している問題・エラーメッセージ
$ ./a input = 3 [ 3 ] input = 5 [ 3 5 ] input = 5 [ 3 5 ] input = 3 [ 3 5 ] input = 4 Segmentation fault (コアダンプ) $ ./a input = 3 [ 3 ] input = 4 [ 3 4 ] input = 5 Segmentation fault (コアダンプ)
該当のソースコード
//変更してもよいコード #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <math.h> #include "tree.h" static tree_node_t* create_node(int val); int count = 0; static tree_node_t* create_node(int val) /* 値 val を保持する新しい節点を作成し, その節点へのポインタを返す */ { tree_node_t *new_node; new_node = (tree_node_t*) malloc(sizeof(tree_node_t)); if (new_node == NULL) { fprintf(stderr, "節点の割当てに失敗しました\n"); exit(1); } new_node->data = val; new_node->left = NULL; new_node->right = NULL; count++; return new_node; } tree_node_t* tree_insert_uniq(tree_node_t *n, int val) /* n を根とする二分木に val (の節点) を挿入する */ { /* val と同じ値を持つ節点が存在すれば挿入しないようにせよ. */ tree_node_t *p = n; int i = 0; while(i<log(count)/log(2)) { if(p->data == val) { return n; } else if(p->data > val) { p = n->left; } else if(p->data < val) { p = n->right; } i++; } if (n==NULL) { n = create_node(val); } else if (val < n->data) { n->left = tree_insert_uniq(n->left, val); } else { n->right = tree_insert_uniq(n->right, val); } return n; } void tree_print(tree_node_t *n) /* 二分木の内容を表示する */ { if (n!=NULL) { /* 値の昇順に表示されるようにせよ */ printf(" %d", n->data); tree_print(n->left); tree_print(n->right); } } void tree_delete(tree_node_t *n) /* 二分木のデータを解放する */ { if (n!=NULL) { tree_delete(n->left); tree_delete(n->right); free(n); } }
//main関数 //変更が認められていないコード #include <stdio.h> #include "tree.h" int main (void) { tree_node_t *root = NULL; for (;;) { int data; fprintf(stderr, "input = "); if (scanf("%d", &data)==EOF) { break; } root = tree_insert_uniq(root, data); printf("["); tree_print(root); printf(" ]\n"); } tree_delete(root); return 0; }
補足情報
このほかにもヘッダファイルtree.hが存在します。
ヘッダファイルとメイン関数の変更は認められていません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。