node->dataはnode->rightの部分木ぶ含まれている全てのデータ以下
という2つの条件を満たした部分木をファイルからデータを読み込み作成し、それをprint_tree関数を使って表示させるというプログラムを作りました。
データは
max 100 n 100
54
16
・
・
・
2
11
といったような形式で書かれたファイルを読み込みます。
完成したプログラムを実行したところ、動作を停止してしまいます。再帰のどこかで無限ループが起きているのだと思いますが、その原因が見つかりません。
誰かおしえてくださると助かります。
#include<stdio.h>
#include<stdlib.h>
typedef struct treenode{
int data;
int r;
struct treenode *left;
struct treenode *right;
struct treenode *prev;
}treenode;
void print_tree(struct treenode *node){//二分木を左の部分木を優先し再帰で表示する
if(node == NULL)
return;
if(node->left != NULL)
print_tree(node->left);
printf("%d\n",node->data);
if(node->right != NULL)
print_tree(node->right);
}
void add_tree(struct treenode *node, struct treenode *add){//与えられたノードを木の適切な位置に挿入する
if(node == NULL){
if(add->r == 1){
(add->prev)->right = add;
}else{
(add->prev)->left = add;
}
return;
}
else if(node->data >= add->data){
add->r = 0;
add->prev = node;
add_tree(node->left, add);
}
else{
add->r = 1;
add->prev = node;
add_tree(node->right, add);
}
}
int main(int argc, char **argv){
struct treenode *tree = NULL;
tree->left = NULL;
tree->right = NULL;
long max, n, i;
long *num;
FILE *inp;
int c = 0;
if (argc != 2){
printf("Usage: %s <ファイル名>\n", argv[0]);
return 1;
}
inp = fopen(argv[1], "r");
if (!inp)
{
printf("入力ファイルエラー\n");
return 1;
}
fscanf(inp, "max %ld n %ld\n", &max, &n);
num = malloc(sizeof(long) * n);
while(fscanf(inp, "%ld\n", num+c) != EOF){
c++;
}
fclose(inp);
if(c == n){
tree->data = num[0];
for(i = 1; i < n; i++){
treenode *add = (treenode *)malloc(sizeof(treenode));
add->data = num[i];
add->right = NULL;
add->left = NULL;
add->prev = NULL;
add->r = 0;
add_tree(tree, add);
}
print_tree(tree);
free(num);
}
else{
printf("入力ファイルエラー\n");
}
return 0;
}