廣義表的定義:
站在用戶的角度思考問題,與客戶深入溝通,找到扶綏網(wǎng)站設(shè)計與扶綏網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站建設(shè)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、空間域名、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋扶綏地區(qū)。廣義表是非線性的結(jié)構(gòu),是n個元素的有限序列。
舉例:A=(a,b,(c,d))
我們先定義它的結(jié)構(gòu):
(1)它有三種節(jié)點,頭節(jié)點、值節(jié)點、子表節(jié)點。
(2)兩種指向下一節(jié)點的指針:指向下一值值節(jié)點的指針_next,指向子表節(jié)點的指針_sublink.
enum Type//用枚舉形式來定義廣義表中三種節(jié)點類型 { HEAD, //頭類型 VALUE,//值類型 SUB,//子表類型 }; struct GeneralizedNode { Type _type;//類型 GeneralizedNode* _next;//指向下一節(jié)點的指針 union { int _value;//一個節(jié)點下一節(jié)點可能是值節(jié)點,也可能是子表節(jié)點 GeneralizedNode* _sublink; }; GeneralizedNode(Type type) :_next(NULL) , _type(type) {} GeneralizedNode(Type type,int value) :_next(NULL) , _type(type) , _value(value) {} };
下面,我們來看下實現(xiàn)的代碼:
class Generalized { public: Generalized() :_head(NULL) {} Generalized(const char* str) { _head = _CreateList(str);//調(diào)用函數(shù)創(chuàng)建節(jié)點 } Generalized(const Generalized& gr) { _head = _Copy(gr._head);//調(diào)用函數(shù)拷貝節(jié)點 } Generalized& operator=(const Generalized& gr) { if (&gr != this) { _Copy(gr._head); _Destroy(_head); } return *this; } ~Generalized() { _Destroy(_head); } void Print() { _Print(_head); } size_t Size() { return _Size(_head); } size_t Depth() { return _Depth(_head); } protected: //拷貝廣義表 GeneralizedNode* _Copy(GeneralizedNode* grhead) { GeneralizedNode* grcur = grhead; GeneralizedNode* newHead = new GeneralizedNode(HEAD); GeneralizedNode* newcur = newHead; while (grcur) { if (grcur->_type == VALUE) { GeneralizedNode* tmp = new GeneralizedNode(VALUE); newcur->_next = tmp; newcur = newcur->_next; newcur->_value = grcur->_value; } else if (grcur->_type == SUB) { GeneralizedNode* tmp = new GeneralizedNode(SUB); newcur->_next = tmp; newcur = newcur->_next; newcur->_sublink = _Copy(grcur->_sublink); } grcur = grcur->_next; } newcur = NULL; return newHead; } //釋放廣義表 void _Destroy(GeneralizedNode* head) { GeneralizedNode* cur = head; while (cur) { GeneralizedNode* del = cur; cur = cur->_next; if (del->_type == SUB) { _Destroy(del->_sublink); } else { delete del; del = NULL; } } } //打印 void _Print(GeneralizedNode* head) { GeneralizedNode* cur = head; while (cur) { if (cur->_type == HEAD) { cout << "("; } else if (cur->_type == VALUE) { cout << (char)(cur->_value); if (cur->_next) { cout << ","; } } else if (cur->_type == SUB) { _Print(cur->_sublink); if (cur->_next) { cout << ","; } } cur = cur->_next; } cout << ")"; } //判斷是否是值 bool _IsValue(const char* str) { if (*str > 0 && *str<9 || *str>'a' && *str<'z' || *str>'A' && *str < 'Z') { return true; } else { return false; } } //創(chuàng)建節(jié)點 GeneralizedNode* _CreateList(const char* str) { assert(*str=='('); ++str; GeneralizedNode* head = new GeneralizedNode(HEAD); GeneralizedNode* cur = head; while (cur) { if (_IsValue(str)) { cur->_next = new GeneralizedNode(VALUE,*str); cur = cur->_next; str++; } else if (*str == '(') { GeneralizedNode* SubNode = new GeneralizedNode(SUB); cur->_next = SubNode; cur = cur->_next; SubNode->_sublink = _CreateList(str); str++; } else if (*str == ')') { str++; return head; } else { str++; } } cout << "廣義表出錯!" << endl; assert(false); return head; } //大?。ㄖ倒?jié)點數(shù)) size_t _Size(GeneralizedNode* head) { GeneralizedNode* cur = head; size_t size = 0; while (cur) { if (cur->_type == VALUE) { size++; } else if (cur->_type == SUB) { size += _Size(cur->_sublink); } cur = cur->_next; } return size; } //深度 size_t _Depth(GeneralizedNode* head) { size_t depth = 1; GeneralizedNode* cur = head; while (cur) { if (cur->_type == SUB) { size_t curdepth = _Depth(cur->_sublink); if (curdepth + 1 > depth) { depth = curdepth + 1; } } cur = cur->_next; } return depth; } private: GeneralizedNode* _head; }; void Test() { Generalized gr1("()"); Generalized gr2("(a,b,(c,d))"); Generalized gr3("(a,b,(c,(d),e))"); Generalized gr4(gr3); gr1.Print(); cout << endl; gr2.Print(); cout << endl; gr3.Print(); cout << endl; gr4.Print(); cout << endl; size_t size = gr4.Size(); cout << "gr4大?。?<另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
文章題目:【數(shù)據(jù)結(jié)構(gòu)】廣義表的默認成員函數(shù)、深度、大小、打印-創(chuàng)新互聯(lián)
網(wǎng)頁網(wǎng)址:http://weahome.cn/article/dpjspg.html