




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計家譜管理系統(tǒng)設(shè)計與實現(xiàn)姓名:學(xué)號:年級:專業(yè):學(xué)校:1 1. 1..352.2.462.2.562.2.682.2.7102.2.8102.2.9102.2.10112.2.11122.3132.41731718192家譜管理系統(tǒng)設(shè)計與實現(xiàn)姓名:學(xué)號:班級:計算機科學(xué)與技術(shù)1問題陳述家譜用于記錄某家族歷代家族成員的情況與關(guān)系。現(xiàn)編制一個家譜資料管理軟件,實現(xiàn)對一個家族所有的資料進行收集整理。支持對家譜的存儲、更新、查詢、統(tǒng)計等操作。并用計算機永久儲存家族數(shù)據(jù),方便隨時調(diào)用。2設(shè)計方法闡述2.1 總體規(guī)劃在動手編制程序之前,先要做好
2、程序的規(guī)劃,包括程序儲存數(shù)據(jù)所用的結(jié)構(gòu),數(shù)據(jù)類型等等, 只有確定了數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu),才能在此基礎(chǔ)上進行各種算法的設(shè)計和程序的編寫。首先是考慮數(shù)據(jù)類型。在家譜中,家族成員是最基本的組成部分,對于家族管理中,已經(jīng)不能再進行細分了,所以選定家族成員作為數(shù)據(jù)的基本類型,并在程序中定義COperationFamilytree類。其中COperationFamilytree類的各種屬性可以根據(jù)需要進行添加或刪除,從日常生活應(yīng)用的角度出發(fā),制定了COperationFamilytree類中包含了一下屬性:char nameMAX_CHARNUM;/ 姓名Date birthday;/ 出生日期In tse
3、x; / 性別char addrMAX_CHARNUM;/基本資料int live;/健在否Date deathday;/死亡日期int ChildNums(Person pNode) ;/ 返回 pNode孩子數(shù)3intInSiblingPos(Person pNode);/ 返回 pNode在其兄弟中的排行為方便計算機進行比較,在 familytree 類的某些屬性中用數(shù)字代替了某些不會改變的字符串,譬如性別(1 代表男, 0 代表女)、判斷是否健在(1 為是, 0 為否)。在設(shè)置日期上,為方便以后的計算與比較, 也將日期用整型數(shù)字表示19990505 表示 1999 年 5 月 5 日,
4、這種表示方法只需在輸入和輸出上作少許的運算便可方便地與日期進行轉(zhuǎn)換。在家族關(guān)系的表示上,并沒有用相關(guān)家屬的姓名作為儲存數(shù)據(jù),而僅僅是存儲了各關(guān)系親屬的ID ,方便日后作為指針指示調(diào)用相對應(yīng)的家族成員。其中在屬性pNode 上,其表示的是下一個同父母的弟或妹 ID ,也就是說,當(dāng)某家族成員有若干個子女,其pNode 僅指向第一個孩子,其余的孩子如何表示呢?可以通過第一個孩子的pNode 指示,如此類推,直到孩子的pNode =0 為止。這樣就可以避免需在程序設(shè)計時預(yù)定父母可以擁有的孩子數(shù),有多少孩子就表示多少,實現(xiàn)了動態(tài)的儲存數(shù)據(jù)。在選擇數(shù)據(jù)結(jié)構(gòu)方面,從直觀來說,選擇樹型結(jié)構(gòu)通過鏈表來連接數(shù)據(jù)無
5、疑是最直觀易懂的,我在一開始構(gòu)思的時候也是從樹型結(jié)構(gòu)去想的,但當(dāng)構(gòu)思到如何存儲和提取數(shù)據(jù)是,便發(fā)現(xiàn)了問題。 毫無疑問,用指針來處理數(shù)據(jù)的確是方便直觀,但當(dāng)我要儲存數(shù)據(jù)是,便發(fā)現(xiàn)把指針儲存進去是沒有作用的,因為當(dāng)我們下一次讀取數(shù)據(jù)的時候,數(shù)據(jù)內(nèi)存地址已經(jīng)不同了, 不在是我們上次存儲數(shù)據(jù)時的地址,也就是說指針這時已經(jīng)是沒有作用了。要解決這樣的問題, 我們必須要在存儲數(shù)據(jù)之前,先家族樹序列化,用數(shù)組 (或者其他可以用數(shù)字表示關(guān)系的方法) 來存儲, 并且, 再下一次讀取數(shù)據(jù)時,再把數(shù)據(jù)按照序列號重新組成一個家族樹, 過程比較繁復(fù),而且實現(xiàn)起來也不容易。所以我便考慮直接用數(shù)組來存儲數(shù)據(jù),即使是在內(nèi)存中也
6、用數(shù)組來處理數(shù)據(jù)間的聯(lián)系。運用順序表這個結(jié)構(gòu)雖然不是那么直觀,但在查找數(shù)據(jù)時的算法設(shè)計比較簡單容易實現(xiàn),效率高,而且在內(nèi)存中的數(shù)據(jù)可以直接讀入到文件中,文件中的數(shù)據(jù)也可以直接讀入內(nèi)存,不需要進行轉(zhuǎn)換。所以在衡量的各個方面之后,我決定用數(shù)組來處理數(shù)據(jù)間的聯(lián)系。2.2 功能構(gòu)想構(gòu)想好總體規(guī)劃之后,便開始設(shè)計程序中需要用到的各個功能函數(shù),初步構(gòu)想是要先實現(xiàn)最基本的幾項功能,其中數(shù)據(jù)操作的有:增加成員,修改成員資料,刪除成員;數(shù)據(jù)存取的有:打開家譜,新建家譜,保存家譜,另存家譜;數(shù)據(jù)查詢的有:查看某代信息,按姓名查找,按生日查找,查看成員關(guān)系,按出生日期排序等等。42.2.1 增加成員這項功能做得不夠
7、理想,在規(guī)劃時沒有把成員以配偶的形式增加,而只能以子女的形式增加。對應(yīng)的函數(shù)代碼如下:void COperationFamilytree:Add(Person parent, Person addNode)/本函數(shù)把addNode 結(jié)點加入到其父結(jié)點parent 下addNode-child=addNode-sibling=0;/把欲加入的結(jié)點所有指針域置空addNode-parent=parent;/因 addNode 欲加為parent 的孩子,故addNode 結(jié)點的父指針域應(yīng)指向parentif(parent=0)/若 parent 為 0,則表示欲加addNode 為根結(jié)點if(T=
8、0)/若本為空家譜T=addNode;/把 addNode 當(dāng)成根結(jié)點return;addNode-child=T;/使原來的根結(jié)點成為新根結(jié)點的孩子T-parent=addNode;T=addNode;return;if(parent-child=0)/parent 無孩子,把addNode 加入其孩子parent-child=addNode;elseInsertSibling(parent-child,addNode);/把 addNode 加到 parent 孩子的兄弟域中2.2.2 修改成員資料修改成員這項功能實現(xiàn)起來比較簡單,找到要修改成員的名字,再輸入新修改的值,整個函數(shù)沒有什么需
9、要運用算法的地方,但如果想真正寫好這個函數(shù),則需要考慮相當(dāng)多的細節(jié),譬如各個輸入項目的錯誤處理等等,要非常全面地考慮各項細節(jié)。函數(shù)代碼如下:void CFamilytreeDlg:OnModify()/ TODO: Add your command handler code here if(operFamilytree.GetRoot()=0)return;CModifyInfoDlg dlg;HTREEITEM hItem;hItem=m_peTree.GetSelectedItem();dlg.m_newname=m_peTree.GetItemText(hItem);5Person on
10、eself=0;char oldnameMAX_CHARNUM; strcpy(oldname,dlg.m_newname); operFamilytree.Find(operFamilytree.GetRoot(),oneself,oldname); if(dlg.DoModal()=IDCANCEL)return;UpdateData(FALSE);Person newValue=new PersonNode;strcpy(newV,dlg.m_newname);/ 判斷家譜中是否已有用戶給定的新名字if(strcmp(newV,ol
11、dname)=0) ; / 用戶不修改姓名 elsePerson p=0;operFamilytree.Find(operFamilytree.GetRoot(),p,newV);/ 查 找家譜中有沒有此人if(p!=0)AfxMessageBox( 家譜中已有此人!);delete newValue;return;strcpy(newValue-info.addr,dlg.m_newaddr);newValue-info.marry=dlg.m_marry;newValue-info.live=dlg.m_live;newValue-info.birthday.d
12、ay=dlg.m_birthday_day;newValue-info.birthday.month=dlg.m_birthday_month;newValue-info.birthday.year=dlg.m_birthday_year;if(!newValue-info.live)/ 如若過世,則應(yīng)有死亡日期newValue-info.deathday.day=dlg.m_deathday_day;newValue-info.deathday.month=dlg.m_deathday_month;newValue-info.deathday.year=dlg.m_deathday_year
13、;if(!operFamilytree.IsDateValid(newValue-info.deathday)AfxMessageBox( 此人信息中死亡日期不合實際!);delete newValue;return;if(operFamilytree.CompareDate(newValue-info.deathday,newValue-info.birthday)=-1)AfxMessageBox( 此人死亡日期不可能比其出生日期早!);return;6operFamilytree.Modify(oneself,newValue);RefreshTree();RefreshList();I
14、sFamilytreeModified=true;/ 置家譜修改標(biāo)記為真delete newValue;2.2.3 刪除成員用數(shù)組來儲存數(shù)據(jù), ,最麻煩的就是刪除數(shù)組元素了,在這個程序中,刪除數(shù)組不但意味著要重新排列各成員, 還要重新更新各成員的關(guān)系, 所以我個人認為在這個程序中, 刪除成員函數(shù)可以說是一個難點。 通過分析, 發(fā)現(xiàn)刪除成員的情況就只有兩種, 只要針對這兩種情況處理好刪除,就可以完成成員刪除這個功能。,刪除的成員是出于家族中最底層的,也就是刪除該成員不會牽連其他成員,但這也需要處理好其父母的孩子數(shù)。,刪除的成員還有子孫,則需要連帶所有子孫都要刪除出家譜。遇到這種情況, 不但要像上
15、一種情況那樣處理父母和兄弟姐妹的關(guān)系,還要記錄牽連刪除的總?cè)藬?shù),因為刪除不再是簡單刪除了一個人,而是若干個,通過遞歸調(diào)用,可以統(tǒng)計出需要刪除的數(shù)目刪除函數(shù)的相關(guān)代碼如下:void COperationFamilytree:Delete(Person &rootNode)/本函數(shù)刪除以rootNode 為根結(jié)點的所有結(jié)點if(rootNode-parent)/如果 rootNode 有父結(jié)點if(rootNode-parent-child=rootNode)/ 如果rootNode 為其父結(jié)點的第一個孩子rootNode-parent-child=rootNode-sibling;/ 因要刪掉r
16、ootNode, 故把其父結(jié)點的孩子指針指向rootNode 的第一個兄弟else/ 如果rootNode 不是父結(jié)點的第一個孩子Person p=rootNode-parent-child;/找到 rootNode 應(yīng)在兄弟中的位置for(;p-sibling!=rootNode;p=p-sibling);p-sibling=rootNode-sibling;/插入到兄弟中PostOrderTraverse(rootNode-child,DestroyNode);/ 刪除以rootNode-child為根結(jié)點的所有結(jié)點if(rootNode=T)/刪除 rootNode 結(jié)點。如果rootN
17、ode 為根結(jié)點,則刪除根結(jié)點TDestroyNode(T);7elseDestroyNode(rootNode);2.2.4 打開家譜打開家譜函數(shù)的相關(guān)代碼如下:int COperationFamilytree:ReadNode(FILE *fp, Person &T,char* parentname)/本函數(shù)從文件fp 中讀取信息到結(jié)點T 中 ,并讀取結(jié)點的父親名字到字符數(shù)組parentname 中/分別讀取結(jié)點值,為: 姓名 ,出生日期 (年,月 ,日 ),婚否 ,地址 ,健在否 ,(如過世,還有死亡日期)fscanf(fp,%s%d%d%d%d%s%d,T-,&T-i
18、nfo.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_PRACTIC
19、AL;if(T-info.live=0)/若過世 ,死亡日期合法性檢查if (CompareDate(T-info.birthday,T-info.deathday)!=-1) return FILE_DATA_NOT_PRACTICAL;if(!IsDateValid(T-info.deathday)returnFILE_DATA_NOT_PRACTICAL;return OK;2.2.5 新建家譜新建家譜函數(shù)的相關(guān)代碼如下:void COperationFamilytree:NewFamilytree()/本函數(shù)新建一空家譜8DestroyFamilytree();/刪除原有家譜T=0;i
20、nt COperationFamilytree:CreateFamilytree(CString filename)/本函數(shù)建立一新家譜DestroyFamilytree();/建立一新家譜之前,清空原有家譜FILE* fp;if(fp=fopen(filename,r)=0)/打開文件filenamereturn READ_FILE_ERROR;T=new PersonNode;/ 定義根結(jié)點if(!T)return NOT_ENOUGH_MEMORY;T-child=0;T-sibling=0;T-parent=0;Person parentT, temp;/定義兩個臨時結(jié)點char pa
21、rentnameMAX_CHARNUM;/ 定義一個臨時字符串?dāng)?shù)組/讀取根結(jié)點值,(姓名 ,出生日期 ( 年 ,月 ,日 ), 婚否 ,地址 ,健在否 ,( 如過世,還有死亡日期)int result;result=ReadNode(fp,T,parentname);if(result=FILE_DATA_NOT_PRACTICAL)delete T;/若不合法,刪除申請的堆空間T=0;return result;if(strcmp(T-,parentname)=0)/根結(jié)點名字與其父親名字相同,說明為空樹delete T;T=0;return PEDIGREE_EMPTY;
22、temp=new PersonNode;/申請一結(jié)點if(!temp)/ 申請失敗DestroyFamilytree();/ 釋放申請空間return NOT_ENOUGH_MEMORY;result=ReadNode(fp,temp,parentname);while(strcmp(,parentname)&strcmp(,end)/9讀取信息結(jié)束的條件是兩個人的名字同為endif(result=FILE_DATA_NOT_PRACTICAL)/ 若數(shù)據(jù)不合法,釋放已申請空間,然后返回delete temp;DestroyFamilyt
23、ree();return result;parentT=0;Find(T,parentT,parentname);/找到 parentname 所在結(jié)點parentTif(parentT)/ 如果 parentT 存在,說明parentname 在家譜中/并且 parentname 為 temp 的父親int cmp;cmp=CompareDate(temp-info.birthday,parentT-info.birthday);if(cmpchild=temp-sibling=0;temp-parent=parentT;/temp 的父指針指向parentT;if(parentT-chil
24、d)/parentname 已經(jīng)有孩子InsertSibling(parentT-child,temp);/ifelse/parentname 無孩子 ,則 temp 應(yīng)為parentT-child=temp;/parentname 的第一個孩子/ifelse/parentT 不存在 ,說明家譜中不存在parentname 此人DestroyFamilytree();/ 返回出錯信息return FILE_DATA_ERROR;temp=new PersonNode;/ 申請一結(jié)點if(!temp)/申請失敗DestroyFamilytree();/釋放申請空間return NOT_ENOUG
25、H_MEMORY;result=ReadNode(fp,temp,parentname);/ 繼續(xù)讀取數(shù)據(jù)/whileif(temp)delete temp;fclose(fp);return OK;102.2.6 保存家譜保存家譜函數(shù)的相關(guān)代碼如下:int COperationFamilytree:SaveFamilytree(CString filename)/本函數(shù)保存家譜到文件filename 中FILE* fp;if(fp=fopen(filename,w)=0)/打開文件filenamereturn WRITE_FILE_ERROR;PreOrderTraverse(fp,T,Sa
26、veNode);/從根結(jié)點開始存儲家譜數(shù)據(jù)/置家譜數(shù)據(jù)結(jié)束標(biāo)記(一結(jié)點的名字與其父結(jié)點的名字同為end)fprintf(fp,%s %d %d %d %d %s %d %s,end,1999,12,2,1,end,1,end);fclose(fp);return OK;voidCOperationFamilytree:PreOrderTraverse(FILE*fp,Person&T,void(_cdecl*Visit)(FILE* fp,Person &)/本函數(shù)把所有以T 結(jié)點為根結(jié)點的結(jié)點值存到文件fp 中if(T)(*Visit)(fp,T);PreOrderTraverse(fp,T
27、-child,Visit);PreOrderTraverse(fp,T-sibling,Visit);void SaveNode(FILE *fp, Person &pNode)/本函數(shù)向文件fp 中存取一結(jié)點pNodechar ch=n;if(pNode)fprintf(fp,%s %d %d %d %d %s %d ,pN,pNode-info.birthday.year,pNode-info.birthday.month,pNode-info.birthday.day,pNode-info.marry, pNode-info.addr,pNode-info.li
28、ve);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 ,pN);else11fprintf(fp, %s,-1);fprintf(fp, %c,ch);2.2.7 查看某代信息查看某代信息函數(shù)的相關(guān)代碼如下:int COperationFamilytree:InGenerationPos(Person p
29、Node)/本函數(shù)返回pNode 結(jié)點在第幾代int pos=1;Person p;p=pNode-parent;for(;p!=0;p=p-parent)pos+;return pos;2.2.8 按姓名查找按姓名查找函數(shù)的相關(guān)代碼如下:void COperationFamilytree:Find(Person& T,Person& Tname,char* name)/本函數(shù)以T 為根結(jié)點開始 ,搜索結(jié)點信息中名字等于name 的結(jié)點if(T)/如果 T 存在if(strcmp(T-,name)=0)/T 結(jié)點姓名和name 相同,把T 結(jié)點指針傳給 TnameTname=
30、T;elseFind(T-sibling,Tname,name);/對 T 的兄弟遞歸搜索Find(T-child,Tname,name);/對 T 的孩子遞歸搜索2.2.9 按生日查找按生日查找函數(shù)的相關(guān)代碼如下:void COperationFamilytree:Find(Person &T, Person*& Tname,int month, int day)/本函數(shù)以T 為根結(jié)點開始 ,搜索結(jié)點信息中生日等于month,day 的結(jié)點 ,/并把所有符合條件的結(jié)點指針值存入以Tname 為起始地址的地址數(shù)組中if(T)/如果 T 存在if(T-info.birthday.month=mo
31、nth&T-info.birthday.day=day)/T 結(jié)點生日與所給相同,把T 結(jié)點指針傳給Tname,同時 Tname 指針前12進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 的兄弟遞歸搜索2.2.10 查看成員關(guān)
32、系查看成員關(guān)系函數(shù)的相關(guān)代碼如下:void CFamilytreeDlg:OnFamilytreeRelations()/ TODO: Add your command handler code here CRelationsDlg dlg; if(dlg.DoModal()=IDCANCEL)return;UpdateData(FALSE); int pos1,pos2;Person oneself=0;char name1MAX_CHARNUM,name2MAX_CHARNUM; strcpy(name1,dlg.m_firstname); operFamilytree.Find(oper
33、Familytree.GetRoot(),oneself,name1); if(oneself)pos1=operFamilytree.InGenerationPos(oneself);elseAfxMessageBox( 本家譜中找不到+CString(name1)+!);return;Person p,q;CString generation;generation+=;generation+= 在家譜中的位置: ;for(q=oneself,p=q-parent;p!=0;p=p-parent)generation+=;generat
34、ion+= -;q=p;13generation+=;generation+=n;oneself=0;strcpy(name2,dlg.m_secondname);operFamilytree.Find(operFamilytree.GetRoot(),oneself,name2);if(oneself)pos2=operFamilytree.InGenerationPos(oneself);elseAfxMessageBox( 本家譜中找不到+CString(name2)+!);return;generation+=;generatio
35、n+= 在家譜中的位置: ;for(q=oneself,p=q-parent;p!=0;p=p-parent)generation+=;generation+= - ;q=p;generation+=;generation+=nn;CString cmpResult;if(pos1pos2)cmpResult.Format(%s在 第 %d代 , %s在 第 %d代 , %s是 %s的 晚輩.,name1,pos1,name2,pos2,name1,name2);else if(pos1pos2)cmpResult.Format(%s在 第 %d代
36、, %s在 第 %d代 , %s是 %s的 長輩.,name1,pos1,name2,pos2,name1,name2);elsecmpResult.Format(%s 與%s 同在第 %d 代 .,name1,name2,pos2);generation+=cmpResult;AfxMessageBox(generation);2.2.11 按出生日期排序按出生日期排序函數(shù)的相關(guān)代碼如下:void COperationFamilytree:SortByBirthday(QuickSortNode *order)14/本函數(shù)對順序表order 以出生日期的大小排序int totalNums=0
37、;QuickSortNode* startaddr=order;startaddr+;GetPersonNums(T,totalNums);CopyInfoFromBiTreeToArray(T,startaddr);QuickSort(order,1,totalNums);2.3 板塊整合以上的功能設(shè)計生成的各種函數(shù)文件僅是獨立的各個板塊,要將這些函數(shù)有機地聯(lián)系起來,才能形成可以應(yīng)用的程序,首先我用了一個DefineStruct.h 聲明數(shù)據(jù)類型與各個應(yīng)用函數(shù),其代碼如下:根據(jù)家譜的特點,采用孩子- 兄弟的二叉樹鏈表表示法(鏈表的基本單位為以結(jié)構(gòu)PersomNode表示的結(jié)點),各種操作以C
38、OperationFamilytree類來實現(xiàn)。以下是 CoperationFamilytree類包含的數(shù)據(jù)成員及基本操作class COperationFamilytree/定義家族成員結(jié)構(gòu)public:COperationFamilytree();/ 構(gòu)造函數(shù)virtual COperationFamilytree();/ 析構(gòu)函數(shù)void NewFamilytree();/ 新建一空家譜int CreateFamilytree(CString filename);/ 從輸入文件 filename 中讀取數(shù)據(jù)建立家譜void DestroyFamilytree();/ 刪除家譜int Sa
39、veFamilytree(CString filename);/ 保存家譜void PreOrderTraverse(FILE* fp,Person& T ,void (*Visit)(FILE* fp,Person& T);15/ 先序遍歷 ( 為保存家譜而做 )void PostOrderTraverse(Person& T,void (*Visit)(Person& T);/ 后序遍歷 ( 為刪除家譜而做 )void Find(Person& T,Person& Tname,char* name);/ 從根結(jié)點出發(fā),搜索 name 所在結(jié)點 , 如找到,存于 Tname 中,找不到, T
40、name 為 0/ 使用前確保 Tname 指針為 0void Find(Person&T,Person*& Tname,int month,int day);/ 從根結(jié)點出發(fā), 搜索家譜中 birthday.month等于 month,birthday.day等于 day 的所有結(jié)/ 點 , 如找到, 存于以 Tname 為首地址的指針數(shù)組中,找不到, Tname 為 0 使用前確保 Tname/ 指針為 0void Add(Person parent,Person addNode);/ 把 addnode 加為結(jié)點 parent的孩子void Delete(Person& rootNode
41、);/ 刪除以 rootNode為根結(jié)點的所有結(jié)點void Modify(Person& pNode,Person newValue);/ 修改 pNode 結(jié)點為新值 newValuevoid SortByBirthday(QuickSortNode* order);/ 對家譜以出生日期排序,并把排序結(jié)果放在數(shù)組order中void GetPersonNums(Person&T,int& personNums);/ 得到家譜中總?cè)藬?shù)int InGenerationPos(Person pNode);/ 返回 pNode 在家譜中是第幾代int InSiblingPos(Person pNod
42、e);/ 返回 pNode 在其兄弟中的排行int ChildNums(Person pNode);/ 返回 pNode 孩子數(shù)int CompareDate(Date date1,Date date2);/ 比較兩日期的大小bool IsDateValid(Date date);/ 檢驗日期是否合法16Person& GetRoot();/ 得到根結(jié)點friend void SaveNode(FILE* fp,Person& pNode);/ 保存結(jié)點 pNode 到文件 fp 中friend void DestroyNode(Person& pNode);/ 刪除結(jié)點private:Per
43、son T;/ 二叉樹的根結(jié)點int ReadNode(FILE* fp,Person&T,char* parentname);/ 從文件 fp中讀取信息到結(jié)點T 中,讀取此結(jié)點的父親姓名到parentnaem中 ( 供CreateFamilytree函數(shù)調(diào)用 )void InsertSibling(Person& firstSibling,Person insertSibling);/ 把 insertSibling插入到以 firstSibling為首的兄弟中 ( 供 CreateFamilytree函數(shù)調(diào)用)void CopyInfoFromBiTreeToArray(Person&T,
44、QuickSortNode*&order);/ 把家譜中以 pNode 結(jié)點為根結(jié)點的出生日期拷貝到快速排序結(jié)構(gòu)數(shù)組order中 ( 供SortByBirthday函數(shù)調(diào)用 )void QuickSort(QuickSortNode* order,int low,int high);/ 對 orderlow.high中的記錄進行快速排序( 供 SortByBirthday函數(shù)調(diào)用 )int Partition(QuickSortNode* order,int low,int high);/ 對 orderlow.high中的記錄進行一次排序( 供 QuickSort函數(shù)調(diào)用 )bool IsL
45、eapYear(int year);/ 判斷是否閏年(供IsDateValid調(diào)用,以檢查日期是否合法)根據(jù) MFC 的特點,采用 CfamilytreeDlg類實現(xiàn)用戶窗口界面指令對于家譜的各種操作。class CFamilytreeDlg : public CDialogpublic:void SaveTip();17/ 保存提示void InitListCtrl();/ 初始化列表控件void RefreshTree();/ 刷新樹, ( 即刷新顯示 )void RefreshList();/ 刷新列表void DisplayFamilytree(Person& pNode);/ 顯示樹
46、void DisplayInListCtrl(Person pNode);/ 把 pNode 結(jié)點的信息在列表控件中顯示出來void Display(CString temp);/ 在列表控件中顯示其他信息void FindInTree(HTREEITEM& hRootItem,HTREEITEM& hItem,char* name);/ 在樹 hRootItem中查找 name 所在結(jié)點,如找到,把其結(jié)點句柄存入hItem中 , 找不到,/hItem為0. 注意,使用該函數(shù)時,確保hItem初值為 0void BirthdayTip();/ 每次打開一新家譜文件時的生日提示void DisplayGenerationInfo(Person& pNode,bool& flag,int count,int generation);/ 顯示所有第 generation 代人的信息void AddToTree(HTREEITEM hParentItem,Person addnode );/ 把 addnode 加入到樹的 hParentItem結(jié)點中去private:char savepathMAX_CHARNUM;/ 家譜第一次被保存時的路徑bool IsFamilytre
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 護理文書書寫員(病歷記錄)崗位面試問題及答案
- 化工檢驗工(成品檢驗)崗位面試問題及答案
- 股權(quán)低價轉(zhuǎn)讓與資產(chǎn)重組合同
- 供應(yīng)鏈金融服務(wù)公司股權(quán)部分轉(zhuǎn)讓與融資合作協(xié)議
- 旅游產(chǎn)業(yè)股權(quán)轉(zhuǎn)讓資金監(jiān)管及旅游資源開發(fā)合作協(xié)議
- 股權(quán)轉(zhuǎn)讓協(xié)議書(含對賭協(xié)議與業(yè)績補償條款)
- 環(huán)保項目股權(quán)轉(zhuǎn)讓意向協(xié)議
- 旅游產(chǎn)業(yè)股權(quán)合作與品牌運營合同
- 環(huán)保技術(shù)股權(quán)轉(zhuǎn)讓與項目運營管理合同
- 車輛購置擔(dān)保及售后服務(wù)承諾合同
- 江蘇省海安縣財政局會計服務(wù)中心事業(yè)單位招聘招考27人題庫及完整答案【網(wǎng)校專用】
- 2025年人教版中考英語復(fù)習(xí):2022年版課標(biāo)核心詞匯1600詞 英漢+漢英 默寫練習(xí)(含答案)
- 養(yǎng)護巡查制度
- 房地產(chǎn)行業(yè)數(shù)據(jù)安全管理制度及流程
- 新人教版數(shù)學(xué)五年級下冊第二單元《因數(shù)和倍數(shù)》教材解讀
- AI人工智能倫理與社會責(zé)任
- 2024年中國心力衰竭診斷與治療指南更新要點解讀
- 系統(tǒng)壓力測試評估執(zhí)行規(guī)范
- 北師大版五年級下冊數(shù)學(xué)計算題每日一練帶答案(共30天)
- 河南省建筑安全員《A證》考試題庫
- 病理科生物安全培訓(xùn)
評論
0/150
提交評論