家谱树-树的利用

家谱树-树的利用include include include include defineMAXSIZ intNum 记录这个人的子女数 charname 20 姓名 structTreeNo NextNode MAXSIZE 1 记录儿女结点 structTreeNo parent

#include 
  
    #include 
   
     #include 
    
      #include 
     
       #define MAXSIZE 20 typedef struct TreeNode { int Num;//记录这个人的子女数 char name[20];//姓名 struct TreeNode *NextNode[MAXSIZE+1];//记录儿女结点 struct TreeNode *parent;//记录父亲结点 }TreeNode; TreeNode *tree; void CreateTree(TreeNode *T);//创建一个家谱 void PrintTree(TreeNode *T);//输出一个家谱 void AddMember(TreeNode *T);//添加一个成员 void DeleteMember(TreeNode *T);//删除一个成员 void DeleteNode(TreeNode *p);//删除一个结点,以及它的所有子结点 int Childth(TreeNode *T,char *names);//查找names是他父母的第几个孩子 TreeNode *FindMember(TreeNode *T,char *names);//查找某人信息 void PrintMember(TreeNode *T,char *names);//输出查找的人的信息 void FindChild(TreeNode *T,char *names);//查找某人孩子 TreeNode *FindParent(TreeNode *T,char *names);//查找父母 void FindBrother(TreeNode *T,char *names);//查找兄弟 void LevelOrder(TreeNode *T);//层次遍历 int Generation(TreeNode *T);//求该家谱发展了多少代 int max(int A[],int n); int AllNo(TreeNode *T);//求该家族的总成员数目 void main() { TreeNode *parent; char findname1[20],findname2[20],findname3[20],findname4[20]; tree=(TreeNode *)malloc(sizeof(TreeNode)); int k,g,x;char ch; do{ printf("请输入你要进行的操作:\n"); printf("\t\t=============================================\n"); printf("\t\t==1、创建一颗家谱树 ==\n");//完成 printf("\t\t==2、输出一颗家谱树 ==\n");//完成 printf("\t\t==3、添加一个成员 ==\n");//完成 printf("\t\t==4、删除一个成员 ==\n");//完成 printf("\t\t==5、查找某人信息 ==\n");//完成 printf("\t\t==6、查找孩子 ==7、查找兄弟 ==8、查找父母 ==\n");//完成 printf("\t\t==9、求该家族发展多少代以及总人口 ==\n"); printf("\t\t==10、退出 ==\n"); printf("\t\t=============================================\n"); scanf("%d",&k); switch(k) { case 1: printf("请输入姓名:"); scanf("%s",tree->name); tree->parent=NULL; CreateTree(tree); printf("\n\t\t=====家谱树建立完成=========\n\n"); break; case 2: PrintTree(tree); break; case 3: AddMember(tree); break; case 4: DeleteMember(tree); break; case 5: printf("输入你要查找人的名字:"); scanf("%s",findname4); PrintMember(tree,findname4); break; case 6: printf("输入你要查找人的名字:"); scanf("%s",findname1); FindChild(tree,findname1); printf("\n\n"); break; case 7: printf("输入你要查找人的名字:"); scanf("%s",findname3); FindBrother(tree,findname3); printf("\n\n"); break; case 8: printf("输入你要查找人的名字:"); scanf("%s",findname2); parent=(TreeNode *)malloc(sizeof(TreeNode)); parent=FindParent(tree,findname2); if(parent==NULL) printf("\n\t===你查找的人没有父母,他是家族第一代!===\n"); else printf("\n\t====你要查找的人的父母已找到:===\n\t===%s父母是:%s===\n",findname2,parent->name); break; case 9: if(tree==NULL) printf("\n\t===该家族已经发展了0代===\n"); else { g=Generation(tree);x=AllNo(tree); printf("\n\t===该家族已经发展了%d代===\n",g); //printf("\t===该家族总人数有%d====\n",x);x=1;//ERROR printf("\t===该家族的人分别是====\n"); LevelOrder(tree); } break; default: break; } printf("\n\n\t\t==按任意键返回主菜单==\n\t\t"); fflush(stdin); scanf("%c",&ch); }while(k!=10); } /*1.创建*/ /*检测完毕*/ void CreateTree(TreeNode *T) { int i; TreeNode *p; printf("请输入%s子女的数目:",T->name); scanf("%d",&(T->Num)); if(T->Num!=0) { for(i=1;i<=T->Num;i++) { p=(TreeNode *)malloc(sizeof(TreeNode)); printf("\n请输入%s的第%d个子女的名字:",T->name,i); scanf("%s",p->name); p->Num=0; p->parent=T; T->NextNode[i]=p; CreateTree(T->NextNode[i]);//递归创建孩子树 } } } /*2.输出*/ /*检测完毕*/ void PrintTree(TreeNode *T) { int i; printf("\n姓名:%s",T->name); printf("\n孩子:"); for(i=1;i<=T->Num;i++) { if(T->Num!=0) { printf("%-10s",T->NextNode[i]->name); } else printf("NULL"); } printf("\n===================================\n"); for(i=1;i<=T->Num;i++) { PrintTree(T->NextNode[i]);//递归输出孩子树 } } /*3.添加*/ /*检测完毕*/ void AddMember(TreeNode *T) { char hisparents[20]; TreeNode *p,*newp; newp=(TreeNode *)malloc(sizeof(TreeNode)); printf("请输入添加人的姓名:"); scanf("%s",newp->name); newp->Num=0; if(FindMember(T,newp->name)!=NULL) printf("\t===你要添加的人已经存在==="); else { int i; printf("输入%s的父母姓名:",newp->name); scanf("%s",hisparents); p=(TreeNode *)malloc(sizeof(TreeNode)); p=FindMember(T,hisparents); i=p->Num+1; p->NextNode[i]=newp; p->Num=i; newp->parent=p; } printf("\t\t===添加人员完成===\n"); } /*4.删除*/ /*检测完毕*/ void DeleteMember(TreeNode *T) { int k; TreeNode *p1,*p2; p1=(TreeNode *)malloc(sizeof(TreeNode)); p2=(TreeNode *)malloc(sizeof(TreeNode)); char hisname[20]; printf("请输入你要删除人的姓名:"); scanf("%s",hisname); k=Childth(T,hisname); if(FindMember(T,hisname)==NULL) printf("\t===你要删除的人不存在!===\n"); else { p1=FindMember(T,hisname); p2=p1->parent; DeleteNode(p2->NextNode[k]);//删除第k个孩子的所有结点 p2->NextNode[k]=(TreeNode *)malloc(sizeof(TreeNode)); for(int i=k;i 
              Num;i++) { //从第k个孩子开始,往前移一位 p2->NextNode[i]=p2->NextNode[i+1]; } p2->Num--; } printf("\t===删除人员操作完成!===\n"); } /*检测完毕*/ TreeNode *FindMember(TreeNode *T,char *names) { TreeNode *p; p=(TreeNode *)malloc(sizeof(TreeNode)); if(strcmp(T->name,names)==0) return T; else { for(int i=1;i<=T->Num;i++) { p=FindMember(T->NextNode[i],names); if(p!=NULL) return p; } } return NULL; } /*检测完毕*/ void DeleteNode(TreeNode *p) { if(p->Num==0) { free(p); } else if(p->Num!=0) { for(int i=1;i<=p->Num;i++) { p->Num--; DeleteNode(p->NextNode[i]); } } } /*检测完毕 */ int Childth(TreeNode *T,char *names) { int i,n; TreeNode *p1,*p2; p1=(TreeNode *)malloc(sizeof(TreeNode)); p2=(TreeNode *)malloc(sizeof(TreeNode)); p1=FindMember(T,names); p2=p1->parent; for(i=1;i<=p2->Num;i++) { if(p2->NextNode[i]==p1) {n=i;break;} } return n; } /*5.查找某人信息*/ /*检测完毕/ void PrintMember(TreeNode *T,char *names) { int i=0; TreeNode *p,*p1; p=(TreeNode *)malloc(sizeof(TreeNode)); p1=(TreeNode *)malloc(sizeof(TreeNode)); p=FindMember(T,names); p1=FindParent(T,names); if(p1==NULL && p!=NULL) printf("\n\t===他是家族的第一代成员,没有父母和兄弟!===\n"); else{ printf("\n\t====他有%d个兄弟,%d个孩子====\n",p1->Num-1,p->Num); while(p!=NULL) { p=p->parent;i++; } printf("\t\t===他是家族的第%d代成员!===\n\n",i); } } /*6.查找孩子*/ /*检测完毕/ void FindChild(TreeNode *T,char *names)//6 { TreeNode *p; p=(TreeNode *)malloc(sizeof(TreeNode)); p=FindMember(T,names); if(p==NULL) printf("\n\t===你要查找的人不存在!==="); else{ if(p->Num==0) printf("\n\t===你查找的人还没有孩子===\n"); else{ printf("\n\t===你要查找的人有%d个孩子.===\n\t===孩子分别是:",p->Num); for(int i=1;i<=p->Num;i++) { printf("%-10s",p->NextNode[i]->name); } } } } /*8.查找父母*/ /*检测完毕*/ TreeNode *FindParent(TreeNode *T,char *names) { TreeNode *p1,*p2; p1=(TreeNode *)malloc(sizeof(TreeNode)); p2=(TreeNode *)malloc(sizeof(TreeNode)); p1=FindMember(T,names); if(p1==NULL) {printf("\n\t===你要查找的人不存在!==="); return NULL;} else { p2=p1->parent; return p2; } } /*7.查找兄弟*/ /检测完毕*/ void FindBrother(TreeNode *T,char *names) { TreeNode *p; int k;int i; p=(TreeNode *)malloc(sizeof(TreeNode)); if(FindMember(T,names)==NULL)printf("\n\t\t你要查找的人不存在\n"); p=FindParent(T,names); //p为names的父母 if(p==NULL) printf("\n\t===你查找的人没有父母,也没有兄弟!==="); else { k=Childth(T,names); //第k个孩子 if(p->Num==1)printf("\n\t===%s没有兄弟===\n",names); else { printf("%s的兄弟是:",names); for(i=1;i                 NextNode[i]->name); if(k                   Num) { for(i=k+1;i<=p->Num;i++) printf("%-10s",p->NextNode[i]->name); } } } } /*9.代数*/ /*/ //int a[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; int i=0,j,n; int Generation(TreeNode *T) { int a[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //if(T==NULL) {n=0;} //printf("%d",T->Num); //if(T->Num==0) {a[i]=a[i]+0;n=a[i];} //else if(T->Num!=0) { //a[i]++; //printf(" ~a[%d]=%d~",i,a[i]); for(j=1;j<=T->Num;j++,i++) { a[i]=Generation(T->NextNode[j]); //i++; } //a[i]++; //printf(" !a[%d]=%d!",i,a[i]); } n=max(a,20)+1; return n; } int max(int A[],int n) { int m; m=A[0]; for(int j=1;j                     Num!=0 &&T->Num>0) m=m+T->Num; for(int i=1;i<=T->Num;i++) { m=AllNo(T->NextNode[i]); } return m; } /层次遍历/ void LevelOrder(TreeNode *T) { int m=0; TreeNode *p; TreeNode *qu[MAXSIZE]; int rear,front; p=(TreeNode *)malloc(sizeof(TreeNode)); //qu=(TreeNode)malloc(sizeof(TreeNode)); front=rear=-1; rear++; qu[rear]=T; printf("\t"); while(front!=rear) { front=(front+1)%MAXSIZE; p=qu[front]; printf("%-4s",p->name);m++; for(int i=1;i<=p->Num;i++) { rear=(rear+1)%MAXSIZE; qu[rear]=p->NextNode[i]; } } printf("\n\t===该家族总人口数是:%d===\n",m); }                                                    

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214595.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午3:53
下一篇 2026年3月18日 下午3:53


相关推荐

  • HDU 5929 Basic Data Structure 模拟

    HDU 5929 Basic Data Structure 模拟

    2022年3月6日
    43
  • Delphi ord 函数

    Delphi ord 函数1 ord 函数 Returns nbsp the nbsp ordinal nbsp value nbsp of nbsp an nbsp ordinal type nbsp expression 返回一个序数类型表达式的序数值 nbsp Example uses nbsp Dialogs type nbsp nbsp nbsp Colors nbsp nbsp RED BLUE GREEN var nbsp nbsp S nbsp string nbsp begin nbsp nbsp nbsp S nbsp nbsp BLUE nbsp has nbsp an nbsp ordinal nbsp value nbsp

    2026年3月17日
    2
  • 经典递归解决汉诺塔_c语言汉诺塔递归算法

    经典递归解决汉诺塔_c语言汉诺塔递归算法算法:当只有一个盘子的时候,只需要从将A塔上的一个盘子移到C塔上。当A塔上有两个盘子是,先将A塔上的1号盘子(编号从上到下)移动到B塔上,再将A塔上的2号盘子移动的C塔上,最后将B塔上的小盘子移动到C塔上。当A塔上有3个盘子时,先将A塔上编号1至2的盘子(共2个)移动到B塔上(需借助C塔),然后将A塔上的3号最大的盘子移动到C塔,最后将B塔上

    2022年10月12日
    4
  • drupal安装教程mysql_Drupal(一)下载与安装

    drupal安装教程mysql_Drupal(一)下载与安装Drupal是一个使用PHP语言编写的开源内容管理系统(CMS)。然后将安装包解压到web服务器根目录下,如果你使用的是XAMPP,则解压到xampp目录下的htdocs目录。要安装Drupal,我们首先应该建立一个数据库,如在mysql中建立一个名为drupal的数据库。Drupal默认语言是英语,如果我们要创建中文站点,应该首先从http://localize.drupal.org/trans…

    2022年7月20日
    22
  • js动态创建元素,并控制元素样式

    js动态创建元素,并控制元素样式js动态创建元素,并控制元素样式

    2022年4月20日
    62
  • 缓冲区溢出攻击实验「建议收藏」

    缓冲区溢出攻击实验「建议收藏」又一个计系系统的实验。

    2022年7月12日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号