亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? operationfamilytree.cpp

?? 數(shù)據(jù)結(jié)構(gòu)——家譜的實(shí)現(xiàn) 本人的課程設(shè)計(jì) MFC
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// OperationFamilytree.cpp: implementation of the COperationFamilytree class.
//
//////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////
/////					家譜操作類實(shí)現(xiàn)文件
/////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Familytree.h"
#include "OperationFamilytree.h"
#include "FileOpenAndSaveDlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

COperationFamilytree::COperationFamilytree()
{
	//開始為空家譜
	T=0;
}

COperationFamilytree::~COperationFamilytree()
{
	//釋放資源
	DestroyFamilytree();
}

void COperationFamilytree::NewFamilytree()
{
	//本函數(shù)新建一空家譜
	DestroyFamilytree();				//刪除原有家譜
	T=0;
}

int COperationFamilytree::CreateFamilytree(CString filename)
{
	//本函數(shù)建立一新家譜
	DestroyFamilytree();							//建立一新家譜之前,清空原有家譜
	FILE* fp;
	if((fp=fopen(filename,"r"))==0)				//打開文件filename
		return READ_FILE_ERROR;
	T=new PersonNode;							//定義根結(jié)點(diǎn)
	if(!T)
		return NOT_ENOUGH_MEMORY;
	T->child=0;
	T->sibling=0;
	T->parent=0;
	Person parentT, temp;						//定義兩個臨時結(jié)點(diǎn)
	char parentname[MAX_CHARNUM];				//定義一個臨時字符串?dāng)?shù)組

	//讀取根結(jié)點(diǎn)值,(姓名,出生日期(年,月,日),婚否,地址,健在否,(如過世,還有死亡日期))				
	int result;
	result=ReadNode(fp,T,parentname);
	if(result==FILE_DATA_NOT_PRACTICAL){
		delete T;							//若不合法,刪除申請的堆空間
		T=0;
		return result;	
	}
	
	if(strcmp(T->info.name,parentname)==0){		//根結(jié)點(diǎn)名字與其父親名字相同,說明為空樹
		delete T;
		T=0;
		return PEDIGREE_EMPTY;
	}
	temp=new PersonNode;						//申請一結(jié)點(diǎn)
	if(!temp){									//申請失敗
		DestroyFamilytree();						//釋放申請空間
		return NOT_ENOUGH_MEMORY;
	}

	result=ReadNode(fp,temp,parentname);
	
	while(strcmp(temp->info.name,parentname)&&strcmp(temp->info.name,"end")){	//讀取信息結(jié)束的條件是兩個人的名字同為end

		if(result==FILE_DATA_NOT_PRACTICAL){	//若數(shù)據(jù)不合法,釋放已申請空間,然后返回
			delete temp;
			DestroyFamilytree();
			return result;
		}
		parentT=0; 
		Find(T,parentT,parentname);				//找到parentname所在結(jié)點(diǎn)parentT
		if(parentT){							//如果parentT存在,說明parentname在家譜中
												//并且parentname為temp的父親
			int cmp;
			cmp=CompareDate(temp->info.birthday,parentT->info.birthday);
			if(cmp<0){							//若孩子出生日期比父親大,則不對
				delete temp;
				DestroyFamilytree();
				return	FILE_DATA_NOT_PRACTICAL;
			}

			temp->child=temp->sibling=0;
			temp->parent=parentT;				//temp的父指針指向parentT;
	
			if(parentT->child){					//parentname已經(jīng)有孩子
				InsertSibling(parentT->child,temp);
			}//if
			else								//parentname無孩子,則temp應(yīng)為
				parentT->child=temp;			//parentname的第一個孩子
		}//if
		else{									//parentT不存在,說明家譜中不存在parentname此人
			DestroyFamilytree();					//返回出錯信息
			return FILE_DATA_ERROR;
		}
		temp=new PersonNode;						//申請一結(jié)點(diǎn)
		if(!temp){									//申請失敗
			DestroyFamilytree();						//釋放申請空間
			return NOT_ENOUGH_MEMORY;
		}
		result=ReadNode(fp,temp,parentname);			//繼續(xù)讀取數(shù)據(jù)
	}//while
	if(temp)
		delete temp;
	fclose(fp);
	return OK;
}

void COperationFamilytree::Find(Person& T,Person& Tname,char* name)
{
	//本函數(shù)以T為根結(jié)點(diǎn)開始,搜索結(jié)點(diǎn)信息中名字等于name的結(jié)點(diǎn)
	if(T){									//如果T存在
		if(strcmp(T->info.name,name)==0)	//T結(jié)點(diǎn)姓名和name相同,把T結(jié)點(diǎn)指針傳給Tname
			Tname=T;
		else{			
			Find(T->sibling,Tname,name);	//對T的兄弟遞歸搜索
			Find(T->child,Tname,name);		//對T的孩子遞歸搜索
		}
	}
}

void COperationFamilytree::Find(Person &T, Person*& Tname,int month, int day)
{
	//本函數(shù)以T為根結(jié)點(diǎn)開始,搜索結(jié)點(diǎn)信息中生日等于month,day的結(jié)點(diǎn),
	//并把所有符合條件的結(jié)點(diǎn)指針值存入以Tname為起始地址的地址數(shù)組中
if(T){									//如果T存在
		if(T->info.birthday.month==month&&T->info.birthday.day==day){	
			//T結(jié)點(diǎn)生日與所給相同,把T結(jié)點(diǎn)指針傳給Tname,同時Tname指針前進(jìn)
			Person temp;
			temp=new PersonNode;
			temp=T;
			if(temp->info.birthday.month==month&&temp->info.birthday.day==day)
			{
			*Tname=temp;	
			Tname++;
			}
		temp=NULL;
		}			
		Find(T->child,Tname,month,day);	//對T的孩子遞歸搜索
		Find(T->sibling,Tname,month,day);	//對T的兄弟遞歸搜索
	}
}

void COperationFamilytree::PostOrderTraverse(Person &T, void (__cdecl *Visit)(Person &))
{
	//本函數(shù)對以T為根結(jié)點(diǎn)的所有結(jié)點(diǎn)后序遍歷訪問Visit函數(shù)
	if(T){
		PostOrderTraverse(T->child,Visit);
		PostOrderTraverse(T->sibling,Visit);
		(*Visit)(T);
	}
}

void DestroyNode(Person &pNode)
{
	//本函數(shù)刪除一結(jié)點(diǎn)
	if(pNode){
		delete pNode;
		pNode=0;
	}
}

void COperationFamilytree::DestroyFamilytree()
{
	//本函數(shù)刪除家譜,釋放資源
	PostOrderTraverse(T,DestroyNode);

}

int COperationFamilytree::SaveFamilytree(CString filename)
{
	//本函數(shù)保存家譜到文件filename中
	FILE* fp;
	if((fp=fopen(filename,"w"))==0)				//打開文件filename
		return WRITE_FILE_ERROR;
	PreOrderTraverse(fp,T,SaveNode);			//從根結(jié)點(diǎn)開始存儲家譜數(shù)據(jù)

	//置家譜數(shù)據(jù)結(jié)束標(biāo)記(一結(jié)點(diǎn)的名字與其父結(jié)點(diǎn)的名字同為end)
	fprintf(fp,"%s %d %d %d %d %s %d %s","end",1999,12,
			2,1,"end",1,"end");
	fclose(fp);
	return OK;
}

void COperationFamilytree::PreOrderTraverse(FILE* fp,Person &T, void (__cdecl *Visit)(FILE* fp,Person &))
{
	//本函數(shù)把所有以T結(jié)點(diǎn)為根結(jié)點(diǎn)的結(jié)點(diǎn)值存到文件fp中
	if(T){
		(*Visit)(fp,T);
		PreOrderTraverse(fp,T->child,Visit);
		PreOrderTraverse(fp,T->sibling,Visit);
	}
}

void SaveNode(FILE *fp, Person &pNode)
{
	//本函數(shù)向文件fp中存取一結(jié)點(diǎn)pNode
	char ch='\n';
	if(pNode){
		fprintf(fp,"%s %d %d %d %d %s %d ",pNode->info.name,pNode->info.birthday.year,
			pNode->info.birthday.month,pNode->info.birthday.day,pNode->info.marry,
			pNode->info.addr,pNode->info.live);
		if(pNode->info.live==0)
			fprintf(fp," %d %d %d ",pNode->info.deathday.year,pNode->info.deathday.month,
				pNode->info.deathday.day);
		if(pNode->parent)
			fprintf(fp," %s ",pNode->parent->info.name);
		else
			fprintf(fp," %s","-1");
		fprintf(fp," %c",ch);
	}
}

int COperationFamilytree::ReadNode(FILE *fp, Person &T,char* parentname)
{
	//本函數(shù)從文件fp中讀取信息到結(jié)點(diǎn)T中,并讀取結(jié)點(diǎn)的父親名字到字符數(shù)組parentname中
	//分別讀取結(jié)點(diǎn)值,為:姓名,出生日期(年,月,日),婚否,地址,健在否,(如過世,還有死亡日期)
	fscanf(fp,"%s%d%d%d%d%s%d",T->info.name,&T->info.birthday.year,&T->info.birthday.month,
			&T->info.birthday.day,&T->info.marry,T->info.addr,&T->info.live);
	if(T->info.live==0)
		fscanf(fp,"%d%d%d",&T->info.deathday.year,&T->info.deathday.month,
							&T->info.deathday.day);
	fscanf(fp,"%s",parentname);
	if(!IsDateValid(T->info.birthday))		//出生日期合法性檢查
		return	FILE_DATA_NOT_PRACTICAL;
	if(T->info.live==0)						//若過世,死亡日期合法性檢查
	{	if (CompareDate(T->info.birthday,T->info.deathday)!=-1)
			return FILE_DATA_NOT_PRACTICAL;
		if(!IsDateValid(T->info.deathday))
			return	FILE_DATA_NOT_PRACTICAL;}
	return OK;
}

bool COperationFamilytree::IsDateValid(Date date)
{
	//本函數(shù)為日期的有效性檢查
	switch(date.month){
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91黄色免费看| 国产在线视视频有精品| 91官网在线免费观看| 亚洲免费三区一区二区| 色综合色综合色综合| 亚洲影院在线观看| 日韩一区二区免费在线电影| 日韩电影免费在线观看网站| 精品国偷自产国产一区| 成人免费的视频| 亚洲免费资源在线播放| 欧美猛男超大videosgay| 美女一区二区三区在线观看| 久久精品男人天堂av| 成人国产电影网| 午夜欧美在线一二页| 337p日本欧洲亚洲大胆色噜噜| 国产成人午夜视频| 亚洲手机成人高清视频| 欧美日韩一级二级三级| 午夜视频在线观看一区二区三区| 欧美精品 日韩| 免费不卡在线视频| 91.com视频| 高清成人在线观看| 亚洲精品水蜜桃| 欧美日韩一区视频| 亚洲最色的网站| 欧美一区二区私人影院日本| 樱花影视一区二区| 99久久精品国产观看| 亚洲一区二区三区三| 91精品国产欧美一区二区18| 九九热在线视频观看这里只有精品| 日韩欧美专区在线| 国产一区二区在线观看免费| 中文字幕+乱码+中文字幕一区| 色综合久久久久综合体桃花网| 亚洲国产欧美日韩另类综合 | 成人av午夜影院| 亚洲精品乱码久久久久久久久 | 美女www一区二区| 欧美激情一区在线观看| 欧美丝袜丝交足nylons图片| 免费观看成人av| 国产精品久久久久久妇女6080| 欧美日韩一区二区三区视频| 免费高清不卡av| 日韩伦理电影网| 欧美一区二区国产| 成人国产精品免费观看动漫| 水蜜桃久久夜色精品一区的特点 | 欧美极品少妇xxxxⅹ高跟鞋| 欧美伊人精品成人久久综合97| 秋霞成人午夜伦在线观看| 久久免费美女视频| 99re视频精品| 狠狠狠色丁香婷婷综合久久五月| 一区二区三区在线观看国产| 日韩一级高清毛片| 国产成人小视频| 亚洲第一成人在线| 欧美精品欧美精品系列| 欧美视频中文字幕| 成人免费高清视频在线观看| 精品影视av免费| 亚洲成a人v欧美综合天堂下载| 国产欧美一区二区精品性色| 制服丝袜亚洲色图| 91丨porny丨最新| 国产精品中文字幕日韩精品| 日韩福利视频网| 一区二区三区精品在线观看| 国产日产精品1区| 日韩女同互慰一区二区| 欧美日韩亚洲不卡| 色哟哟在线观看一区二区三区| 国内精品写真在线观看| 日韩成人免费看| 亚洲一区视频在线| 亚洲精品免费在线播放| 欧美国产综合一区二区| 欧美日本国产视频| 不卡影院免费观看| 国产乱一区二区| 日本中文字幕一区二区视频| 一区二区在线免费观看| 亚洲婷婷国产精品电影人久久| 久久久精品免费免费| 精品少妇一区二区| 5566中文字幕一区二区电影| 欧美性生活一区| 在线亚洲免费视频| 91精品福利视频| 色av综合在线| 欧美最猛性xxxxx直播| 91色在线porny| 99国产欧美另类久久久精品| 99热国产精品| 成人av免费网站| 99免费精品在线观看| 99精品久久只有精品| www.欧美色图| 91色porny| 欧美午夜电影网| 欧美日韩欧美一区二区| 69堂精品视频| 精品福利一区二区三区免费视频| 精品国内二区三区| 国产日韩亚洲欧美综合| 精品国产一二三| 日韩三级视频在线看| 精品国产伦一区二区三区观看体验| 日韩欧美123| 中文字幕av不卡| 亚洲欧美日韩国产一区二区三区| 亚洲视频 欧洲视频| 亚洲超碰精品一区二区| 蓝色福利精品导航| 丁香另类激情小说| 在线一区二区视频| 777a∨成人精品桃花网| 久久综合九色综合97_久久久| 久久丝袜美腿综合| 亚洲免费三区一区二区| 五月天中文字幕一区二区| 精品影视av免费| 91视频观看免费| 69av一区二区三区| 久久久精品综合| 亚洲精品成人悠悠色影视| 日韩精品一区第一页| 国产福利一区二区三区| 91国模大尺度私拍在线视频| 欧美怡红院视频| 国产清纯白嫩初高生在线观看91| 一区二区激情视频| 国产在线视频精品一区| 色综合天天综合在线视频| 日韩精品一区二区三区蜜臀| 亚洲婷婷综合久久一本伊一区| 三级亚洲高清视频| 成人动漫一区二区| 欧美二区三区91| 中文字幕免费不卡| 三级精品在线观看| 99国产精品一区| 欧美久久一二三四区| 亚洲精品一区二区三区在线观看| 国产精品传媒在线| 精品一区二区三区不卡| 色偷偷一区二区三区| 久久精品视频在线看| 亚洲h动漫在线| www.在线成人| wwwwww.欧美系列| 日韩va欧美va亚洲va久久| 99国产欧美另类久久久精品 | 日本一区二区三区四区| 亚洲国产wwwccc36天堂| 99久久国产综合精品女不卡| 欧美另类一区二区三区| 国产精品伦一区| 老司机免费视频一区二区三区| 色av一区二区| 国产精品福利在线播放| 国产自产视频一区二区三区| 欧美日韩国产一级| 亚洲精品亚洲人成人网在线播放| 国产精品伊人色| 欧美大片拔萝卜| 三级成人在线视频| 在线日韩国产精品| 中文字幕一区二区5566日韩| 国产精品综合网| 精品电影一区二区| 免费成人美女在线观看| 91精品国产一区二区三区蜜臀| 国产精品毛片高清在线完整版| 捆绑调教一区二区三区| 精品视频一区三区九区| 自拍偷拍亚洲综合| 蜜臀久久99精品久久久久宅男| 欧美日韩国产不卡| 亚洲国产精品麻豆| 欧美欧美欧美欧美| 亚洲成人av一区二区三区| 欧美日韩一区二区电影| 亚洲va在线va天堂| 欧美日韩国产免费| 午夜精品福利视频网站| 91麻豆精品国产自产在线 | 亚洲一二三区在线观看| 在线一区二区视频| 亚洲成人三级小说| 91精品国产综合久久精品| 亚洲影院在线观看| 99精品国产一区二区三区不卡| 亚洲免费观看在线视频| 欧洲精品在线观看|