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

📄 family.cpp

📁 这是一个族谱的管理系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include"jiapu.h"
#include"frame.h"
#include "else.h"
#include <stdlib.h>

#include <fstream>
bitree create(HANDLE hOut ,HANDLE hIn)                  //初始化 创建文件
{
	bitree t;
	t=new bitnode;
	COORD pos={22,12};
	SetConsoleCursorPosition(hOut,pos);
	cout<<"输入家谱名:";
	cin>>t->a.parentname ;
	char name[24];
	strcpy(name,t->a.parentname);
	strcat(name,".dll");
	if(FileExist(name))
	{
		if(frame4(hOut,hIn));
		else
		{
			t=NULL;
			return t;
				
		}
	}

	strcat(t->a.parentname,".dll");
	strcpy(t->a.birthaddress,"###");
	strcpy(t->a.birthday,"###");
	strcpy(t->a.consort,"###");
	strcpy(t->a.zhiche,"###");
	strcpy(t->a.deathday,"###");
	strcpy(t->a.name,"###");
	strcpy(t->a.sex,"###");
	strcpy(t->a.stature,"###");
	strcpy(t->a.work,"###");
	strcpy(t->a.xueli,"###");

	pos.Y+=2;
	SetConsoleCursorPosition(hOut,pos);
	cout<<"          输入族长的信息"<<endl;
	t=cinnode(t,hOut);

	if(t){
	
	t->lchild =NULL;
	t->parent =NULL;
	t->rchild =NULL;
	}
	return t;
}



bitnode* search(bitree &T,char name[30])         //查找  返回节点
{
	bitnode*p,*q;
	if(T)
	{ 
		if(!strcmp(T->a.name,name))
			return T;
		p=search(T->lchild ,name);
		q=search(T->rchild ,name);
		if(p)return p;
		else return q;
	}
	return T;
}

bitree insert(bitree&T)          //添加新成员
{
	
	HANDLE hOut,hIn;
	INPUT_RECORD mouseRec;
	DWORD  res;	
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄

	hIn = GetStdHandle(STD_INPUT_HANDLE); // 获取标准输入设备句柄
	if(!T)
	{
		T=create(hOut,hIn);
		return T;
	}
	else
	{
	COORD pos={21,13};
	SetConsoleCursorPosition(hOut,pos);	
	cout<<" 双击击添加人的父亲或输入父亲的姓名";
    COORD pos1={28,14};
	button a,*pp,h;
	COORD posh2={47,9};
	h.createbutton(posh2," ↖ ",14,236,hOut);
	a.createbutton(pos1,"输入父亲姓名",14,236,hOut);

	char name[30];
		int x=countnode(T);
	pp=print1(T,pp,x,hOut);

    	for(;;)
	{
		BOOL tal=false;
		ReadConsoleInput(hIn, &mouseRec, 1,&res);
		mousemove1(hOut,hIn,a,mouseRec);
		for(int k=0;k<x;k++)
		{
			if(!pp[k].p)
				pp[k].hidebutton(hOut,true);
			mousemove1(hOut,hIn,pp[k],mouseRec);
		}
		mousemove(hOut,hIn,h,mouseRec);
	//	mousemove(hOut,hIn,g,mouseRec);
		if(mouseclickl(hOut,hIn,h,mouseRec))
			return T;
		if(mouseclickl(hOut,hIn,a,mouseRec))
		{
			pos1.X+=12;
			SetConsoleCursorPosition(hOut,pos1);	
			cin>>name ;
			break;
		}
		else
		{
			for(int j=0;j<x;j++)
			{
				if(mousedoubleclick(hOut,hIn,pp[j],mouseRec))
				{
					strcpy(name,pp[j].buttonname);
					tal=true;
					break;
				}

			}
			//break;
		}
		if(tal)
			break;
	}
	COORD posq1={21,13},posq2={180,180};//用于清屏

	clearscreen(hOut,posq1,posq2);

	bitnode*q;
	q=search(T,name);                                     //查找q
	if(!q)                                               //没有找到name
	{
		if(frame2(hOut,hIn,"此人不存在!"));//cout<<"输入有误!!"<<endl;
		return T;
	}
	else
	{
		bitnode *p;
		p=new bitnode;

		strcpy(p->a.parentname,name);
		strcpy(p->a.birthaddress,"###");
		strcpy(p->a.birthday,"###");
		strcpy(p->a.consort,"###");
		strcpy(p->a.zhiche,"###");
		strcpy(p->a.deathday,"###");
		strcpy(p->a.name,"###");
		strcpy(p->a.sex,"###");
		strcpy(p->a.stature,"###");
		strcpy(p->a.work,"###");
		strcpy(p->a.xueli,"###");
		p=cinnode(p,hOut);
		 /*cout<<"姓名:";
		 cin>>p->a.name ;
		 */		 
		 if(!p)return T;
		 p->lchild =NULL;
		 p->parent =NULL;
		 p->rchild =NULL;
	//	 p->a.namel=p->a.name .length ();
		if(!q->lchild)                                   //情况1 
		{
			p->parent =q;
		//	p->a.parentname =q->a.name ;
			q->lchild =p;
		
			p->lchild =NULL;
			p->rchild =NULL;
		//	T->nodenum++;
		}
		else                                             //情况2 
		{
		//	p->a.parentname =q->a.name ;
			q=q->lchild ;
			while(q->rchild )
				q=q->rchild ;
			q->rchild =p;
			p->parent =q;
			
			p->lchild =NULL;
			p->rchild =NULL;
		//	T->nodenum++;
			
		}
	
		p=NULL;
		delete p;	
		return T;
	}
	}
}
bitree insert1(bitree&T,bitnode*p)
{
	bitnode*q;
		q=search(T,p->a.parentname); 	//查找q
//	cout<<q->a.name ;
		if(!q->lchild)                                   //情况1 
		{
			p->parent =q;
			q->lchild =p;
			
			p->lchild =NULL;
			p->rchild =NULL;
		}
		else                                             //情况2 
		{
			q=q->lchild ;
			while(q->rchild )
				q=q->rchild ;
			q->rchild =p;
			
			p->parent =q;
			p->lchild =NULL;
			p->rchild =NULL;
			
		}
	p=NULL;
	return T;

}
void print(bitree t)                                 //打印家谱┣ ━ ┳ ┃┣ ┗
	   
{	
	HANDLE hOut,hIn;
	hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出设备句柄
	hIn = GetStdHandle(STD_INPUT_HANDLE); // 获取标准输入设备句柄
	if(!t)
	   if(!frame2(hOut,hIn,"家谱为空!!"))
		   return;
	else
	{
 
	int l,y,x;

	COORD pos= {22,16};                     //输出位置
    SetConsoleCursorPosition(hOut,pos);   //设置光标的位置
	cout<<"┣";
	
	pos.X+=2;
	SetConsoleCursorPosition(hOut,pos);   //设置光标的位置
	bitnode *s,*stack[200];
	int top=0;
	stack[top]=t;
	while(top>=0)
	{
		s=stack[top--];          //出栈
		if(!s->parent)
		{;}
		else
		{
		y=pos.Y +2;
		pos=s->pos;
		for(;pos.Y <y;pos.Y ++)
		{
			SetConsoleCursorPosition(hOut,pos);//重新设置光标的位置
			cout<<"┃";
		}
		SetConsoleCursorPosition(hOut,pos);//重新设置光标的位置
		if(s->rchild)
			
		{
			cout<<"┣";
		}
		else
		{
			cout<<"┗";
		}
		pos.X =pos.X +2;
        SetConsoleCursorPosition(hOut,pos);//重新设置光标的位置
		}

		while(s)
		{
			cout<<s->a.name ;
			l=strlen(s->a.name) ;
			x=pos.X;
			if(s->lchild)
			{
				cout<<"━";
				
					if(s->lchild ->rchild )
				{
					cout<<"┳";
				
				}
					else
					{
						cout<<"━";
					}
				pos.X =pos.X+4+l;
				SetConsoleCursorPosition(hOut,pos);//重新设置光标的位置
			}
			
			if(s->rchild)
			{
				stack[++top]=s->rchild ;//入栈
			    stack[top]->pos .X =x-2;                     //记录光标的位置
				stack[top]->pos.Y=pos.Y +1;
			}		
			s=s->lchild ;
		
		}	
	}
	cout<<endl<<endl;}
}

void destroy(bitnode*p)
{
	if(p)
	{
		destroy(p->lchild );
		destroy(p->rchild );
		delete p;
	//	t->nodenum--;
	}
}
bitree del(bitree&t)                            //删除节点
{
	HANDLE hOut,hIn;
	INPUT_RECORD mouseRec;
	DWORD  res;	

	hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄

	hIn = GetStdHandle(STD_INPUT_HANDLE); // 获取标准输入设备句柄
	bitnode *p;
	char name[30];
	p=new bitnode;
		
//	string name;
	button a,*pp,h;
	COORD posh2={47,9};
	h.createbutton(posh2," ↖ ",14,236,hOut);
	COORD pos1={28,14};
	a.createbutton(pos1,"输入姓名",14,236,hOut);

	int x=countnode(t);
	pp=print1(t,pp,x,hOut);

    COORD pos={21,13};
	SetConsoleCursorPosition(hOut,pos);	
	cout<<" 双击要删除的人或输入他的姓名:";

	for(;;)
	{
		BOOL tal=false;
		ReadConsoleInput(hIn, &mouseRec, 1,&res);
		mousemove1(hOut,hIn,a,mouseRec);
		for(int k=0;k<x;k++)
		{
			if(!pp[k].p)
				pp[k].hidebutton(hOut,true);
			mousemove1(hOut,hIn,pp[k],mouseRec);
		}
		mousemove(hOut,hIn,h,mouseRec);
		if(mouseclickl(hOut,hIn,h,mouseRec))
			return t;
		if(mouseclickl(hOut,hIn,a,mouseRec))
		{
			pos1.X+=8;
			SetConsoleCursorPosition(hOut,pos1);	
			cin>>name ;
			break;
		}
		else
		{
			for(int j=0;j<x;j++)
			{
				if(mousedoubleclick(hOut,hIn,pp[j],mouseRec))
				{
					strcpy(name,pp[j].buttonname);
					tal=true;
					break;
				}

			}
			//break;
		}
		if(tal)
			break;
	}



	
//	bitnode*q=new bitnode;
	p=search(t,name);                                     //查找q
	if(!p)                                               //没有找到name
	{
		//pos.Y=pos.Y+1;
	//	SetConsoleCursorPosition(hOut,pos);	
		//cout<<"                 无此人!!";
		if(frame2(hOut,hIn,"此人不存在!"));
		return t;
	}
/*	else
	{
		if(!p->parent)
		{
			destroy(p,t);
			t=NULL;
		}*/
		
		else
		{
		
			if(!p->lchild&&!p->rchild )                        //该节点为叶子节点
			{
				if(!p->parent )
				{
				//	t->nodenum--;
					t=NULL;
					
					//delete p;

				}
				else
				{
					if(p->parent ->lchild &&p->parent ->lchild ==p)
					{
						p->parent ->lchild =NULL;
						p->parent =NULL;
					//	t->nodenum--;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -