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

📄 operationfamilytree.h

📁 家谱管理系统
💻 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 + -