📄 family.cpp
字号:
delete p;
}
else
if(p->parent ->rchild &&p->parent ->rchild ==p)
{
p->parent ->rchild =NULL;
p->parent =NULL;
// t->nodenum--;
delete p;
}
}
}
else
if(p->lchild &&p->rchild ) //该节点有左右孩子
{
if(!p->parent )
{
p->rchild ->parent =NULL;
p->rchild =NULL;
destroy(p);
}
else
{
if(p->parent->lchild &&p->parent ->lchild ==p)
{
p->parent ->lchild =p->rchild ;
p->rchild ->parent =p->parent ;
p->parent =NULL;
p->rchild =NULL;
destroy(p);
}
else
if(p->parent ->rchild &&p->parent ->rchild ==p)
{
p->parent ->rchild =p->rchild ;
p->rchild ->parent =p->parent ;
p->rchild =NULL;
p->rchild =NULL;
destroy(p);
}
}
}
else
if(!p->lchild &&p->rchild ) //该节点只有右孩子
{
if(!p->parent )
{
p->rchild ->parent =NULL;
p->rchild =NULL;
delete p;
// t->nodenum--;
}
else
{
if(p->parent ->lchild &&p->parent ->lchild ==p)
{
p->parent ->lchild =p->rchild ;
p->rchild ->parent =p->parent ;
p->parent =NULL;
p->rchild =NULL;
delete p;
// t->nodenum--;
}
else
if(p->parent ->rchild &&p->parent ->rchild ==p)
{
p->parent ->rchild =p->rchild ;
p->rchild ->parent =p->parent ;
p->parent =NULL;
p->rchild =NULL;
delete p;
// t->nodenum--;
}
}
}
else
if(p->lchild &&!p->rchild ) //该节点只有左孩子
{
if(!p->parent )
{
//p->lchild ->parent =NULL;
destroy(p);
//p->lchild =NULL;
//p=NULL;
t=NULL;
}
else
{
if(p->parent->lchild &&p->parent ->lchild ==p)
{
p->parent ->lchild =NULL;
p->parent =NULL;
destroy(p);
}
else
if(p->parent ->rchild &&p->parent ->rchild ==p)
{
p->parent ->rchild =NULL;
p->parent =NULL;
destroy(p);
}
}
}
}
if(frame2(hOut,hIn,"删除成功!!"));
return t;
}
int countnode(bitree T) //先序遍历递归算法
{
if(T)
{
// cout<<T->a.parentname ;//f.write ((char*)T,sizeof(bitnode));
return 1+countnode(T->lchild)+ countnode(T->rchild);
}
//else
return 0;
}
/*void savefile(bitree&t) //保存文件
{
int x=countnode(t);
ofstream f(t->a.parentname.data(),ios::binary ) ;// 创建文件|ios::out
f.write((char*)&x,sizeof(int));
// preordertraverse(t,f);
bitnode*s,*stack[200];
s=new bitnode;
int top=0;
stack[top]=t;
while(top>=0)
{
s=stack[top--];
while(s)
{
f.write ((char*)s,sizeof(bitnode)); //写进文件
cout<<s->a.name<<ends ;
if(s->rchild)
stack[++top]=s->rchild;
s=s->lchild;
}
}
f.close();
}
bitree openfile()
{
char filename[20];
int num;
cout<<"输入文件名"<<ends;
cin>>filename;
ifstream r(filename,ios::binary); //|ios::in
if(!r)
cout<<"?error"<<endl;
bitree t;
bitnode *p;
t=new bitnode;
r.read((char*)&num,sizeof(int)); //读出节点数
cout<<"节点数"<<num<<endl;
r.read ((char*)t,sizeof(bitnode)); //读出首节点
t->parent=NULL;
t->lchild=NULL;
t->rchild=NULL;
cout<<t->a.parentname <<endl;
cout<<t->a.name <<endl;
for( ;num>1;num--)
{
p=new bitnode;
r.read ((char*)p,sizeof(bitnode));
cout<<p->a.name ;
t=insert1(t,p);
p=NULL;
}
r.close();
delete p;
return t;
}*/
void savefile(bitree&t) //保存文件
{
int x=countnode(t);
ofstream f(t->a.parentname,ios::binary ) ;// 创建文件|ios::out
f.write((char*)&x,sizeof(int));
// preordertraverse(t,f);
bitnode*s,*stack[200];
s=new bitnode;
int top=0;
stack[top]=t;
while(top>=0)
{
s=stack[top--];
while(s)
{
f.write ((char*)&(s->a),sizeof(person)); //写进文件
if(s->rchild)
stack[++top]=s->rchild;
s=s->lchild;
}
}
f.close();
}
bitree openfile(HANDLE hOut)
{
HANDLE hIn;
hIn = GetStdHandle(STD_INPUT_HANDLE); // 获取标准输入设备句柄
char filename[30];
bitree t;
bitnode *p;
t=new bitnode;
COORD pos={22,13};
SetConsoleCursorPosition(hOut,pos); //设置光标位置
int num;
cout<<"输入文件名"<<ends;
cin>>filename;
strcat(filename,".dll");
ifstream r;
r.open(filename,ios::binary);
if(!r)
{
if(!frame2(hOut,hIn,"文件不存在!"))
t=NULL;
return t;
}
else //方法一 效率高
{
r.read((char*)&num,sizeof(int)); //读出节点数
r.read ((char*)&(t->a),sizeof(person)); //读出首节点
t->parent=NULL;
t->lchild=NULL;
t->rchild=NULL;
bitree q;;
q=t;
for( ;num>1;num--)
{
p=new bitnode;
r.read ((char*)&(p->a),sizeof(person));
if(!strcmp(p->a.parentname,q->a.name))
{
q->lchild=p;
p->parent=q;
p->lchild=NULL;
p->rchild=NULL;
q=p;
}
else
if(!strcmp(p->a.parentname,q->a.parentname))
{
q->rchild=p;
p->parent=q;
p->lchild=NULL;
p->rchild=NULL;
q=p;
}
else
t=insert1(t,p);
p=NULL;
}
r.close();
delete p;
return t;
}
/*else //方法二 效率比一低
{
r.read((char*)&num,sizeof(int)); //读出节点数
r.read ((char*)&(t->a),sizeof(person)); //读出首节点
t->parent=NULL;
t->lchild=NULL;
t->rchild=NULL;
for( ;num>1;num--)
{
p=new bitnode;
r.read ((char*)&(p->a),sizeof(person));
t=insert1(t,p);
p=NULL;
}
r.close();
delete p;
return t;
}*/
}
void stat(bitree t,double&age,float&stature,int&mannum,int &x,int&y,int &a,int &b)
{
if(t)
{
char s[4];
s[3]='\0';
for(int k=0;k<3;k++)
s[k]=t->a.stature[k];
stature+=atof(s);
x++;
if(!atof(t->a.stature)) //x统计有身高的人的个数
x--;
if(strcmp(t->a.deathday,"###"))
{
char a[5],birth[5];
a[4]='\0';
birth[4]='\0';
for(int j=0;j<4;j++)
birth[j]=t->a.birthday[j];
for(int i=0;i<4;i++)
{
a[i]=t->a.deathday[i];
}
double d,bb;
bb=atof(birth);
d=atof(a);
d=d-bb;
age+=d;
y++; //平均年龄
}
if(!strcmp(t->a.sex,"男"))
mannum++;
int i;
if(!strcmp(t->a.xueli,"小学"))
{
a=1;
}
if(!strcmp(t->a.xueli,"博士"))
{
b=8;
}
if(!strcmp(t->a.xueli,"初中"))
{
i=2;
if(i>b)
b=i;
if(i<a)
a=i;
}
if(!strcmp(t->a.xueli,"高中"))
{
i=3;
if(i>b)
b=i;
if(i<a)
a=i;
}
if(!strcmp(t->a.xueli,"中专"))
{
i=4;
if(i>b)
b=i;
if(i<a)
a=i;
}
if(!strcmp(t->a.xueli,"大专"))
{
i=5;
if(i>b)
b=i;
if(i<a)
a=i;
}
if(!strcmp(t->a.xueli,"本科"))
{
i=6;
if(i>b)
b=i;
if(i<a)
a=i;
}
if(!strcmp(t->a.xueli,"硕士"))
{
i=7;
if(i>b)
b=i;
if(i<a)
a=i;
}
stat(t->lchild,age,stature,mannum,x,y,a,b);
stat(t->rchild,age,stature,mannum,x,y,a,b);
}
}
void coutxueli(int a)
{
if(a==1)
cout<<"最低学历:"<<"小学";
if(a==2)
cout<<"最低学历:"<<"初中";
if(a==3)
cout<<"最低学历:"<<"高中";
if(a==4)
cout<<"最低学历:"<<"中专";
if(a==5)
cout<<"最低学历:"<<"大专";
if(a==6)
cout<<"最低学历:"<<"本科";
if(a==7)
cout<<"最低学历:"<<"硕士";
if(a==8)
cout<<"最低学历:"<<"博士";
}
void coutxueli1(int a)
{
if(a==1)
cout<<"最高学历:"<<"小学";
if(a==2)
cout<<"最高学历:"<<"初中";
if(a==3)
cout<<"最高学历:"<<"高中";
if(a==4)
cout<<"最高学历:"<<"中专";
if(a==5)
cout<<"最高学历:"<<"大专";
if(a==6)
cout<<"最高学历:"<<"本科";
if(a==7)
cout<<"最高学历:"<<"硕士";
if(a==8)
cout<<"最高学历:"<<"博士";
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -