/*========头文件声明==========*/
#include "string.h"
#include<stdio.h>
#include<iostream.h>
#include<windows.h> //包含清屏函数的头文件
/*===========二叉树结构体定义==========*/
char n[10]; //存放要查找同辈成员的名字
struct BinTreeNode; //二叉树中结点
typedef char DataType;
typedef struct BinTreeNode *PBinTreeNode; //结点的指针类型
struct BinTreeNode
{
DataType info[10];
PBinTreeNode llink;
PBinTreeNode rlink;
};
typedef struct BinTreeNode *BinTree; //将二叉树定义为指向结点的指针类型
BinTree s; //二叉树头指针
/*========所有的子函数声明==============*/
BinTree createtree(); //创建树函数声明
PBinTreeNode createRest_BTree();
void preOrder(BinTree p); //浏览树函数声明
BinTree lchild(BinTree l); //遍历左子树函数声明
BinTree rchild(BinTree r); //遍历右子树函数声明
void brothers(BinTree p); //查询同辈函数声明
void textbroth(); //测试在查找同辈前,树是否为空,并接受人名
BinTree lbrother(BinTree l); //查询左子树声明
BinTree rbrother(BinTree r); //查询右子树声明
BinTree childers(BinTree p); //查询子女函数声明
void pt(BinTree r); //打印子女成员
/*=========主函数============*/
void main()
{
int i;char z;
BinTree q;
do
{cout<<endl;
cout<<" :---------------------------------------------------------:"<<endl;
cout<<" | 《红楼梦》家族族谱树 |"<<endl;
cout<<" |=========================================================|"<<endl;
cout<<" | |"<<endl;
cout<<" | 1.创建《红楼梦》家族族谱树 |"<<endl;
cout<<" | |"<<endl;
cout<<" | 2.《红楼梦》家族族谱树浏览(括号法) |"<<endl;
cout<<" | |"<<endl;
cout<<" | 3.家族族谱同辈成员查询 |"<<endl;
cout<<" | |"<<endl;
cout<<" | 4.家族族谱儿女成员查询 |"<<endl;
cout<<" | |"<<endl;
cout<<" | 5.退出系统 |"<<endl;
cout<<" | |"<<endl;
cout<<" :---------------------------------------------------------:"<<endl;
cout<<endl;
cout<<" 请输入您选择的功能号:";
cin>>i;
system("cls"); //清屏
if(i>0)
switch(i)
{case 1:s=createtree(); system("cls");break;
case 2: system("cls");preOrder(s);cout<<endl<<endl<<"任一字母回菜单";cin>>z;system("cls");break;
case 3: system("cls");if(s==NULL){printf("这里还没有家谱的内容,请建立家谱!任一字母返回菜单");
cin>>z;system("cls");break;}else {textbroth();brothers(s);cin>>z;system("cls");}break;
case 4:system("cls");printf("请输入家长名字:");scanf("%s",n);q=childers(s);pt(q);cin>>z;system("cls");break;
case 5:{i=-1;};break;
};
cout<<endl;
}while(i>0);
cout<<"组员:张小娟、刘嘉星"<<endl;
}
/*==========创建二叉树函数=============*/
BinTree createtree(void) //创建完整二叉树
{ BinTree pbtree;
pbtree=(BinTree)malloc(sizeof(BinTree));
if(pbtree!=NULL)
pbtree=createRest_BTree(); //递归创建从根开始的二叉树
return pbtree;
}
PBinTreeNode createRest_BTree() //递归创建从根开始的二叉树
{ PBinTreeNode pbnode;
char ch[10];
scanf("%s",ch); //getchar();
//cin>>pbnode->info;
if(strcmp(ch,"@")==0) pbnode=NULL;
else
{ pbnode=(PBinTreeNode)malloc(sizeof(struct BinTreeNode));
if(pbnode==NULL)
{ printf("Out of space!\n");
return pbnode;
}
strcpy(pbnode->info,ch);
pbnode->llink=createRest_BTree(); //构造左子树
pbnode->rlink=createRest_BTree(); //构造右子树
}
return pbnode;
}
/*============前序遍历二叉树并打印所有结点函数==========================*/
void preOrder(BinTree p) //树的浏览
{
if(p==NULL) return;
printf("%s ",p->info);
preOrder(lchild(p)); //左孩子
preOrder(rchild(p)); //右孩子
}
BinTree lchild(BinTree l) //浏览左子树
{ printf("(");
return l->llink;
}
BinTree rchild(BinTree r)
{
printf(")");if(r->rlink!=NULL)printf(",");
return r->rlink;
}
/*==========接收要查询同辈兄弟的人名字函数=============*/
void textbroth()
{
printf("请输入《红楼梦》家谱一个成员名字(别打错字不然找不到)");
scanf("%s",n);
}
/*==================队列层次遍历二叉树,存储层次号,并打印同辈成员函数================*/
void brothers(BinTree p) //查找同辈成员函数
{ int z,t=0;
if(p==NULL) return;
struct //队列结构,用于层次遍历树
{ BinTree a; //二叉树节点指针
int lno; //树中每个节点的层次号
DataType as[10]; //节点中的人名
}Qu[100]; //定义顺序非循环队列
int f,r; //队首队尾
int llno;
f=r=0;
if(p!=NULL)
{ r++;
Qu[r].a=p; //根节点指针入队
Qu[r].lno=1; //根节点的层数为1
strcpy(Qu[r].as,p->info);
while(r!=f) //以下为层次遍历树,求出每个节点的层次数
{ f++;
p=Qu[f].a; //对头出队
llno=Qu[f].lno;
if(p->llink!=NULL) //左孩子入队
{ r++;
Qu[r].a=p->llink;
Qu[r].lno=llno+1;
strcpy(Qu[r].as,p->llink->info);
}
if(p->rlink!=NULL)
{r++;
Qu[r].a=p->rlink;
Qu[r].lno=llno+1;
strcpy(Qu[r].as,p->rlink->info);
}
}
}
int v=1;
while((v<=r)&&(strcmp(Qu[v].as,n)!=0))
// 找同辈兄弟,通过搜索层次数确定同辈关系
v++;
if(strcmp(Qu[v].as,n)==0)
{printf("%s",Qu[v].as);printf("的同辈兄弟有:");}
else {printf("没有找到");return;}
z=v;v=1;
while(v<=r)
{if(Qu[z].lno==Qu[v].lno)
{t++;
printf("%d %s",Qu[v].lno,Qu[v].as);}
v++;}
printf("他们这一辈人共有");printf("%d",t);printf("人");
}
/*=================查询子女函数==================*/
BinTree childers(BinTree p) //查询子女函数
{ BinTree v;
if(p==NULL)return(NULL);
else if(strcmp(p->info,n)==0)
return(p);
else
{v=childers(p->llink);
if(v!=NULL)
return(v);
else
return childers(p->rlink);
}
}
BinTree lbrother(BinTree l) // 查询左子树
{return l->llink;}
BinTree rbrother(BinTree r) //查询右自述
{return r->rlink;}
/*===============打印子女成员函数================*/
void pt(BinTree r)
{ printf("他的子女为:");
if((r->llink!=NULL)&&(r->rlink!=NULL))
{printf("%s",r->llink->info);
printf("%s",r->rlink->info);}
if((r->llink==NULL)&&(r->rlink!=NULL))
{printf("%s",r->rlink->info);
}
if((r->llink!=NULL)&&(r->rlink==NULL))
{printf("%s",r->llink->info);}
if((r->rlink==NULL)&&(r->llink==NULL))
{printf("没有子女");}
return;
}