二叉树实现的简单家谱管理系统

源代码链接: http://www.oschina.net/code/snippet_2348884_47615

一、题目

     用二叉树的数据结构实现一个简易实用的族谱。主要有创建,插入,查询,删除,修改信息,计算代数,打印,写入,读取重要人物信息的功能。

二、数据结构与算法

    数据结构:

利用二叉树的链式存储结构,以及结构体,类,栈,队列完成。

族谱表示二叉树结构如 图1;

110511_WqcR_2348884.jpg


族谱二叉树结构中结点所包含的信息如 表 1 所示

表 1 族谱二叉树结点信息

 

110511_qfv7_2348884.jpg

结构体分为:

1 结点结构体(个人姓名,兄弟结点指针,儿女结点指针,父亲结点指针,妻子(们)信息指针,个人信息结构体);结构体分为:

2 个人信息结构体(父母姓名,性别,状态(去世 or 健在),处于家谱中第几代,出生日期,死亡日期,选择性重要信息指针);

 类分为

1 日期类 (年,月,日,判断大小, 计算享年,修改,打印格式) 

     需要用到栈和队列:

         1 实现遍历功能;

         2 实现查找功能        

算法:

    1、二叉树的层次遍历,利用队列实现。

2、凹入式目录打印族谱,利用递归,非递归两种实现。

3、查找基于遍历功能。

4、删除,修改基于查找功能。

5、文件读写


重要头文件(包含部分重要结构体,全部函数定义)

#include<iostream>
#include<string>
#include<queue>
#include<vector>
#include <algorithm>
#include<time.h>
#include<fstream>
#include "Date.h"
using namespace std;
 
//妻子信息
struct Wife_Information {
   string name;
   bool divorce;
   Wife_Information() {
     name = "";
      divorce = false;
   };
   Wife_Information(string name_) {
       name = name_;
      divorce = false;
   };
};
 
//个人信息
struct Member_Information{
   string Sex; //性别
   bool IsLife;
   vector<Wife_Information> wifves;
   string father_name;
   string mother_name;
   int generation;
   Date birth;
   Date death;
    string VIP_Information; // 如果这个人是个名人或者是对家族及其重要的人,新增信息缓冲区,存入该人生平事迹 //
 
   Member_Information() {
       Sex = "undefine";
       VIP_Information = "";
       generation = 0;
       IsLife = true;
   };
   //先列基本信息,更多的信息可以以后再加进去
};
 
struct Tree{
   string name;
   Tree *left;    //儿子或女儿
   Tree *right;   //兄弟
   Tree *father; //父亲
   Tree *brother;
   vector<Wife_Information> wifves;  //妻子(们)的信息
   Member_Information  self;   // 本人信息 
    
   Tree() {
       name = "";
       left = right = father = brother = 0;
       self.generation = 0;
   };
 
    Tree(string name_,Member_Information s, Tree* left_=0, Tree* right_=0, Tree* father_=0, Tree* brother_=0) {
       name = name_;
      left = left_;
      right = right_;
      father = father_;
      brother = brother_;
      self = s;
   }; 
};
 
// fundamental operation //
void Create_Tree(Tree* &tr, string name);
Tree* Search(Tree *tr, string name);
int Count_Generation_All(Tree* tr);
 
// Insert //
string Insert_Wife(Tree* &tr, string name, string husband);
string Insert_Children(Tree* &tr, string name, string father);
string Insert_Brother_Or_Sister(Tree* &tr, string name,string brother_sister);
 
// add brief member informations or change informations //
void Change_Information(Tree* tr);
void Change_Name(Tree* &tr, string name, string new_name);
void Change_Wives_Information(Tree* &tr, string name, string wife);
void Change_Sex(Tree* &tr, string name, string sex );
void Change_IsLife(Tree* &tr, string name, bool islife);
void Change_Fathername(Tree* &tr, string name, string father_name);
void Change_Mothername(Tree* &tr, string name, string mother_name);
void Change_Birth(Tree* &tr, string name, string date);
void Change_Festa(Tree* &tr, string name, string date);
void Change_VIP(Tree* &tr, string name);
 
// Delete //
string Divorce(Tree* &tr, string name, string husband);
string Delete_Member(Tree* &tr, string name);
void Delete_SubTree(Tree* &tr);
 
// User Search  (if user find someone and this person is VIP ,ask if there is need to print the VIP's information) //
bool Search_Oneself(Tree* tr, string name);
bool Search_One_Parents(Tree* tr, string name);
bool Search_One_Children(Tree* tr, string name);
bool Search_One_Wife(Tree* tr, string name);
bool Search_One_Brother_And_Sister(Tree* tr, string name);
int Count_Ones_Age(Tree* tr, string name);
 
// Print //
void Print_Information(Tree* tr);
void Print_VIP_Information(Tree* tr);
void Print_All(Tree* tr);
void Print_MainMenu();
void Print_Add_Information_Menu();



一些测试:

110512_5Tjv_2348884.png

110512_pO42_2348884.png

110512_s9o1_2348884.png

110512_Tn1P_2348884.png

110512_vOgy_2348884.png


转载于:https://my.oschina.net/u/2348884/blog/406740

家谱管理系统,主要用来管理家族成员的基本信息 1、确定整个程序的功能模块。实现程序的主界面,要对主界面的功能选择输入进行容错处理。 2、实现单个结点信息的录入。 3、对录入日期信息进行合法性检验。 4、采用改变字体颜色的方式突出显示主界面的功能项。 5、计算从出生日期到死亡日期的实际天数 6、若家谱树为空,则新建家谱树。实现成员节点的添加。基本功能中可以 强制要求所有成员不同名,即不考虑同名情况(符合小家族的实际情况)。 7、添加成员节点时,可以选择将新添加的节点作为整个家谱的上一代祖先, 或者将新添加的节点作为某个现有成员的孩子。 8、作为某个现有成员的孩子,根据给出的父节点的姓名将该结点添加到相 应位置,注意,针对某一父节点,添加第一个孩子和其它孩子的区别。 9、要求在孩子兄弟二叉树中按各个孩子的年龄进行排序。 10、将家谱树保存到二进制文件。注意,不能保存空白节点。 11、从文件读入家谱信息,重建孩子兄弟二叉树形式的家谱。 12.从文件中读出所有节点信息到一个数组中,然后按一年中生日的先后进 行快速排序。 13、按姓名查询家谱成员并显示该成员的各项信息。 14、给出某一成员的姓名,删除该成员和该成员的所有子孙。 15、成员信息的修改。信息修改时要给出选择界面让用户选择需要修改的信 息项。基本功能中可以限定不容许修改父亲姓名和本人姓名。对日期信 息进行修改时要进行检验。 16、实现层次递进的方式显示整个家谱,显示结果应该体现家谱树的结构。 17、按各种关键字进行查询,要求给出关键字选择界面,并显示符合查询条 件的节点信息。 18、信息统计基本要求包括:平均身高,平均寿命,男女成员各多少,平均 家庭人口数目(假定每个成员构成一个家庭,该家庭的家庭成员是指成 员本人和他的孩子,即家庭人口数=孩子数+1)。要给出统计项的选择界 面. 19、查询某一成员的所有直系亲属。 20、给出某一成员的所有嫡系祖先。 21、确定两人关系。若两人辈分不等,则应指出甲是乙的多少代长辈(晚辈), 甲是否是乙的直系长辈(晚辈),若辈分相同,则应指出是亲兄弟还是多 少代的堂兄弟。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值