源代碼連接: http://www.oschina.net/code/snippet_2348884_47615ios
1、題目算法
用二叉樹的數據結構實現一個簡易實用的族譜。主要有建立,插入,查詢,刪除,修改信息,計算代數,打印,寫入,讀取重要人物信息的功能。數據結構
2、數據結構與算法函數
數據結構:測試
利用二叉樹的鏈式存儲結構,以及結構體,類,棧,隊列完成。this
族譜表示二叉樹結構如 圖1;spa
族譜二叉樹結構中結點所包含的信息如 表 1 所示.net
表 1 族譜二叉樹結點信息指針
結構體分爲:code
1 結點結構體(我的姓名,兄弟結點指針,兒女結點指針,父親結點指針,妻子(們)信息指針,我的信息結構體);結構體分爲:
2 我的信息結構體(父母姓名,性別,狀態(去世 or 健在),處於家譜中第幾代,出生日期,死亡日期,選擇性重要信息指針);
類分爲
1 日期類 (年,月,日,判斷大小, 計算享年,修改,打印格式)
須要用到棧和隊列:
1 實現遍歷功能;
2 實現查找功能
算法:
一、二叉樹的層次遍歷,利用隊列實現。
二、凹入式目錄打印族譜,利用遞歸,非遞歸兩種實現。
三、查找基於遍歷功能。
四、刪除,修改基於查找功能。
五、文件讀寫
重要頭文件(包含部分重要結構體,所有函數定義)
#include<iostream> #include<string> #include<queue> #include<vector> #include <algorithm> #include<time.h> #include<fstream> #include "Date.h" using namespace std; //妻子信息 struct Wife_Information { string name; bool divorce; Wife_Information() { name = ""; divorce = false; }; Wife_Information(string name_) { name = name_; divorce = false; }; }; //我的信息 struct Member_Information{ string Sex; //性別 bool IsLife; vector<Wife_Information> wifves; string father_name; string mother_name; int generation; Date birth; Date death; string VIP_Information; // 若是這我的是個名人或者是對家族及其重要的人,新增信息緩衝區,存入該人平生事蹟 // Member_Information() { Sex = "undefine"; VIP_Information = ""; generation = 0; IsLife = true; }; //先列基本信息,更多的信息能夠之後再加進去 }; struct Tree{ string name; Tree *left; //兒子或女兒 Tree *right; //兄弟 Tree *father; //父親 Tree *brother; vector<Wife_Information> wifves; //妻子(們)的信息 Member_Information self; // 本人信息 Tree() { name = ""; left = right = father = brother = 0; self.generation = 0; }; Tree(string name_,Member_Information s, Tree* left_=0, Tree* right_=0, Tree* father_=0, Tree* brother_=0) { name = name_; left = left_; right = right_; father = father_; brother = brother_; self = s; }; }; // fundamental operation // void Create_Tree(Tree* &tr, string name); Tree* Search(Tree *tr, string name); int Count_Generation_All(Tree* tr); // Insert // string Insert_Wife(Tree* &tr, string name, string husband); string Insert_Children(Tree* &tr, string name, string father); string Insert_Brother_Or_Sister(Tree* &tr, string name,string brother_sister); // add brief member informations or change informations // void Change_Information(Tree* tr); void Change_Name(Tree* &tr, string name, string new_name); void Change_Wives_Information(Tree* &tr, string name, string wife); void Change_Sex(Tree* &tr, string name, string sex ); void Change_IsLife(Tree* &tr, string name, bool islife); void Change_Fathername(Tree* &tr, string name, string father_name); void Change_Mothername(Tree* &tr, string name, string mother_name); void Change_Birth(Tree* &tr, string name, string date); void Change_Festa(Tree* &tr, string name, string date); void Change_VIP(Tree* &tr, string name); // Delete // string Divorce(Tree* &tr, string name, string husband); string Delete_Member(Tree* &tr, string name); void Delete_SubTree(Tree* &tr); // User Search (if user find someone and this person is VIP ,ask if there is need to print the VIP's information) // bool Search_Oneself(Tree* tr, string name); bool Search_One_Parents(Tree* tr, string name); bool Search_One_Children(Tree* tr, string name); bool Search_One_Wife(Tree* tr, string name); bool Search_One_Brother_And_Sister(Tree* tr, string name); int Count_Ones_Age(Tree* tr, string name); // Print // void Print_Information(Tree* tr); void Print_VIP_Information(Tree* tr); void Print_All(Tree* tr); void Print_MainMenu(); void Print_Add_Information_Menu();
一些測試: