?? 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 + -