📄 operationfamilytree.h
字号:
// OperationFamilytree.h: interface for the COperationFamilytree class.
//
//////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
////// 家谱操作类头文件
////////////////////////////////////////////////////////////////////
#if !defined(AFX_OPERATIONPEDIGREE_H__E4F09334_6451_4AF0_8C1F_3EAB707AE2EF__INCLUDED_)
#define AFX_OPERATIONPEDIGREE_H__E4F09334_6451_4AF0_8C1F_3EAB707AE2EF__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define MAX_CHARNUM 128
#define PEDIGREE_EMPTY -5
#define NOT_ENOUGH_MEMORY -4
#define READ_FILE_ERROR -3
#define WRITE_FILE_ERROR -2
#define FILE_DATA_ERROR -1
#define FILE_DATA_NOT_PRACTICAL 0
#define OK 1
struct Date{ //日期存储结构
int year; //年
int month; //月
int day; //日
};
struct Info{ //一个人的有关信息存储结构
char name[MAX_CHARNUM]; //姓名
Date birthday; //出生日期
int marry; //婚否
char addr[MAX_CHARNUM]; //住址
int live; //健在否
Date deathday; //死亡日期
};
typedef struct PersonNode{ //一个人的信息和与其他人关系的存储结构
Info info; //自己的信息
PersonNode* parent; //指向父亲的指针
PersonNode* child; //指向孩子的指针
PersonNode* sibling; //指向兄弟的指针
}*Person;
struct QuickSortNode{ //为以出生日期大小快速排序建立的存储结构
Date birthday; //出生日期
Person oneself; //指向自己的指针
};
class COperationFamilytree
{
public:
COperationFamilytree();
virtual ~COperationFamilytree();
void NewFamilytree(); //新建一空家谱
int CreateFamilytree(CString filename); //从输入文件filename中读取数据建立家谱
void DestroyFamilytree(); //删除家谱
int SaveFamilytree(CString filename); //保存家谱
void PreOrderTraverse(FILE* fp,Person& T //先序遍历(为保存家谱而做)
,void (*Visit)(FILE* fp,Person& T));
void PostOrderTraverse(Person& T //后序遍历(为删除家谱而做)
,void (*Visit)(Person& T));
void Find(Person& T,Person& Tname,char* name);//从根结点出发,搜索name所在结点,如找到,存于Tname中,找不到,Tname为0
//使用前确保Tname指针为0
void Find(Person&T,Person*& Tname,int month,int day);//从根结点出发,搜索家谱中birthday.month等于month,birthday.day等于day的所有结点,
//如找到,存于以Tname为首地址的指针数组中,找不到,Tname为0使用前确保Tname指针为0
void Add(Person parent,Person addNode); //把addnode加为结点parent的孩子
void Delete(Person& rootNode); //删除以rootNode为根结点的所有结点
void Modify(Person& pNode,Person newValue); //修改pNode结点为新值newValue
void SortByBirthday(QuickSortNode* order); //对家谱以出生日期排序,并把排序结果放在数组order中
void GetPersonNums(Person&T,int& personNums); //得到家谱中总人数
int InGenerationPos(Person pNode); //返回pNode在家谱中是第几代
int InSiblingPos(Person pNode); //返回pNode在其兄弟中的排行
int ChildNums(Person pNode); //返回pNode孩子数
int CompareDate(Date date1,Date date2); //比较两日期的大小
bool IsDateValid(Date date); //检验日期是否合法
Person& GetRoot(); //得到根结点
friend void SaveNode(FILE* fp,Person& pNode); //保存结点pNode到文件fp中
friend void DestroyNode(Person& pNode); //删除结点
private:
Person T; //二叉树的根结点
int ReadNode(FILE* fp,Person&T,char* parentname); //从文件fp中读取信息到结点T中,读取此结点的父亲姓名到parentnaem中(供CreateFamilytree函数调用)
void InsertSibling(Person& firstSibling,Person insertSibling); //把insertSibling插入到以firstSibling为首的兄弟中(供CreateFamilytree函数调用)
void CopyInfoFromBiTreeToArray(Person&T,QuickSortNode*&order); //把家谱中以pNode结点为根结点的出生日期拷贝到快速排序结构数组order中(供SortByBirthday函数调用)
void QuickSort(QuickSortNode* order,int low,int high); //对order[low...high]中的记录进行快速排序(供SortByBirthday函数调用)
int Partition(QuickSortNode* order,int low,int high); //对order[low..high]中的记录进行一次排序(供QuickSort函数调用)
bool IsLeapYear(int year); //判断是否闰年(供IsDateValid调用,以检查日期是否合法)
};
#endif // !defined(AFX_OPERATIONPEDIGREE_H__E4F09334_6451_4AF0_8C1F_3EAB707AE2EF__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -