源代码如下
(1)main.cpp
#include<stdio.h> #include"family.h" #include<stdlib.h> #include<string.h> #include<iostream> using namespace std; #define max 100 int main() { int choose; char X; Fam *b=NULL; char *str=(char*)malloc(max*sizeof(char)); str[0]='\0'; cout<<"------------------------------"<<endl; cout<<"-----0.退出 -----"<<endl; cout<<"-----1.记录输入: -----\t"<<endl; cout<<"-----2.记录输出: -----\t"<<endl; cout<<"-----3.家谱记录存盘: -----\t"<<endl; cout<<"-----4.用括号法输出家谱: -----\t"<<endl; cout<<"-----5.查找某人的儿子: -----\t"<<endl; cout<<"-----6.查找某人的祖先: -----\t"<<endl; cout<<"-----7.清除全部文件记录: -----\t"<<endl; cout<<"------------------------------"<<endl; cout<<"请按键选择进行相应的操作:"<<endl; cout<<"choose="; cin>>choose; while(choose) {switch(choose) { case 1: InputFam(&b,str);break; case 2: OutputFam(&b,str);break; case 3: Store(b,str); printf("文件已经保存!");break; case 4: DispFam(b); break; case 5: printf("请输入需要查找儿子的结点:"); cin>>X; SearchXSon(b,X); break; case 6: printf("请输入需要查找祖先的结点:\n"); cin>>X; Fam *p; p=SearchX(b,X); if(p!=NULL) SearchXAncestor(b,X); else printf("该结点不存在!"); break; case 7:Distory(&b,str); printf("文件记录已经清除!"); break; default:cout<<endl<<"Invalid input,input again."; } cout<<endl<<"please choose again:"<<endl; cout<<"the choose ="; cin>>choose; } return 0; }
(2)family.cpp
#include "family.h" #include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<string.h> void CreateFam(Fam **b,char *str) //创建树 { Fam *S[MaxSize],*p=NULL; int top=-1,tag,j=0,d=0; char ch;1 switch(ch) { case '(': d++; top++; S[top]=p; tag=1;break; case ')': top--;break; case ',': d--; tag=2;break; default: p=(Fam *)malloc(sizeof(Fam)); p->degree=d; p->name=ch; p->lchild=NULL; p->rchild=NULL; if((*b)==NULL)(*b)=p; else { switch(tag) { case 1: S[top]->lchild=p;break; case 2: S[top]->rchild=p;break; } } } ch=str[++j]; } } void DestroyFam(Fam *&b) //销毁家谱 { if (b!=NULL) { DestroyFam(b->lchild); DestroyFam(b->rchild); free(b); } } void InputFam(Fam **b,char *str)//记录输入 { if(str[0]=='\0') gets(str); do { printf("请以括号法输入需要输入的记录:\n"); gets(str); if(str[0]=='\0') printf("输入的记录为空,请再次输入:\n"); }while(str[0]=='\0'); CreateFam(b,str); printf("记录创建成功!"); } void Distory(Fam **b,char *str)//清除全部的记录 { (*b)=NULL; FILE *fp; fp=fopen("family.txt","w"); if(fp==NULL) { printf("打开文件失败!"); exit(1); } str=""; fclose(fp); } void OutputFam(Fam **b,char *str)//从文件中读出记录 { FILE *fp; if((fp=fopen("family.txt","r"))==NULL) { printf("不存在记录文件,要建立吗?\n建立请输入Y,否则按其他键:"); if(getchar()=='Y') { fp=fopen("family.txt","w+"); printf("记录文件“family.txt”已建立\n"); } else exit(1); } else { if(!feof(fp)) fscanf(fp,"%s",str); fclose(fp); CreateFam(b,str); printf("文件中记录已输出\n"); } } void Store(Fam *b,char *str)//储存全部的结点记录 { Fam *p; p=b; FILE *fp; fp=fopen("family.txt","w+"); if(fp==NULL) { printf("文件打开失败!"); return; } else { if(p!=NULL) { fprintf(fp,"%s",str); fclose(fp); } } } void DispFam(Fam *b)//用括号法输出家谱记录 { if(b!=NULL) {printf("%c",b->name); if(b->lchild!=NULL||b->rchild!=NULL) { printf("("); DispFam(b->lchild); if(b->rchild!=NULL) {printf(","); DispFam(b->rchild); } printf(")"); } } } Fam* SearchX(Fam *b,char X)//查找结点X {Fam *p; if(b==NULL) return NULL; else if(b->name==X) return b; else { p=SearchX(b->lchild,X); if(p!=NULL) return p; else { return SearchX(b->rchild,X); } } } void SearchXSon(Fam *b,char X)//查找结点X的所有儿子 { Fam *p,*q; p=SearchX(b,X); //找到节点X if(p!=NULL) { p=p->lchild; if(p==NULL) //X没有孩子 printf("节点%c没有儿子!",X); else { printf("节点%c的所有儿子为:",X); if(p!=NULL) printf("%c ",p->name); q=p->rchild; while(q) { printf("%c ",q->name); q=q->rchild; } } } else printf("该结点不存在!"); } void TraverseBT(Fam *b,int d)//遍历家谱 { if(b!=NULL) if(b->degree<d) { printf("%c ",b->name); if(b->lchild!=NULL) TraverseBT(b->lchild,d); if(b->rchild!=NULL) TraverseBT(b->rchild,d); } } void SearchXAncestor(Fam *b,char X)//查找结点X的所有祖先 { if(b==NULL) { printf("这是一棵空树!"); return ; } Fam *p=SearchX(b,X); if(p->degree==0) { printf("X为根节点或其兄弟,没有祖先!"); return; } printf("%c结点的祖先有:",X); TraverseBT(b,p->degree); } //a(b(c(,d),e),f)
(3)family.h
#ifndef FAMILY_H_INCLUDED #define FAMILY_H_INCLUDED #include "family.h" #include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<string.h> #include<iostream> #define MaxSize 100 typedef struct Fam { int degree; //人员年代 char name;//人员标志 struct Fam *lchild;//name的孩子 struct Fam *rchild;//name的兄弟 }Fam; void CreateFam(Fam **b,char *str);//创建家谱记录 void DestroyFam(Fam *&b); //销毁家谱 void InputFam(Fam **b,char *str);//记录输入 void Distory(Fam **b,char *str);//清除全部的记录 void OutputFam(Fam **b,char *str);//从文件中读出记录 void Store(Fam *b,char *str);//储存全部的结点记录 void DispFam(Fam *b);//用括号法输出家谱记录 Fam* SearchX(Fam *b,char X);//查找结点X void TraverseBT(Fam *b,int d);//遍历家谱 void SearchXAncestor(Fam *b,char X);//查找结点X的所有祖先 void SearchXSon(Fam *b,char X);//查找结点X的所有儿子 #endif // FAMILY_H_INCLUDED