您好,登錄后才能下訂單哦!
廣義表是我第一次用遞歸接觸鏈式的數據結構,其結構如下:
HEAD->VAL->VAL->LINK(->HEAD.....)->VAL->......
在這里,我們的頭結點與link節點是不存儲數據的,由此我們便可以定義出節點的數據結構:
typedef int DataType; enum NodeType//枚舉類型定義節點類型 { HEAD, VALUE, SUB, }; struct GeneralizedNode { public: GeneralizedNode() :_next(NULL) , _link(NULL) {} NodeType _type; GeneralizedNode* _next; union//因為link與value是不可能同時存在的,故用共同體節省空間 { GeneralizedNode* _link; DataType _value; }; };
因為廣義表是鏈式的嵌套結構,所以我們必須用遞歸來進行遍歷,這里面遞歸的方式有很多種,可以循環套遞歸,也可以遞歸套遞歸,也可以遞歸套循環,根據我們不同的需求,可以吧這三種方法都運用在合適的地方,這里,我簡單的實現了,返回對象的層數,數據個數,以及一些常用的成員函數,其代碼如下:
class Generalized { public: Generalized() :_head(NULL) {} Generalized(const char *str)//構造函數是用字符串來體現廣義表如(1,2,(2,3)) { //這樣可以更好的體現出廣義表的結構 _head = _CreatList(str); } ~Generalized() { _Destory(_head); } void Print()//控制臺打印廣義表,也是打印出字符串類型 { _Print(_head); } Generalized(const Generalized &g) { _head = _Copy(g._head); } Generalized&operator = (Generalized g) { swap(_head, g._head); return *this; } size_t Depth() { return _Depth(_head); } size_t Size() { size_t size = 0; _Size(_head, size); return size; } protected: size_t _Depth(GeneralizedNode* head) { size_t depth = 1; GeneralizedNode* cur = head; while (cur) { if (cur->_type == SUB) { size_t newdepth = _Depth(cur->_link) + 1; depth = depth < newdepth ? newdepth : depth; } cur = cur->_next; } return depth; } void _Size(GeneralizedNode* head, size_t &size) { GeneralizedNode* cur = head; while (cur) { if (cur->_type == VALUE) ++size; else if (cur->_type == SUB) _Size(cur->_link, size); cur = cur->_next; } } GeneralizedNode* _Copy(GeneralizedNode *head) { GeneralizedNode* cur = head; GeneralizedNode* newHead = new GeneralizedNode; GeneralizedNode*tail = newHead; tail->_type = HEAD; while (cur) { if (cur->_type == SUB) { tail->_next = new GeneralizedNode; tail = tail->_next; tail->_type = SUB; tail->_link = _Copy(cur->_link); } else if (cur->_type == VALUE) { tail->_next = new GeneralizedNode; tail = tail->_next; tail->_type = VALUE; tail->_value = cur->_value; } cur = cur->_next; } return newHead; } void _Print(GeneralizedNode* head) { GeneralizedNode* cur = head; while (cur) { if (cur->_type == HEAD) { cout << "("; } else if (cur->_type == VALUE) { cout << cur->_value; if (cur->_next!=NULL&& cur->_next->_type == VALUE) cout << ","; } else _Print(cur->_link); cur = cur->_next; } cout << ")"; } GeneralizedNode* _CreatList(const char* &str) { assert('(' == *str); GeneralizedNode* head = new GeneralizedNode; GeneralizedNode* cur = head; head->_type = HEAD; while (*++str) { if (IsValue(str)) { cur->_next = new GeneralizedNode; cur = cur->_next; cur->_type = VALUE; cur->_value = *str; str++; } else if (')' == *str) { return head; } else if ('(') { cur->_next = new GeneralizedNode; cur = cur->_next; cur->_type = SUB; cur->_link = _CreatList(str); } cur->_next = NULL; *str++; } return head; } bool IsValue(const char *str)//判斷表內存儲數據是否為所需數據類型 { if (*str <= '9'&& *str >= '0') return true; return false; } void _Destory(GeneralizedNode*head) { GeneralizedNode*cur = head; if (cur->_value == SUB) _Destory(cur->_link); else if (cur->_next != NULL) _Destory(cur->_next); delete cur; } protected: GeneralizedNode* _head; };
如有什么不足或疑問希望提出。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。