二進検索木
下記のプラグラムで二進検索木を作りたいのですが、うまくいきません(2つまでしか保存ができない)。
たぶん、ポインタがおかしいと思うのですが・・・。お願いします。
入力
年齢 1
名前 a
メアド a@
年齢 2
名前 b
メアド b@
年齢 3
名前 c
メアド c@
年齢 -1
出力
b
×
c
×
×
歳 2
名前 b
メアド b@
歳 3
名前 c
メアド c@
#include<stdio.h>
#include<stdlib.h>
struct node{
char *name;
char *email;
int age;
struct node *left;
struct node *right;
};
void getline(char *s,int n){
int c;
while(--n>0&&((c=getchar())!=EOF && c!='\n'))
*s++=c;
*s='\0';
}
char* dupstr(char* strg){
char* newstr;
newstr = (char*)malloc(sizeof(char)*strlen(strg));
strcpy(newstr,strg);
return newstr;
}
struct node *new(int n,char *na,char *em){
struct node *p;
p=malloc(sizeof(struct node));
p->age=n;
p->name=na;
p->email=em;
p->left=NULL;
p->right=NULL;
return p;
}
void print(struct node *p){
if(p==NULL)return;
else{
print(p->left);
printf("\n歳:%d ", p->age);
printf("\n名前:%s ", p->name);
printf("\nメアド:%s ", p->email);
print(p->right);
}
}
void print_tree(struct node *p,int level){
int i;
for(i=0;i<level;i++)printf(" ");
if(p==NULL)printf("×\n");
else{
printf("%s\n",p->name);
print_tree(p->left,level+1);
print_tree(p->right,level+1);
}
}
void *insert(struct node *p,int n,char *na,char *em){
int c;
c=strcmp(p->name,na);
if(c==0);
else if(c>0){
if(p->left==NULL)
{p->left=new(n,na,em);
return p;}
else
insert(p->left,n,na,em);
}
else{
if(p->right==NULL){
p->right=new(n,na,em);
return p;}
else
insert(p->right,n,na,em);
}
}
main()
{
int age,g;
char buf[80],a[80],b[80],*email,*name;
struct node *root=NULL;
g=1;
printf("\n歳を入力:");
getline(buf,sizeof(buf));
printf("\n名前入力:");
getline(a,sizeof(a));
name=dupstr(a);
age=atoi(dupstr(buf));
printf("\nメアド入力:");
getline(b,sizeof(b));
email=dupstr(b);
root=new(age,name,email);
while(g==1){
printf("\n歳を入力:");
getline(buf,sizeof(buf));
age=atoi(dupstr(buf));
if(age==-1)
break;
printf("\n名前入力:");
getline(a,sizeof(a));
name=dupstr(a);
printf("\nメアド入力:");
getline(b,sizeof(b));
email=dupstr(b);
root=insert(root,age,name,email);
}
print_tree(root,0);
print(root);
}