#include struct Node{ int number; struct Node *left; struct Node *right; }; void print_indent(int width){ while(width !=0){ printf(" "); width--; } } void print_tree(struct Node *topnode, int level){ if (topnode !=NULL){ print_tree(topnode->left, level+1); /*左ノードに向かう*/ print_indent(level); /*レベル分インデント*/ printf("%d\n", topnode->number);/*数字の表示*/ print_tree(topnode->right, level+1); /*右ノードに向かう*/ } } struct Node *add_node(struct Node *newnode_ptr, struct Node *nownode_ptr){ /*最新ノードの値が注目ノードの値より小さい場合*/ if (newnode_ptr->number < nownode_ptr->number){ if (nownode_ptr->left == NULL){ nownode_ptr->left = newnode_ptr; } else{ /*注目ノードを一階層下げて再帰*/ add_node(newnode_ptr,nownode_ptr->left); } } /*最新ノードの値が注目ノードの値と等しい場合*/ else if (newnode_ptr->number == nownode_ptr->number){ printf("その値は既に登録されているため新規登録できませんでした。\n"); } /*最新ノードの値が注目ノードの値より大きいの場合*/ else{ if (nownode_ptr->right == NULL){ nownode_ptr->right = newnode_ptr; } else{ /*注目ノードを一階層下げて再帰*/ add_node(newnode_ptr,nownode_ptr->right); } } return(nownode_ptr); } main(){ /*変数の定義*/ int newnumber; /*新しい数字*/ /*rootの定義*/ struct Node *root; /*新しいセルを指すポインタの定義*/ struct Node *newnode_ptr; /*rootはとりあえずNULLを指す*/ root=NULL; while(1){ printf("数字を入力してください、0を入力すると終了します。\n"); scanf("%d",&newnumber); if(newnumber==0)break; /*0が入力されたらループ脱出*/ /*構造体変数とポインタの作成*/ newnode_ptr=(struct Node*)malloc(sizeof(struct Node)); /*作った構造体のポインタにNULLを指させておく*/ newnode_ptr->left=NULL; newnode_ptr->right=NULL; /*新しくできた構造体変数内のint型変数に、 入力された値を代入する*/ newnode_ptr->number=newnumber; if (root==NULL){ root=newnode_ptr; /*rootに今作ったノードを指される*/ }else{ add_node(newnode_ptr,root); /*新しいノードの場所を探しに行く*/ } printf("-----tree------\n\n"); print_tree(root,0); printf("\n====================================================\n"); } }