二進検索木
下記のプラグラムで二進検索木を作りたいのですが、うまくいきません(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);
}
お礼
ありがとうございます。 実は質問をした二時間後に自己解決してしまいました(削除しようにも一日経たないと駄目なんですね)。 kacchannさんの書かれた方法が昨日まで欲しかったんです。特に、 > public void copyFromRoot(IntBSTNode pRoot) { > root = copy(pRoot); > } と > return ego;//複製を返す です。 > bst2のrootノードもちゃんとコピーした? > nullのまんまでない? さすが、鋭いですね。そうです、私が解決した方法というのは ego = new IntBSTNode(source.key, l, r); を root = new IntBSTNode(source.key, l, r); にする方法です。 bst2で呼んでいるのでrootは既にbst2のものなんですね (てっきりrootはまだbst1のものだと思っていました)。 私のごちゃごちゃしたプログラムを見て、 修正して下さってありがとうございました!