⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 deletemember.cpp

📁 家谱用于记录某家族历代家族成员的情况与关系。现编制一个家谱资料管理软件
💻 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 + -