廣義表是什么?如何實現廣義表的遞歸?這篇文章運用了實例代碼展示,代碼非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
創新互聯公司2013年成立,是專業互聯網技術服務公司,擁有項目網站建設、成都做網站網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元峽江做網站,已為上家服務,為峽江各地企業和個人服務,聯系電話:13518219792廣義表的定義
廣義表是,是線性表的一種擴展,是有n個元素組成有限序列。
廣義表的定義是遞歸的,因為在表的描述中又得到了表,允許表中有表。
例如
<5> E = (((),())
廣義表的節點結構定義:
enum Type { HEAD,//頭結點 VALUE,//數據 SUB,//子表 }; //廣義表結構 struct GeneralizedNode { public: //無參構造函數 GeneralizedNode() :_type(HEAD) ,_next(NULL) {} //有參的構造函數 GeneralizedNode(Type type, char ch); public: Type _type; GeneralizedNode* _next; //因為節點類型不可能既是數據節點又是子表結點,所以采用聯合結構, //節省空間,便于管理。 union { char _value;//數據結點 GeneralizedNode* _subLink;//子表結點 }; }; //有參的構造函數 GeneralizedNode::GeneralizedNode(Type type, char ch = 0) :_type(type) , _next(NULL) { //數據節點則為數據初始化 if (_type == VALUE) { _value = ch; } //子表結點的初始化 else if (_type == SUB) { _subLink = NULL; } }
廣義表的定義:
注意:由于廣義表的采用的是用遞歸實現。但構造函數,等成員函數不能夠采用遞歸,而且在函數內部需要不斷的傳子表的head,對于成員函數直接使用成員變量_head,則無法遞歸下去。
//廣義表類 class Generalized { public: //無參構造函數 Generalized() :_head(new GeneralizedNode(HEAD)) {} //有參構造函數 Generalized(const char* str) :_head(NULL) { _head = CreateList(str); } //拷貝構造函數 Generalized(const Generalized& g) { _head=_CopyList(g._head); } GeneralizedNode* _CopyList(GeneralizedNode* head); //賦值運算符的重載 Generalized& operator=(Generalized g) { swap(_head, g._head); return *this; } //析構函數 ~Generalized() { _Delete(_head); } void _Delete(GeneralizedNode* head); public: //打印廣義表 void Print() { _Print(_head); } //求廣義表的大小 size_t Size() { return _Size(_head); } //求廣義表的深度 size_t Depth() { return _Depth(_head); } protected: //判斷數據是否有效 bool IsVaild(const char ch); //創建廣義表 GeneralizedNode* CreateList(const char* &str); void _Print(GeneralizedNode* head); size_t _Size(GeneralizedNode* head); size_t _Depth(GeneralizedNode* head); private: GeneralizedNode* _head; };
函數的實現
GeneralizedNode* Generalized::_CopyList(GeneralizedNode* head) { GeneralizedNode* cur = head;//需要拷貝的廣義表的當前節點 GeneralizedNode* _head = new GeneralizedNode();//拷貝廣義表的頭結點 GeneralizedNode* index = _head;//拷貝廣義表的當前節點 while (cur) { //數據結點 if (cur->_type == VALUE) { index->_next = new GeneralizedNode(VALUE, cur->_value); index = index->_next; } //子表結點,遞歸復制 else if (cur->_type == SUB) { GeneralizedNode*SubNode = new GeneralizedNode(SUB); index->_next = SubNode; SubNode->_subLink= _CopyList(cur->_subLink); index = index->_next; } cur = cur->_next; } return _head; } void Generalized::_Delete(GeneralizedNode* head) { GeneralizedNode* cur = head; while (cur) { GeneralizedNode* del = cur; //遞歸刪除子表 if (cur->_type == SUB) { _Delete(cur->_subLink); } cur = cur->_next; delete del; } } //判斷廣義表的數據是否合法 bool Generalized::IsVaild(const char ch) { if ((ch >= '0'&&ch <= '9') || (ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z')) { return true;//合法 } return false;//非法 } GeneralizedNode* Generalized::CreateList(const char* &str) { assert(str &&*str == '(');//斷言防止傳的廣義表格式不對,或者為空 str++;//跳過第一個( GeneralizedNode* head = new GeneralizedNode();//創建頭結點 GeneralizedNode* cur = head; while (*str) { if (IsVaild(*str)) { cur->_next = new GeneralizedNode(VALUE, *str); cur = cur->_next; str++; } else if (*str == '(')//新的子表 { GeneralizedNode* SubNode = new GeneralizedNode(SUB); SubNode->_subLink = CreateList(str); cur->_next = SubNode; cur = cur->_next; } else if (*str == ')')//廣義表結束 { str++;//返回之前需要給str++指向下一個 return head; } else//空格或者逗號 { str++; } } assert(false); return NULL; } void Generalized::_Print(GeneralizedNode* head) { GeneralizedNode* cur = head; if (cur == NULL) { cout << "()" << endl; return; } while (cur) { if (cur->_type == HEAD) { cout << "("; } else if (cur->_type == VALUE) { cout << cur->_value; //_value不是最后一個值 if (cur->_next) { cout << ","; } } else if (cur->_type == SUB) { _Print(cur->_subLink); if (cur->_next) { cout << ","; } } cur = cur->_next; } //輸出每個表最后一個( cout << ")"; } size_t Generalized::_Size(GeneralizedNode* head) { GeneralizedNode* cur = head; size_t count = 0; while (cur) { if (cur->_type == VALUE) { count++; } //遞歸求取子表的大小 if (cur->_type == SUB) { count = count + _Size(cur->_subLink); } cur = cur->_next; } return count; } size_t Generalized::_Depth(GeneralizedNode* head) { GeneralizedNode* cur = head; size_t depth = 1;//空表深度為1 while (cur) { if (cur->_type == SUB) { size_t newDepth = _Depth(cur->_subLink); //如果子表的深度+1大于當前廣義表的大深度,則更新廣義表的深度 if (newDepth +1 > depth) { depth = newDepth + 1; } } cur = cur->_next; } return depth; }
測試代碼
#include"Generalized.h" void TestGeneralized() { Generalized l("(a,b,(c,d),(e,(f),h))"); Generalized l1; l1 = l; l.Print(); cout << endl; cout << "size:" << l.Size() << endl; cout << "depth:" << l.Depth() << endl; l1.Print(); cout << endl; cout << "size:" << l1.Size() << endl; cout << "depth:" << l1.Depth() << endl; } int main() { TestGeneralized(); getchar(); return 0; }
測試結果
以上就是實現廣義表的遞歸的具體操作,代碼應該是足夠清楚的,而且我也相信有相當的一些例子可能是我們日常工作可能會見得到的。通過這篇文章,希望你能收獲更多。
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
新聞名稱:實現廣義表的遞歸-創新互聯
文章路徑:http://vcdvsql.cn/article4/hscoe.html
成都網站建設公司_創新互聯,為您提供定制開發、品牌網站制作、外貿網站建設、Google、服務器托管、網站制作
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯