家谱树项目

家谱树项目FamilyTree c ifndefFAMILY C defineFAMILY C include FamilyTree h include include include includevoidI Tree structBinNod tree tree NULL structBinNod S

FamilyTree.c

#ifndef FAMILYTREE_C #define FAMILYTREE_C #include "FamilyTree.h" #include 
    #include 
    #include 
    #include 
    void Init_Tree(struct BinNode *tree) { (tree) = NULL; } struct BinNode *Search_Tree(struct BinNode *T, char *name) { int i, j, count; struct BinNode *Q[100]; i = j = 0; if(T) { Q[j++] = T; while(i 
  
    while(Q[i]&& strcmp(Q[i] 
   ->data.Name, name)!= 
   0) { 
   if(Q[i] 
    -> child) { Q[j++] = Q[i] 
   ->child; } Q[i] = Q[i] 
    -> brother; } 
   if(Q[i]&& strcmp(Q[i] 
   ->data.Name, name) == 
   0) { 
   return Q[i]; } i++; } } 
   return NULL; } struct BinNode *Insert(struct BinNode *root, ifo N) 
   //由个人信息插出入家族树中 { struct BinNode *head, *q; 
   if(root==NULL) 
   //当根节点为空 { root = (struct BinNode *)malloc(sizeof(BinNode)); 
   //开辟空间 root->brother = root->child = root->parent = NULL; 
   //初始化指针 root-> data = N; 
   //初始化信息 
   return root; 
   //返回根节点 } 
   if(!strcmp(root->data.Father,N.Name)) 
   //当插入的是根节点的父亲 { head = (struct BinNode *)malloc(sizeof(BinNode)); 
   //开辟空间 head->data = N; 
   //初始化信息 head 
    -> child = root; 
   //孩子指针指向当前的根节点 head 
    -> brother = NULL; 
   //初始化指针 head 
    -> parent = NULL; 
   while(root->brother) 
   //将所有的兄弟节点的父亲指针更新 { root->brother->parent = head; root = root->brother; } root = head; 
   //更新根节点 } 
   else 
   if(strcmp(root->data.Father, N.Father)== 
   0) 
   //当要插入的节点是根节点的亲兄弟 { head = (struct BinNode *)malloc(sizeof(BinNode)); 
   //开辟空间 head 
    -> data = N; 
   //初始化信息 root 
    -> brother = head; 
   //确定指针指向 head 
    -> child = NULL; head 
    -> brother = NULL; head 
    -> parent = NULL; } 
   else 
   //当要插入的成员为家谱树中已有成员的孩子 { head = Search_Tree(root, N.Father); 
   //找到父亲指针的位置 
   if(head 
    -> child == NULL) 
   //当插入的为长子 { q = (struct BinNode *)malloc(sizeof(struct BinNode)); 
   //开辟空间 q->data = N; 
   //传递信息 head->child = q; 
   //更新指针指向 head->child->brother = NULL; head->child->parent = head; head->child->child = NULL; } 
   else 
   //当插入的成员不是长子时 { q = head 
    -> child; 
   while(q 
    -> brother) 
   //找到要插入的位置 { q = q 
    -> brother; } q->brother = (struct BinNode *)malloc(sizeof(struct BinNode)); 
   //开辟空间 q->brother->data = N; 
   //更新信息 q->brother->child = NULL; 
   //更新指针信息 q->brother->parent = Search_Tree(root, N.Father); q->brother->brother = NULL; } } 
   return root; 
   //返回根节点 } 
   void Tranverse(struct BinNode *tree) { 
   if(tree) { sw[pp ++] = tree 
    -> data; 
   if(tree 
    -> child) Tranverse(tree 
    -> child); 
   if(tree 
    -> brother) Tranverse(tree 
    -> brother); } } struct BinNode *Read_File(struct BinNode *root) { FILE *fp; int i; char name[ 
   121]; printf( 
   "\t\t查找家谱文件~\n"); sleep( 
   1); int ff= 
   0; 
   if((fp=fopen( 
   "tree.txt", 
   "rb"))==NULL) ff= 
   1; 
   if(!ff) { 
   if((fp=fopen( 
   "tree.txt", 
   "rb+"))==NULL) { printf( 
   "\t\tCannot open file !"); 
   return ; } printf( 
   "\t\t文件打开成功。\n"); sleep( 
   1); fscanf(fp, 
   "%d",&n); pr=sr; fread(pr,sizeof(ifo),n,fp); fclose(fp); 
   for(i= 
   0; i 
   
     1); printf( 
    "\t\t~~~~~~~~~~~~~^_^ 家谱树创建成功!!!~~~~~~~~~~~~\n\n"); sleep( 
    1); } 
    else { printf( 
    "\t\t~~~~~~~~~~~~~T_T 家谱树创建失败!!!~~~~~~~~~~~~\n\n"); sleep( 
    1); } 
    return root; } 
    void Save_Data(struct BinNode *tree) { FILE *fp; 
    if((fp = fopen( 
    "tree.txt", 
    "wb+")) == NULL) { printf( 
    "\t\tERROR\n"); 
    return ; } pp = 
    0; Tranverse(tree); fprintf(fp, 
    "%d", n); pw = sw; fwrite(pw, sizeof(ifo), n, fp); fclose(fp); sleep( 
    1); printf( 
    "\t\t~~~~~~~~~~~~~^_^ 文件创建成功!!!~~~~~~~~~~~~\n\n"); sleep( 
    1); } 
    void LeavelOrderTraverse_Tree(struct BinNode *tree) { 
    if(tree) { int i; printf( 
    "\t\t"); 
    for(i = 
    0;i <= tree 
     -> data.Degress;i++) { printf( 
    " "); } printf( 
    "-%s\n",tree 
     -> data.Name); 
    if(tree 
     -> child) { LeavelOrderTraverse_Tree(tree 
     -> child); } 
    if(tree 
     -> brother) { LeavelOrderTraverse_Tree(tree 
     -> brother); } } 
    else printf( 
    "\t\t请重新建树\n"); } 
    void Print_child(struct BinNode *person) { printf( 
    "\t\t他的儿女为: "); 
    (person) = (person) -> child; 
    while((person) != NULL) { printf 
    ("%s\n", (person)->data.Name); (person) = (person) -> brother; } } 
    /*输出父亲*/ 
    void Print_parent(struct BinNode *person) { printf( 
    "\t\t他的父母为: "); 
    (person) = (person)-> parent; printf 
    ("%s\n", (person)->data.Name); } /*查找个人信息*/ void OutputMessage(struct BinNode *tree, char name[]) { struct BinNode *t; t = Search_Tree((tree), name); if(t != NULL) { printf("\t\t姓名:%s\n", (t)->data.Name); printf("\t\t性别:%s\n", (t)->data.Sex); printf("\t\t父亲姓名:%s\n", (t)->data.Father); printf("\t\t辈分:%d\n", (t)->data.Degress); printf("\t\t孩子个数:%d\n", (t)->data.Num); printf("\t\t出生地:%s\n", (t)->data.Born); printf("\t\t职业:%s\n", (t)->data.Job); printf("\t\t毕业大学:%s\n", (t)->data.College); } else { printf("\t\t这个人不存在\n"); sleep(1); } } /*查找直系*/ void Search_Di(struct BinNode *tree, char name[]) { struct BinNode *x, *y; x = Search_Tree(tree, name); if(x == NULL) { printf("\t\t这个人不存在\n"); sleep(1); } else { y = x; if((x) -> parent == NULL&&(x) -> child != NULL)//无父有子 { printf("\t\t他是整个家族的最长者\n"); Print_child(x); } else if((x) -> parent == NULL&&(x) -> parent == NULL)//无父无子 { printf("\t\t他是个孤儿\n"); } else if((x) -> parent != NULL&&(x) -> child == NULL)//有父无子 { printf("\t\t他没有子女\n"); Print_parent(x); } else if((x) -> parent != NULL&&(x) -> child != NULL)//有父有子 { Print_parent(x); Print_child(y); } } } /*查找关系*/ void Search_Relation(struct BinNode *tree, char name1[], char name2[]) { struct BinNode *p1, *p2; p1 = Search_Tree(tree,name1); p2 = Search_Tree(tree,name2); if(p1 == NULL||p2 == NULL) { printf("\t\t输入了错误的姓名;\n"); sleep(1); } else { printf("\t\t两人的关系是: "); if((p1)->data.Degress == (p2)->data.Degress)//辈分相同 { if(strcmp(((p1)->parent) -> data.Name, ((p2)->parent) -> data.Name) == 0)//父亲是同一个人 { printf("\t\t是亲兄弟\n"); } else { printf("\t\t是第%d代的堂兄弟\n", (p1)->data.Degress); } } else//辈份不同 { if(p1 -> data.Degress > p2 -> data.Degress) { int t = p1 -> data.Degress - p2 
     -> data.Degress; 
    if(t == 
    1&&p2 
     -> child == p1) { printf( 
    "\t\t%s是%s的父亲\n", p2 
     -> data.Name, p1 
     -> data.Name); } 
    else { printf( 
    "\t\t%s是比%s大%d辈的长辈\n", p2 
     -> data.Name, p1 
     -> data.Name, t); } } 
    else 
    if(p2 
     -> data.Degress > p1 
     -> data.Degress) { int t = p2 
     -> data.Degress - p1 
     -> data.Degress; 
    if(t == 
    1 && p1 
     -> child == p2) { printf( 
    "\t\t%s是%s的父亲\n", p1 
     -> data.Name, p2 
     -> data.Name); } 
    else { printf( 
    "\t\t%s是比%s大%d辈的长辈\n", p1 
     -> data.Name, p2 
     -> data.Name, t); } } } } } 
    /*查找嫡系祖先*/ 
    void Search_Dld(struct BinNode *tree, char name[]) { struct BinNode *person = Search_Tree(tree, name); 
    if(person == NULL) { printf( 
    "\t\t不存在这个人\n"); sleep( 
    1); } 
    else { printf( 
    "\t\t嫡系祖先为: "); 
    while 
    ((person) -> parent != NULL) { printf("%s\n", ((person) -> parent)->data.Name); (person) = (person) -> parent; } } } int Empty_Tree(struct BinNode *tree) 
    //树的判空 { 
    if(tree == NULL) 
    return OK; 
    else 
    return ERROR; } struct BinNode *Clear_Tree(struct BinNode *q) 
    //清空树同时清空内存 { 
    if(q) { 
    if(q 
     -> brother) { Clear_Tree(q 
     -> brother); } 
    if(q 
     -> child) { Clear_Tree(q 
     -> child); } 
    if(q) { free(q); q = NULL; } } 
    return q; } struct BinNode *Add_New_Root(struct BinNode *tree) 
    //添加成员为:整个家谱的祖先(新的祖先) { int i; char name[ 
    100]; struct BinNode *p; char sex[ 
    100]; 
    //信息的输入 
    if(tree != NULL) { printf( 
    "\t\t请输入所要添加的成员的信息:"); printf( 
    "\n\t\t姓名:"); scanf( 
    "%s", name); i = check_name(name); 
    //判断输入是否合法 
    if(i == 
    0) { printf( 
    "\t\t不合法\n"); sleep( 
    1); 
    return tree; } p = Search_Tree(tree,name); 
    //判断输入的名字是否存在 
    if(p != NULL) { printf( 
    "\t\t已存在\n"); sleep( 
    1); 
    return tree; } printf( 
    "\n\t\t性别(M or F):"); scanf( 
    "%s", sex); i = check_sex(sex); 
    //判断输入是否合法 
    if(i == 
    0) { printf( 
    "\t\t不合法\n"); sleep( 
    1); 
    return tree; } 
    //实现添加 n ++; struct BinNode *head; head = (struct BinNode *)malloc(sizeof(struct BinNode)); 
    //开辟空间 head 
     -> data.Degress = - 
    1; head 
     -> child = tree; 
    //初始化 head 
     -> brother = NULL; head 
     -> parent = NULL; int number = 
    1; strcpy(head->data.Father, 
    "unknown"); strcpy(head->data.Sex, sex); strcpy(head->data.Name, name); tree 
     -> parent = head; strcpy(tree 
     -> data.Father,head 
     -> data.Name); head = Srand(head); head 
     -> data.Num = 
    1; 
    return head; } 
    else { printf( 
    "\t\t请先建树\n"); sleep( 
    1); 
    return tree; } } struct BinNode *Srand(struct BinNode *tree) { char a[ 
    100][ 
    100]={ 
     
    "北京", 
    "上海", 
    "武汉", 
    "天津", 
    "广州", 
    "山东", 
    "福建", 
    "澳门", 
    "贵州", 
    "西安"}; char b[ 
    100][ 
    100]={ 
     
    "IT工程师", 
    "建筑设计师", 
    "高级技师", 
    "公务员", 
    "人力资源总监", 
    "科学家", 
    "警察", 
    "律师", 
    "工人", 
    "CEO"}; char c[ 
    100][ 
    100]={ 
     
    "北京大学", 
    "上海大学", 
    "解放军国防科学技术大学", 
    "北京师范大学", 
    "厦门大学", 
    "山东理工大学", 
    "同济大学", 
    "电子科技大学", 
    "北京航空航天大学", 
    "南开大学"}; int i,j; srand((unsigned)time(NULL)); strcpy(tree 
     -> data.Born, a[rand()% 
    10]); strcpy(tree 
     -> data.Job, b[rand()% 
    10]); strcpy(tree 
     -> data.College, c[rand()% 
    10]); 
    return tree; } struct BinNode *Bl_Tree(struct BinNode *tree) 
    //遍历树,将它的辈数+ 
    1 { 
    if(tree) { tree 
     -> data.Degress++; 
    if(tree 
     -> brother) { Bl_Tree(tree 
     -> brother); } 
    if(tree 
     -> child) { Bl_Tree(tree 
     -> child); } } 
    return tree; } 
    void Change_ifo(struct BinNode *tree) { char name[ 
    100]; char name1[ 
    100]; struct BinNode *t,*p; int i; printf( 
    "\n\t\t请输入你要修改的人的名称: "); scanf( 
    "%s", name); i = check_name(name); 
    //判断输入是否合法 
    if(i == 
    0) { printf( 
    "\t\t不合法\n"); sleep( 
    1); 
    return ; } printf( 
    "\n\t\t请输入修改后的名字: "); scanf( 
    "%s",name1); i = check_name(name); 
    //判断输入是否合法 
    if(i == 
    0) { printf( 
    "\t\t不合法\n"); sleep( 
    1); 
    return ; } t = Search_Tree(tree,name); 
    if(t == NULL) { printf( 
    "\n\n\t\t*不存在该人\n"); sleep( 
    1); 
    return ; } 
    else { p = Search_Tree(tree,name1); 
    if(p == NULL) { strcpy 
    ((t) -> data.Name,name1); printf("\t\t姓名修改成功!!!\n"); printf("\t\tta的性别?(1男,2女): "); scanf("%d",&i); if(i == 1) { strcpy((t) -> data.Sex,"M"); //将性别输入男 } else if(i == 2) { strcpy((t) -> data.Sex,"F"); //将性别输入女 } else { printf("\t\tAre you kidding me???"); sleep(1); } } else { printf("\t\t该名字已存在\n"); sleep(1); } } } int Sub_Menu1()//添加成员界面 { char key[100]; system("clear"); printf("\e[30m\e[1m%s\e[0m","\t\t|-------------------------------------------------|\n"); printf("\e[34m\e[1m%s\e[0m","\t\t|------A:添加某个人作为某个现有成员的孩子 -------|\n"); printf("\e[34m\e[1m%s\e[0m","\t\t|------B:添加某个人作为某个现有成员的祖先 -------|\n"); printf("\e[32m\e[1m%s\e[0m","\t\t|-----------------其他键---退出 ------------------|\n"); printf("\e[30m\e[1m%s\e[0m","\t\t|---------------请选择您的操作: "); gets(key); if(key[0] != 'A'&&key[0] != 'B') { printf("\t\t输入操作错误请重新输入\n"); } if(key[0] == 'A') return 1; if(key[0] == 'B') return 2; } struct BinNode *Input_New_Person(struct BinNode *tree)//添加成员为:某个现有成员的孩子 { char names[100]; char namef[100]; char sex[100]; int i; struct BinNode *p, *q; printf("\n\t\t|---*---请输入您要添加成员的名字:"); scanf("%s", names); i = check_name(names);//判断输入是否合法 if(i == 0) { printf("\t\t不合法\n"); sleep(1); return tree; } printf("\n\t\t|---*---请输入该成员父亲的名字:"); scanf("%s", namef); i = check_name(namef);//判断输入是否合法 if(i == 0) { printf("\t\t不合法\n"); sleep(1); return tree; } if(Search_Tree(tree, namef)==NULL) { printf("\t\t不存在\n"); sleep(1); return tree; } struct BinNode * head; if(Search_Tree(tree, names)!=NULL) { printf("\t\t|---*---家谱树中已有该成员! ---*----|\n"); printf("\t\t|---*---!!信息插入失败!! ---*----|\n"); sleep(1); return tree; } if(tree==NULL)//当家谱树为空 { printf("\n\t\t*请输入该成员的性别(M or F):"); scanf("%s", sex); i = check_sex(sex);//判断输入是否合法 if(i == 0) { printf("\t\t不合法\n"); sleep(1); return tree; } n ++; tree = (struct BinNode *)malloc(sizeof(struct BinNode));//开辟空间 tree->brother = tree->child = tree->parent = NULL; 
    //初始化 tree->data.Degress = 
    1; strcpy(tree->data.Father, namef); strcpy(tree->data.Sex, sex); tree->data.Num = 
    0; strcpy(tree->data.Name, names); tree = Srand(tree); 
    return tree; 
    //返回根节点 } 
    else 
    if(Search_Tree(tree, namef)!=NULL) 
    //父亲节点 { head = Search_Tree(tree, namef); 
    if(head 
     -> child == NULL) 
    //当该成员为长子时 { printf( 
    "\n\t\t*请输入该成员的性别(M or F):"); scanf( 
    "%s", sex); i = check_sex(sex); 
    //判断输入是否合法 
    if(i == 
    0) { printf( 
    "\t\t不合法\n"); sleep( 
    1); 
    return tree; } n ++; p = (struct BinNode *)malloc(sizeof(struct BinNode)); 
    //开辟空间 p 
     -> data.Degress = head 
     -> data.Degress+ 
    1; strcpy(p->data.Father, namef); strcpy(p->data.Sex, sex); strcpy(p->data.Name, names); p 
     -> data.Num = 
    0; 
    //子女数目 p 
     -> child = NULL; p 
     -> brother = NULL; p 
     -> parent = head; head->child = p; head->data.Num++; 
    //子女数目增加 p = Srand(p); } 
    else { p = (struct BinNode *)malloc(sizeof(struct BinNode)); 
    //开辟空间 q = head 
     -> child; 
    //建立指针指向 p->data.Degress = q->data.Degress; strcpy(p->data.Father, namef); printf( 
    "\n\t\t*请输入该成员的性别(M or F):"); scanf( 
    "%s", sex); i = check_sex(sex); 
    //判断输入是否合法 
    if(i == 
    0) { printf( 
    "\t\t不合法\n"); sleep( 
    1); 
    return tree; } strcpy(p->data.Sex, sex); strcpy(p->data.Name, names); 
    while(q 
     -> brother) { q = q 
     -> brother; } n ++; p->data.Num = 
    0; 
    //子女数目 p 
     -> child = NULL; 
    //更新指针信息 q->brother = p; p 
     -> brother = NULL; p 
     -> parent = head; head->data.Num++; 
    //子女数目更新 p = Srand(p); } } 
    else 
    //当该成员与其他成员没有关系 { printf( 
    "\t\t~~该成员和其他成员没有关系,插入不成功~~\n"); sleep( 
    1); 
    return tree; } printf( 
    "\t\t信息插入成功*\n"); sleep( 
    1); 
    return tree; } struct BinNode *Creat_Tree(struct BinNode *tree) 
    //创建树 { int i; char name[ 
    100]; char sex[ 
    100]; tree = (struct BinNode *)malloc(sizeof(struct BinNode)); printf( 
    "\t\t请输入所要添加的成员的信息:"); printf( 
    "\n\t\t姓名:"); scanf( 
    "%s", name); i = check_name(name); 
    //判断输入是否合法 
    if(i == 
    0) { printf( 
    "\t\t不合法\n"); sleep( 
    1); 
    return tree; } printf( 
    "\n\t\t性别(M or F):"); scanf( 
    "%s", sex); i = check_sex(sex); 
    //判断输入是否合法 
    if(i == 
    0) { printf( 
    "\t\t不合法\n"); sleep( 
    1); 
    return tree; } n ++; strcpy 
    ((tree)->data.Name, name); strcpy((tree)->data.Sex, sex); (tree)->child = NULL; 
    (tree)->brother = NULL; 
    (tree)->parent = NULL; 
    (tree)->data.Degress = 
    0; 
    //最初建树的这个结点,先作为第 
    0辈,最大的祖先 
    (tree)->data.Num = 
    0; 
    //最初没有孩子 strcpy 
    ((tree)->data.Father, "unknown"); printf("\t\t输入成功!\n"); tree = Srand(tree); sleep(1); return tree; } int check_name(char s[])//判断输入的姓名是否合法 { int len = strlen(s); int i = 0; if(len >= 20) return FALSE; while(s[i] == ' ')i++; for(;i < len; i++) { if(s[i] >= 'A'&& s[i] <= 'Z')s[i] = s[i]+32; if(s[i] <'a'||s[i] > 'z')return FALSE; } return TRUE; } int check_sex(char s[])//检查输入的性别是否合法 { int len = strlen(s); int i = 0; if(len > 1) { while(s[i] == ' ') i++;//指令前面有空格为合法输入 int j = i; for(;j < len;j++) { if(s[j] == ' ') { return FALSE;//指令的中间存在空格为不合法 } } } if(s[i]!='M'&&s[i]!='F')//指令不是单个数字为不合法 { return FALSE; } return s[i]; } int Input_Key(struct BinNode *tree, char *Key)//提高容错率 { char Temp; int flag = -5; int i = 0; while(1) { Temp = getchar(); if(Temp == '\n') break; if(Temp <'A' || Temp > 'I') flag = 0; else Key[i++]=Temp; } if(flag != 0) { switch(Key[0]) { case 'A':flag = 1;break; case 'B':flag = 2;break; case 'C':flag = 3;break; case 'D':flag = 4;break; case 'E':flag = 5;break; case 'F':flag = 6;break; case 'G':flag = 7;break; case 'H':flag = 8;break; case 'I':flag = 9;break; } return flag;//返回操作指令 } else { printf("\t\t输入指令有误, 请返回上级\n"); sleep(1); Main_Menu(tree); } } struct BinNode *Switch_Order(int key, struct BinNode *tree) //切换界面 { int temp; struct BinNode *p; switch(key) { case 1 : { tree = Creat_Tree(tree); }break; case 2 : { temp = Sub_Menu1(); if(temp == 1)tree = Input_New_Person(tree); if(temp == 2) { tree = Add_New_Root(tree); tree = Bl_Tree(tree); } };break; case 3 : { char e[100]; char name[100]; char name1[100]; system("clear"); printf("\e[36m\e[1m%s\e[0m","\t\t|---*---欢迎进入查询系统 ------|\n"); printf("\e[34m\e[1m%s\e[0m","\t\t|---*---A.查询个人信息 ---*----|\n"); printf("\e[35m\e[1m%s\e[0m","\t\t|---*---B.查询直系亲属 ---*----|\n"); printf("\e[32m\e[1m%s\e[0m","\t\t|---*---C.查询嫡系祖先 ---*----|\n"); printf("\e[31m\e[1m%s\e[0m","\t\t|---*---D.查询两人关系 ---*----|\n"); printf("\e[33m\e[1m%s\e[0m","\t\t|---*---输入指令选择具体操作: "); scanf("%s", e); if(strcmp(e , "A") == 0)//查询个人信息 { printf("\t\t请输入要查询的姓名:"); scanf("%s", name); check_name(name); OutputMessage(tree, name); } else if(strcmp(e, "B") == 0)//查询直系亲属 { printf("\t\t请输入要查询的姓名:"); scanf("%s", name); check_name(name); Search_Di(tree,name); } else if(strcmp(e, "C") == 0)//查询嫡系亲属 { printf("\t\t请输入要查询的姓名:"); scanf("%s", name); check_name(name); Search_Dld(tree,name); } else if(strcmp(e, "D") == 0)//查询两人关系 { printf("\t\t请输入两人的姓名:"); scanf("%s %s", name, name1); check_name(name); check_name(name1); if(strcmp(name,name1) == 0) { printf("\t\t指令不合法!!!\n"); sleep(1); break; } Search_Relation(tree,name,name1); } else { printf("\t\t指令不合法!!!\n"); sleep(1); } }break; case 4 : { struct BinNode *p,*q; char name[100]; printf("\t\t请输入要删除的名称: "); scanf("%s",name); check_name(name); q = Search_Tree(tree,name); if(q == NULL) { printf("\t\t不存在\n"); break; } else { if(q -> parent) { p = q -> parent; p 
     -> data.Num--; 
    if(p 
     -> child != q) { p = p 
     -> child; 
    while(p 
     -> brother != q) { p = p 
     -> brother; } 
    if(q 
     -> brother) { p 
     -> brother = q 
     -> brother; q 
     -> brother = NULL; q 
     -> parent = NULL; } 
    else { p 
     -> brother = NULL; } } 
    else { 
    if(q 
     -> brother) { p 
     -> child = q 
     -> brother; q 
     -> parent = NULL; q 
     -> brother = NULL; } 
    else { p 
     -> child = NULL; p 
     -> parent = NULL; q 
     -> child = NULL; } } } q = Clear_Tree(q); printf( 
    "\t\t删除成功!\n"); } } 
    break; 
    case 
    5 : { Change_ifo(tree); } 
    break; 
    case 
    6 : { LeavelOrderTraverse_Tree((tree)); } 
    break; 
    case 
    7 : { tree = Read_File(tree); } 
    break; 
    case 
    8 : { Save_Data(tree); } 
    break; 
    case 
    9 : { flag = 
    0; Quit_Menu(tree); 
    return 
    0; } 
    break; 
    default : { printf( 
    "\t\t指令不合法!!!\n"); sleep( 
    1); } } 
    return tree; } 
    void Quit_Menu(struct BinNode *tree) { system( 
    "clear"); Clear_Tree(tree); 
    //释放tree sleep( 
    1); printf( 
    "\e[32m\e[1m%s\e[0m", 
    "\t\t|------即将退出系统请稍候 -------|\n"); sleep( 
    1); printf( 
    "\e[34m\e[1m%s\e[0m", 
    "\t\t|------已退出系统 -------|\n"); sleep( 
    1); } int Main_Menu(struct BinNode *tree) { char Order[ 
    100]; printf( 
    "\e[30m\e[1m%s\e[0m", 
    "\n\t\t--------------您已来到家谱树操作系统--------------\n"); printf( 
    "\e[30m\e[1m%s\e[0m", 
    "\t\t-----------------请选择下面的操作-----------------\n"); printf( 
    "\t\t —————————————————————————————————————————————————\n"); printf( 
    "\e[32m\e[1m%s\e[0m", 
    "\t\t|---*---A: 新 建 家 谱 ---*----|\n"); printf( 
    "\e[32m\e[1m%s\e[0m", 
    "\t\t|---*---B: 成 员 添 加 ---*----|\n"); printf( 
    "\e[35m\e[1m%s\e[0m", 
    "\t\t|---*---C: 查询成员信息 ---*---|\n"); printf( 
    "\e[36m\e[1m%s\e[0m", 
    "\t\t|---*---D: 删除家谱成员 ---*---|\n"); printf( 
    "\e[36m\e[1m%s\e[0m", 
    "\t\t|---*---E: 成员信息修改 ---*---|\n"); printf( 
    "\e[31m\e[1m%s\e[0m", 
    "\t\t|---*---F: 家谱树的显示 ---*---|\n"); printf( 
    "\e[34m\e[1m%s\e[0m", 
    "\t\t|------G: 从文件中读取信息重建家谱树 *---|\n"); printf( 
    "\e[34m\e[1m%s\e[0m", 
    "\t\t|---*---H: 保存家谱到文件 ---*---|\n"); printf( 
    "\e[33m\e[1m%s\e[0m", 
    "\t\t|---*---I: 退 出 ---*----|\n"); printf( 
    "\t\t —————————————————————————————————————————————————\n\n"); printf( 
    "\e[30m\e[1m%s\e[0m", 
    "\t\t请输入你的指令(A -- I):"); scanf( 
    "%s",Order); int key = Input_Key(tree, Order); tree = Switch_Order(key, tree); 
    if(flag) Main_Menu(tree); 
    return 
    0; } 
    #endif 
    
  

FamilyTree.h

#ifndef FAMILYTREE_H #define FAMILYTREE_H #define TRUE 1 #define FALSE 0 #define ERROR 0 #define OK 1 #define length 50 typedef struct ifo { char Name[length]; //记录这个人的姓名 char Sex[length]; //记录这个人的性别 char Father[length]; //记录这个人的父亲 char Born[length]; //出生地随机 char Job[length]; //职业随机 char College[length]; //大学随机 int Degress; //记录这个人的辈份 int Num; // 记录这个人拥有几个孩子 }ifo; struct BinNode { ifo data; struct BinNode *child; //定义孩子指针 struct BinNode *brother; //定义兄弟指针 struct BinNode *parent; //定义父亲指针 }BinNode; int n; int pp; ifo sw[1050], *pw, *pr, sr[1050]; int flag; int Main_Menu(struct BinNode *tree); //主要的操作界面 int Sub_Menu1(); //添加成员界面 void Sub_Menu2(); //修改界面 struct BinNode *Switch_Order(int key, struct BinNode *tree);//切换界面 void Init_Tree(struct BinNode *tree);//树的:初始化 struct BinNode *Add_New_Root(struct BinNode *tree);//添加新的祖宗 struct BinNode *Input_New_Person(struct BinNode *tree);//添加不是祖宗的成员 struct BinNode *Bl_Tree(struct BinNode *tree);//遍历函数将辈数+1 struct BinNode *Clear_Tree(struct BinNode *tree);//清空树 int Destory_Tree(struct BinNode *tree); //销毁树 int Empty_Tree(struct BinNode *tree); //树的判空 struct BinNode *Search_Tree(struct BinNode *tree, char *name);//寻找名字为name的成员———— 返回地址或者NULL void Change_ifo(struct BinNode *tree); //修改信息 Search void OutPutMessage(struct BinNode *tree,char name[]); //查询时可 输出 个人信息 Search void OutPutAllMessage(struct BinNode *tree); //输出 家谱全部的信息 void LeavelOrderTraverse_Tree(struct BinNode *tree); void Search_Di(struct BinNode *tree, char *name);//查找直系 void Search_Dld(struct BinNode *tree, char *name);//查找嫡系 void Search_Relation(struct BinNode *tree, char *name1, char *name2);//查询两人的关系 void Save_Data(struct BinNode *tree);//将家谱树保存为文件 void Print_parent(struct BinNode *person);/*输出父亲*/ void Print_child(struct BinNode *person);/*输出子女*/ int check_name(char *name);//判断输入姓名是否合法 int check_sex(char *sex);//判断输入性别是否合法 int Input_Key(struct BinNode *tree, char *Key);//输入程序指令 void Quit_Menu(struct BinNode *tree);//结束运行 struct BinNode *Insert(struct BinNode *root, ifo N);//由个人信息插出入家族树中 void Tranverse(struct BinNode *tree); struct BinNode *Read_File(struct BinNode *root); struct BinNode *Srand(struct BinNode *tree); //随机生成 出生地 职业 毕业大学 void Save_Data(struct BinNode *tree); #endif

main.c

/*/ /* 短训二班四组 */ /*/ #include 
  
    #include 
   
     #include 
    
      #include 
     "FamilyTree.h" 
     int main() { 
     while( 
     1) { system( 
     "clear"); struct BinNode *tree = NULL; n = 
     0; flag = 
     1; Main_Menu(tree); 
     return 
     0; } } 
     
    
  

makefile

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

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

(0)
上一篇 2026年3月19日 下午3:49
下一篇 2026年3月19日 下午3:49


相关推荐

  • 常见逻辑漏洞[通俗易懂]

    常见逻辑漏洞[通俗易懂] 支付逻辑漏洞检测方法与案列支付漏洞一般分为三类,支付过程可直接修改数据包中的支付金额开发人员为了方便,导致支付的关键数据,能直接截包查看而重要的金额数据,在后端没有做校验,传递过程中也没有做签名,导致可以随意篡改金额.  没有对购买数量进行负数限制产生的原因是开发人员没有对购买的数量参数进行严格的限制,传输过程没有做签名,导致可随意修改,经典的修改方式就是…

    2022年5月4日
    45
  • redis集群主从复制原理_主从关系紫音

    redis集群主从复制原理_主从关系紫音Redis主从复制主从复制简介主从复制的概念主从复制的作用主从复制工作流程阶段一:建立连接阶段主从连接(slave连接master)第一种方式第二种方式第三种方式授权访问阶段二:数据同步阶段工作流程数据同步阶段master说明数据同步阶段slave说明阶段三:命令传播阶段命令传播阶段的部分复制服务器的运行id复制缓冲区复制缓冲区内部工作原理复制缓冲区主从服务器复制偏移量(offset)数据同步+命令传播阶段工作流程心跳机制心跳阶段注意事项主从复制常见问题引发频繁的全量复制1引发频繁的全量复制2频繁的网络中

    2022年8月13日
    9
  • istringstream ostringstream

    istringstream ostringstream转自:http://dev.csdn.net/article/77/77033.shtmhttp://www.chinaitpower.com/A/2002-04-21/20488.html   C++引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件。 istringstrea

    2022年6月26日
    35
  • 使用VMware安装centos7并配置网络

    使用VMware安装centos7并配置网络准备工作:1.VM虚拟机(本文使用VMware14.1.2)2.Centos7安装包(https://www.centos.org/download/)centos官网提供多个版本下载,一般使用标准的DVD版安装版,大约4.2G。也可以使用mini版,后续自己安装第三方软件。各版本区别:https://wiki.centos.org/Manuals/ReleaseNotes/Cent…

    2022年6月6日
    34
  • Python ord函数

    Python ord函数2019 9 3Pythonord 函数功能描述 以一个字符 长度为 1 的字符串 作为参数 返回对应的 ASCll 数值

    2026年3月19日
    2
  • idea2022.01.13激活码获取-激活码分享2022.03.10

    (idea2022.01.13激活码获取)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1M2OME2TZY-eyJsa…

    2022年4月2日
    151

发表回复

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

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