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
