📄 deletemember.cpp
字号:
#include "DefineStruct.h"
void ShowForDelete(int ID,family * member,int total,int & i)//i用于记录删除人数
{
if(member[ID].LoverID!=0)
{cout<<member[member[ID].LoverID].name<<"\t"; i++;}
if(member[ID].ChildID!=0)
{
cout<<member[member[ID].ChildID].name<<"\t";
i++;
ShowForDelete(member[ID].ChildID,member,total,i);
if(member[member[ID].ChildID].BrotherID!=0)
{
cout<<member[member[member[ID].ChildID].BrotherID].name<<"\t";
i++;
ShowForDelete(member[member[ID].ChildID].BrotherID,member,total,i);
}
}
};
void MarkForDelete(int ID,family * member,int & total)//将要删除的人的sex改为2,以作记认
{
if(member[ID].LoverID!=0) member[member[ID].LoverID].sex=2;
if(member[ID].ChildID!=0)
{
member[member[ID].ChildID].sex=2;
MarkForDelete(member[ID].ChildID,member,total);
if(member[member[ID].ChildID].BrotherID!=0)
{
member[member[member[ID].ChildID].BrotherID].sex=2;
MarkForDelete(member[member[ID].ChildID].BrotherID,member,total);
}
}
}
void DeleteMember(family * & member,int & total)
{
ShowAllName(member ,total);
//一个显示全部成员资料的函数或者显示所有成员姓名,甚至是关系树
cout<<"请输入要删除的成员姓名:";
char name[10];
cin>>name;
int ID=FindName(name,member,total);
if(ID==0){cout<<"没有此人\n"; return;}
if(ID==1){cout<<"此人为祖先,不能删除\n";return;}
show(ID,member,total);//输出对应ID的资料
int i=1;//i用于记录删除人数
if(member[ID].IsMember==1)//若不是家族成员,则不会连带删除其子孙
{
cout<<"\n\n若删除此人,则会连带将以下人删除出家谱:";
ShowForDelete(ID,member,total,i);
}
cout<<"\t共"<<i<<"人"<<endl;
cout<<"\n!!!!!!!!!!!!!!!!!\n是否删除此人?(y/n)";
char choice;//用于判断
cin>>choice;
if(choice!='y'&&choice!='Y')
{
cout<<"撤销删除\n\n";
return;
}
int TID;//用于暂时储存ID
if(member[ID].IsMember==0)//删除人不为家族成员,则不要连带删除,需修改其孩子的关系
{
if(member[ID].sex==0)//删除人为男性
{
member[member[ID].ChildID].DadID=0;
TID=ID;
while(member[TID].BrotherID!=0)//修改其弟妹的父亲
{
member[member[TID].BrotherID].DadID=0;
TID=member[TID].BrotherID;
}
}
else//删除人为女性
{
member[member[ID].ChildID].MumID=0;
TID=ID;
while(member[TID].BrotherID!=0)//修改其弟妹的母亲
{
member[member[TID].BrotherID].MumID=0;
TID=member[TID].BrotherID;
}
}
}
else//若删除人为家族成员,则需修改其父母的ChildID或兄弟的BrotherID
{
if(member[member[ID].DadID].ChildID==ID)//若父母的ChildID与删除人ID一样
member[member[ID].DadID].ChildID=member[ID].BrotherID;
else//若父母的ChildID与删除人ID不一样,则要从兄弟中删除其ID
{
TID=member[member[ID].DadID].ChildID;
while(member[TID].BrotherID!=ID)
{
TID=member[TID].BrotherID;
}
member[TID].BrotherID=member[ID].BrotherID;
}
}
member[ID].sex=2;
if(member[ID].IsMember==1)
{
MarkForDelete(ID,member,total);
}
int j=1;//计数器
int k=1;//计数器
int * f=new int[total+1];//用作映射
f[0]=0;
for(j=1;j<=total;j++)//制作映射,f(j)=k表示剩余的原来ID为J将在新的数组中变为ID为K,已删除的ID将映射为0
{
if(member[j].sex!=2)
{
f[j]=k; k++;
}
else f[j]=0;
}
for(j=1;j<=total;j++)//修改个成员中的父母弟和配偶的ID为新分配的ID
{
member[j].BrotherID=f[member[j].BrotherID];
member[j].ChildID=f[member[j].ChildID];
member[j].DadID=f[member[j].DadID];
member[j].LoverID=f[member[j].LoverID];
member[j].MumID=f[member[j].MumID];
}
int newtotal=total-i;
family * newmember=new family[total-i+1];
k=1;
for(j=1;j<=total;j++)
{
if(member[j].sex!=2)
{
newmember[k]=member[j];
k++;
}
}
member=newmember;//转换指针
total=total-i;
// ShowAll(member,total);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -