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

源代码链接: 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

  • 4
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值