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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? operationfamilytree.cpp

?? 數據結構——家譜的實現 本人的課程設計 MFC
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// OperationFamilytree.cpp: implementation of the COperationFamilytree class.
//
//////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////
/////					家譜操作類實現文件
/////////////////////////////////////////////////////////////////////
#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()
{
	//本函數新建一空家譜
	DestroyFamilytree();				//刪除原有家譜
	T=0;
}

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

	//讀取根結點值,(姓名,出生日期(年,月,日),婚否,地址,健在否,(如過世,還有死亡日期))				
	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){		//根結點名字與其父親名字相同,說明為空樹
		delete T;
		T=0;
		return PEDIGREE_EMPTY;
	}
	temp=new PersonNode;						//申請一結點
	if(!temp){									//申請失敗
		DestroyFamilytree();						//釋放申請空間
		return NOT_ENOUGH_MEMORY;
	}

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

		if(result==FILE_DATA_NOT_PRACTICAL){	//若數據不合法,釋放已申請空間,然后返回
			delete temp;
			DestroyFamilytree();
			return result;
		}
		parentT=0; 
		Find(T,parentT,parentname);				//找到parentname所在結點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已經有孩子
				InsertSibling(parentT->child,temp);
			}//if
			else								//parentname無孩子,則temp應為
				parentT->child=temp;			//parentname的第一個孩子
		}//if
		else{									//parentT不存在,說明家譜中不存在parentname此人
			DestroyFamilytree();					//返回出錯信息
			return FILE_DATA_ERROR;
		}
		temp=new PersonNode;						//申請一結點
		if(!temp){									//申請失敗
			DestroyFamilytree();						//釋放申請空間
			return NOT_ENOUGH_MEMORY;
		}
		result=ReadNode(fp,temp,parentname);			//繼續讀取數據
	}//while
	if(temp)
		delete temp;
	fclose(fp);
	return OK;
}

void COperationFamilytree::Find(Person& T,Person& Tname,char* name)
{
	//本函數以T為根結點開始,搜索結點信息中名字等于name的結點
	if(T){									//如果T存在
		if(strcmp(T->info.name,name)==0)	//T結點姓名和name相同,把T結點指針傳給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)
{
	//本函數以T為根結點開始,搜索結點信息中生日等于month,day的結點,
	//并把所有符合條件的結點指針值存入以Tname為起始地址的地址數組中
if(T){									//如果T存在
		if(T->info.birthday.month==month&&T->info.birthday.day==day){	
			//T結點生日與所給相同,把T結點指針傳給Tname,同時Tname指針前進
			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 &))
{
	//本函數對以T為根結點的所有結點后序遍歷訪問Visit函數
	if(T){
		PostOrderTraverse(T->child,Visit);
		PostOrderTraverse(T->sibling,Visit);
		(*Visit)(T);
	}
}

void DestroyNode(Person &pNode)
{
	//本函數刪除一結點
	if(pNode){
		delete pNode;
		pNode=0;
	}
}

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

}

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

	//置家譜數據結束標記(一結點的名字與其父結點的名字同為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 &))
{
	//本函數把所有以T結點為根結點的結點值存到文件fp中
	if(T){
		(*Visit)(fp,T);
		PreOrderTraverse(fp,T->child,Visit);
		PreOrderTraverse(fp,T->sibling,Visit);
	}
}

void SaveNode(FILE *fp, Person &pNode)
{
	//本函數向文件fp中存取一結點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)
{
	//本函數從文件fp中讀取信息到結點T中,并讀取結點的父親名字到字符數組parentname中
	//分別讀取結點值,為:姓名,出生日期(年,月,日),婚否,地址,健在否,(如過世,還有死亡日期)
	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)
{
	//本函數為日期的有效性檢查
	switch(date.month){
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
麻豆精品一二三| 2021中文字幕一区亚洲| 亚洲摸摸操操av| 99国产欧美另类久久久精品| 亚洲图片欧美激情| 欧美午夜影院一区| 亚洲成av人片在线观看| 欧美精品精品一区| 久久se这里有精品| 中日韩av电影| 色哟哟国产精品| 五月婷婷激情综合网| 日韩女优av电影在线观看| 国产综合色产在线精品| 国产精品色噜噜| 91官网在线观看| 蜜桃在线一区二区三区| 欧美激情综合五月色丁香| 97久久久精品综合88久久| 午夜精品国产更新| 精品理论电影在线| 91亚洲男人天堂| 免费高清不卡av| 国产精品福利一区二区| 欧美老女人在线| 国产精品亚洲第一区在线暖暖韩国| 中文字幕一区二区视频| 欧美剧在线免费观看网站| 国产一区二区伦理| 亚洲一区视频在线观看视频| 精品国产一区二区三区av性色 | 97se狠狠狠综合亚洲狠狠| 亚洲国产va精品久久久不卡综合| 日韩精品中文字幕一区二区三区| 成人av在线网站| 日本最新不卡在线| 亚洲理论在线观看| 国产拍欧美日韩视频二区| 欧美日韩一区国产| 成人国产一区二区三区精品| 日本在线不卡一区| 亚洲码国产岛国毛片在线| 日韩欧美在线观看一区二区三区| 91丝袜呻吟高潮美腿白嫩在线观看| 日本aⅴ亚洲精品中文乱码| 自拍偷拍亚洲综合| 粉嫩一区二区三区在线看| 99re免费视频精品全部| 亚洲一区二区三区在线| 日韩av在线发布| 国产91色综合久久免费分享| 久久99热99| 欧美一激情一区二区三区| 亚洲男女一区二区三区| 国产.精品.日韩.另类.中文.在线.播放| 欧美老人xxxx18| 成年人网站91| 一区二区在线电影| 日本视频在线一区| 一本色道久久综合精品竹菊| 国产精品人妖ts系列视频| 国产一区二区三区免费播放| 亚洲欧美aⅴ...| 日本成人在线看| 国产在线精品视频| 久久精品国产色蜜蜜麻豆| www.视频一区| 26uuu久久综合| 日日夜夜精品视频免费| 欧美日韩国产另类一区| 精品在线播放免费| 亚洲色图视频免费播放| 欧美图区在线视频| 粉嫩一区二区三区性色av| 亚洲精品成人a在线观看| 精品粉嫩超白一线天av| 色丁香久综合在线久综合在线观看| 亚洲婷婷在线视频| 风间由美一区二区三区在线观看| 久久精品免费观看| 狠狠久久亚洲欧美| 黑人巨大精品欧美黑白配亚洲| 日本人妖一区二区| 久久99国产精品免费| 久久99国产精品麻豆| 国产伦精品一区二区三区在线观看 | 国产成人免费9x9x人网站视频| 久久se精品一区精品二区| 国产乱淫av一区二区三区| 国产69精品久久久久毛片| 国产盗摄视频一区二区三区| 成人亚洲精品久久久久软件| av在线综合网| 欧美性感一类影片在线播放| 欧美精品在欧美一区二区少妇| 日韩一区二区三区视频| 久久久不卡影院| 国产精品嫩草影院com| 亚洲激情第一区| 天天综合色天天综合| 激情综合五月天| 成人成人成人在线视频| 欧美午夜在线一二页| 欧美一区二区三区免费在线看| 欧美成人激情免费网| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | www国产精品av| 国产精品美女久久久久av爽李琼 | 精品对白一区国产伦| 中文字幕国产一区| 午夜精品福利视频网站| 国产制服丝袜一区| 91欧美一区二区| 欧美一级欧美三级| 中文字幕日韩av资源站| 日本不卡在线视频| 成人午夜精品一区二区三区| 欧美日韩在线不卡| 国产日韩高清在线| 日韩在线一二三区| 成人免费看视频| 欧美一区二区大片| 亚洲日本丝袜连裤袜办公室| 美洲天堂一区二卡三卡四卡视频| av动漫一区二区| 精品国产污污免费网站入口| 中文字幕一区二区三区色视频| 日韩电影在线一区| 欧美片在线播放| 中文字幕国产一区| 久久激情五月激情| 欧美午夜精品久久久久久孕妇| 久久亚洲二区三区| 午夜视频一区在线观看| 成人的网站免费观看| 精品奇米国产一区二区三区| 亚洲一区二区三区中文字幕| 国产不卡在线一区| 欧美tickling挠脚心丨vk| 亚洲精品成人悠悠色影视| 国产91高潮流白浆在线麻豆| 91精品国产一区二区三区香蕉| 亚洲欧美日韩中文字幕一区二区三区 | 日韩欧美色综合网站| 一区二区三区中文免费| 成人蜜臀av电影| 久久品道一品道久久精品| 青草国产精品久久久久久| 欧亚一区二区三区| 亚洲激情在线播放| 91首页免费视频| 亚洲国产成人午夜在线一区| 国产一区二区三区在线观看免费 | 久久99精品一区二区三区 | 一本大道久久a久久精品综合| 久久亚洲一级片| 另类专区欧美蜜桃臀第一页| 欧美精品123区| 亚洲国产成人tv| 欧美色图12p| 亚洲国产欧美在线人成| 在线亚洲一区观看| 一二三区精品福利视频| 91色视频在线| 亚洲乱码日产精品bd| 色综合中文综合网| 国产精品素人视频| 成人性生交大片免费看视频在线 | 99re成人在线| 中文字幕一区在线| 色综合天天做天天爱| 亚洲免费观看在线观看| 91视频免费播放| 亚洲一区欧美一区| 欧美日韩一区三区四区| 日韩av不卡在线观看| 欧美一级爆毛片| 国产乱码字幕精品高清av| 中文子幕无线码一区tr | 欧美色欧美亚洲另类二区| 亚洲午夜电影网| 日韩午夜av电影| 国产精品一区久久久久| 国产精品色婷婷久久58| 色婷婷国产精品综合在线观看| 亚洲精品欧美激情| 欧美人牲a欧美精品| 国内精品伊人久久久久影院对白| 久久久高清一区二区三区| 99精品国产一区二区三区不卡| 亚洲电影一级片| 日韩午夜av电影| 成人av资源在线| 国产精品一区二区久久精品爱涩| 国产亚洲美州欧州综合国| 99久久免费视频.com| 天天色 色综合| 久久久蜜臀国产一区二区| 日本精品视频一区二区| 欧美bbbbb|