⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 genealogy.h

📁 数据结构课程设计——家谱管理系统设计与实现
💻 H
字号:
#define max_char_num 100
#define max_array_num 30

#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <fstream.h>
#include <string.h>


struct Date
{
	int year;     //年
	int month;    //月
	int day;      //日
};

struct Info
{
	char name[max_char_num];//姓名
	char birthplace[max_char_num];//出生地点
	Date birthdate;//结构date定义的出生日期
	Date deathdate;//结构date定义的死亡日期
	char sex[max_char_num];//性别
	int height;//高度
	char occupation[max_char_num];//工作职务
	char education[max_char_num];//受教育程度
	char top_headship[max_char_num];//最高职位
	char parentname[max_char_num];//父亲姓名,用于添加节点时用
	int Depth;//二叉树深度,输出二叉树时用
};
	
typedef struct CSNode
{
	Info data;       //个人信息类型结构
	CSNode *firstchild,*nextsibling,*parent;   //csnode的第一个孩子节点,下一个兄弟节点,双亲借点
}*person;

class GEnealogy
{

public:
	GEnealogy();//构造函数

	~GEnealogy();//析构函数

	void NewGEnealogy();//建立一个空的家谱树

    void CreateGEnealogy();//从磁盘读取文件建立家谱树

	void DestroyGEnealogy();//删除家谱树

	void SaveGEnealogy();  //保存家谱树

	void PreOrderTraverse(fstream &f,person& T ,void (*Visit)(fstream &f,person &T));//先序遍历家谱树,为保存和显示家谱树作准备

	void PostOrderTraverse(person& T,void (*Visit)(person& T));//后序遍历家谱树,为删除家谱树作准备

	void ReadNode(fstream &f,person &pnode);   //从二进制文件读取结点信息以供CreateGenealogy()建立家谱树

    void FindByRelationship(person pnode);     //按照亲属关系查找某人的父母,孩子,兄弟,若查找成功则显示出来

	void Modify(person& pNode,person newValue);//修改某个人的信息

	int CompareDate(Date date1, Date date2);//	//比较两日期大小,若date1比date2早,返回-1;date1比date2晚,返回1;date1与date2相等,返回0

	void FindByName(person& T,person& Tname,char* name);//查找姓名=name的人,若在家谱中,用Tname返回,否则Tname为空,Tname初始为空

	void FindByBirthplace(person &T,person& Tname,char* name);//查找出生地=name的人,若在家谱中,则显示出来,否则显示出错信息,Tname初始为空

    void FindByBirthday(person &T,person& Tname,Date date);//查找出生日期=date的人,若在家谱中,则显示出来,否则显示出错信息,Tname初始为空

	void FindByDeathday(person& T,person& Tname,Date date);//查找死亡日期=date的人,若在家谱中,则显示出来,否则显示出错信息,Tname初始为空

	void FindBySex(person& T,person& Tname,char* name);//查找性别=name的人,若在家谱中,则显示出来,否则显示出错信息,Tname初始为空

	void FindByHeight(person &T,person &Tname,int height);//查找身高=height的人,若在家谱中,则显示出来,否则显示出错信息,Tname初始为空

	void FindByEducation(person& T,person& Tname,char* name);//查找受教育程度=name的人,若在家谱中,则显示出来,否则显示出错信息,Tname初始为空

	void FindByOccupation(person& T,person& Tname,char* name);//查找职位=name的人,若在家谱中,则显示出来,否则显示出错信息,Tname初始为空
	
	void FindByTopHeadship(person& T,person& Tname,char* name);//查找最高职位=name的人,若在家谱中,则显示出来,否则显示出错信息,Tname初始为空

	void Inquire();//查询函数,调用上述各个Find函数按成员基本信息以查询家谱

	void Delete ( person &rootnode);//删除rootnode结点以及他的所有孩子结点

	void Display(person info);//显示info的各样信息

	void Add(person parent, person addNode);//将addnode添加到parent作为parent的孩子结点

	void DisplayTree(person &pnode);//按照depth值在屏幕上输出整个家谱,其中只显示姓名

	int IsDateValid(Date date);//检查日期是否符合要求

    bool IsLeapYear(int year);//判断某一年是否为闰年

    void AverageLife(person &T,int &personNums,int &age);//统计整个家谱的人的平均寿命

	void AverageHeight(person &T,int &personNums, int &height);//统计整个家谱的人的平均身高

	void MaleFemale(person &T,int &maleNum,int &femaleNum);//统计整个家谱的人的男女比例

	int FamilyNumber(person pnode);//统计以某个人为parent的家庭的人口

	int Age(person pNode);//返回某个人的年龄

	int Height(person pNode);//返回某个人的身高
    
	void TotalFamily(person &T,int &total);//统计家谱中家庭人数

	void TotalFamilyNumber(person &T,int &totalfamily);//统计家谱中家庭人口总数

	void Statistic();//统计函数,调用上述的函数完成统计功能
	
	person& GetRoot();//返回家谱的根结点
    
	void InputData(person &pnode);//输入pnode的个人信息

	void InputDate(Date &day);//输入日期
	
	void InsertSibling(person& Firstchild,person insertSibling);//搜索insertsibling的位置,插入到firstchild的nextsibling结点中去

	void AddOperation();//添加孩子函数调用add()来添加。

private:
	
	person T;//家谱的根结点

};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -