族谱管理系统(孩子兄弟存储结构)

*/
 * Copyright (c) 2016,烟台大学计算机与控制工程学院
 * All rights reserved.
 * 文件名:test.cpp
 * 作者:常轩
 * 微信公众号:Worldhello
 * 完成日期:2016年12月27日
 * 版本号:V1.0
 * 程序输入:无
 * 程序输出:见运行结果
 */

/*
   使用孩子兄弟结构进行存储
*/
#include
#include
#include
#define MaxSize 1000
using namespace std;
char zuxian[100],chengyuan[100],fubei[100];
int zuigaomax=1;
int time=0;

typedef struct
{
char data[MaxSize]; //存放字符串 
int length; //存放串长
}SqString;
struct Tree
{
char name[100];           
char sex[100];              
char fed[100];//配偶
char thing[1000];//个人简介
char borth[100];//生日
int level;//辈分
struct Tree *child;              //孩子指针
struct Tree *brother;            //兄弟指针
struct Tree *parent;             //父亲指针
};


Tree *Create(Tree *t,char s[])
{       //创建族谱
Tree *p; 
p=new Tree;
strcpy(p->name,s);                    //祖先名字
p->brother=NULL;                      //规定祖先只有一个人,即指向兄弟的指针为空,指向父亲节点的指针为空
p->child=NULL;                        //暂且将孩子指针赋值为空
p->parent=NULL;
p->level=1;                           //记录辈分,为第一代
cout<<"请输入性别:"<>p->sex;
cout<<"请输入配偶名称:"<>p->fed;
cout<<"请输入生日:"<>p->borth;
cout<<"请输入个人简介:"<>p->thing;


t=p;
return t;                             //创建祖先成功,返回
}


Tree *Find(Tree *b,char cname[]) //查询位置
{
  Tree *p;
  if(b==NULL)                   //如果树为空,则返回NULL
    return NULL;
  else
  if(strcmp(b->name,cname)==0)  //判断查询的是否为祖先节点
  {
     return b;
  }
  else                          //如果不符合上面的两种情况,则使用递归进行下一轮查询
  {
    p=Find(b->child,cname);
    if(p!=NULL)
	{
      return p;
	}
    else
	{
      return Find(b->brother,cname);
	}
  }
}



void coutxinxi(Tree *b,char cname[]) //输出个人信息
{
   Tree *p;
   p=Find(b,cname);                 //使用查询位置函数,对所要查询的成员信息进行定位,然后再返回赋值给p
   cout<<"名字:\t"<name;
   cout<<"第"<level<<"代";
   cout<<"父辈:\t"<parent->name;
   cout<<"性别:\t"<sex;
   cout<<"配偶:\t"<fed;
   cout<<"生日:\t"<borth;
   cout<<"个人简介:\t"<thing;
}


int chaxunbeifen(Tree *b,char chaxunmingzi[]) //查询名称的辈分
{
  Tree *p;
  p=Find(b,chaxunmingzi);           //首先找到这个人,因为节点信息里包括了成员的辈分信息,所以如果此节点不为空就直接返回p->level
  if(p==NULL)
    return 0;
  else
    return p->level;
}




void add(Tree *b,char parent[],char erzi[]) //增加
{
	Tree *p,*q; 
	p=Find(b,parent);                   //根据输入的父亲节点的名字,进行查找父亲节点
	if(p==NULL)                         //为空,不存在
	{
	  cout<<"双亲不存在"<name,erzi);
	q->level=p->level+1;               //辈分在父亲结点的基础上进行+1
	cout<<"请输入性别:"<>chengyuan;
	strcpy(q->sex,chengyuan);
	cout<<"请输入配偶名称:"<>chengyuan;
	strcpy(q->fed,chengyuan);
	cout<<"请输入生日:"<>chengyuan;
	strcpy(q->borth,chengyuan);
	cout<<"请输入个人简介:"<>chengyuan;
	strcpy(q->thing,chengyuan);
	if(p->level+1>zuigaomax)         //判断一下,新增的这个节点的辈分是否超过了整个族谱的高度,如果超过则纪录最高长度的变量zuigaomax=此时的辈分+1
	{
	zuigaomax=p->level+1;
	}
	q->child=NULL;                  //接着对其孩子指针赋值为空
	q->brother=NULL;                //兄弟指针赋值为空
	q->parent=p;                    //父亲结点就是此函数刚开始时的查找到的,然后进行赋值
	   if(p->child==NULL)           //现在开始查找一下新增节点的父节点原来有没有孩子,如果没有,就直接将父节点的孩子指针直接指向次新增节点
	   {
		 p->child=q;
	   }
	  else                          //如果有孩子,则开始循环,知道查到父节点的最后一个新增的孩子节点
	  {
	  p=p->child;
	  while(p->brother!=NULL)
	  {
	   p=p->brother;
	  }
	  p->brother=q;                 //将新增的节点与查找到的最后一个孩子节点连接起来
	  }
}



void xiugai(Tree *b,char chaxunmingzi[])       //修改函数
{
	Tree *p;                                   
	p=Find(b,chaxunmingzi);                    //查找要修改的节点
	if(p==NULL)                                 //没查到,返回NULL
	{
	cout<<"查无此人"; 
	return ;
	}
	cout<<"请输入修改信息"<>chengyuan;
	strcpy(p->name,chengyuan);
	cout<<"请输入性别:"<>chengyuan;
	strcpy(p->sex,chengyuan);
	cout<<"请输入配偶名称:"<>chengyuan;
	strcpy(p->fed,chengyuan);
	cout<<"请输入生日----(格式:****--**--**)"<>chengyuan;
	strcpy(p->borth,chengyuan);
	cout<<"请输入个人简介:"<>chengyuan;
	strcpy(p->thing,chengyuan);

}


void deletechengyan(Tree * &b,char chaxunmingzi[])     //删除函数
{
	 Tree *p,*shanchus;
	 p=Find(b,chaxunmingzi);
	 if(p==NULL)
	 {
		 cout<<"此人不存在"<parent;
	 if(q==NULL)       //如果被删除节点是第一个,则释放
	 {
		 delete shanchus;
	 }
	 else if(q->child==p)    //判断被删除节点是否是父节点直接指向的节点
	 {
		 if(p->brother!=NULL)
		 {
			 q->child=p->brother;
		 }
		 delete shanchus;
		 

	 }
	else
	 {
	   Tree *r=q->child,*m;
	   m=r;
	   while(r!=NULL)
	   {
		   if(r==shanchus)
		   {
			   m->brother=r->brother;
			   delete shanchus;
			   break;

		   }
		   m=r;
		   r=r->brother;
	   }
	   
	}
}
	  




void bianli(Tree *b) //遍历  查看族谱
{
   if (b!=NULL)
   {
     for(int i=0;ilevel;i++)
           cout<<" ";
     cout <<"第"<level<<"代";
     cout <name<<"---";
     cout<<"配偶:"<fed<<"---";
     cout<<"出生日期:"<borth<child!=NULL || b->brother!=NULL)
		   {
             bianli(b->child);
             bianli(b->brother);
		   }
   }
}


  


void creatZupu(Tree * &u)                                 //创建族谱
{
	cout<<"开始创建族谱!作为祖先很光荣啊!"<>zuxian;
	u=Create(u,zuxian);
	cout<<"好了,恭喜啦!第一个祖先已经入住族谱了,后辈们要加油哟!"<=t.length)
     return true;// (i-t.length);下标
   else
     return false;

}

void bianli1(Tree *b, char aboutInformation[]) //遍历搜索
{ 
    if(b!=NULL)
	{
       
		
			if(piPei(changeSign(b->thing),changeSign(aboutInformation))==true)  //调用pipei()函数对于每一个节点的简历和关键字进行匹配,如果简历中包含关键字则输出成员姓名和成员的相关简历
			{
				cout<<"名字:\t"<name<thing<child!=NULL || b->brother!=NULL)                            //进行递归调用,遍历每一个节点的个人简历
			{
            bianli1(b->child,aboutInformation);
            bianli1(b->brother,aboutInformation);
			}
		
	}
//	else
//	  cout<<"尚未创建族谱!"<>aboutInformation;
    bianli1(u,aboutInformation);     //将关键字传入进行遍历搜索
}

int menu_select();



int main()
{
	Tree *u;
	u=NULL;
//	SqString *s,*t;
	int n;.

	while(1)
	{
	n=menu_select();

	if(n==1)
	{
		if(u==NULL)
		{
			cout<<"暂未创建族谱,请输入功能键8创建族谱!"<>chengyuan;
	cout<<"请输入添加成员的长辈名称:"<>fubei;
	add(u,fubei,chengyuan);

	}
	else if(n==2)
	{ 
		if(u==NULL)
		{
			cout<<"暂未创建族谱,请输入功能键8创建族谱!"<>chengyuan;
	deletechengyan(u,chengyuan);
	}
	else if(n==3)
	{
		if(u==NULL)
		{
			cout<<"暂未创建族谱,请输入功能键8创建族谱!"<>chengyuan;
	Tree *o=Find(u,chengyuan);
	if(o)
	{
	cout<<"名字:\t"<name<level<sex<fed<borth<thing<parent==NULL)
	{
   
	}
	else
	cout<<"爸爸为"<parent->name<>chengyuan;
	int y=chaxunbeifen(u,chengyuan);
	if(y)
	{
	cout<<"辈分为:第"<>chengyuan;
	xiugai(u,chengyuan);
	}
	else if(n==7)
	{
		if(u==NULL)
		{
			cout<<"暂未创建族谱,请输入功能键8创建族谱!"<'9');
   return c-48;

}

转载于:https://www.cnblogs.com/chxuan/p/8232117.html

你可能感兴趣的:(族谱管理系统(孩子兄弟存储结构))