其中包括广义表的创建、输出、拷贝构造、赋值运算符重载、析构、有效数据个数以及广义表深度
#pragma once #include<iostream> #include<assert.h> #include<ctype.h> using namespace std; enum Type { HEAD, VALUE, SUB };//头结点、值、子表 struct GeneralizedNode { Type _type; //广义表结点类型 GeneralizedNode* _next; //广义表结点指针 union { int _value; //广义表结点存储的数据 GeneralizedNode* _subLink; //存储的指向子表的指针 }; GeneralizedNode(Type type = HEAD, int value = 0)//构造 :_type(type) , _next(NULL) { if (type == VALUE) { _value = value; } } }; class GeneralizedList { public: GeneralizedList() :_head(NULL) {} GeneralizedList(const char* str) //创建表 { _head = _CreateList(str); } //拷贝构造 GeneralizedList(const GeneralizedList& s) { _head = _copy(s._head); } //赋值运算符重载 GeneralizedNode* operator=(GeneralizedList s) { swap(_head, s._head); return _head; } //析构函数 ~GeneralizedList() { _Dele(_head); } void PrintList()//输出 { _PrintNode(_head); } size_t size() { size_t num = 0; _size(_head, num); return num; } size_t Depth() { return _depth(_head); } private: GeneralizedNode* _CreateList(const char*& str) { // GeneralizedList b2("(a,(b,c))"); assert('(' == *str); ++str; //跳过'(' GeneralizedNode* head = new GeneralizedNode(HEAD); GeneralizedNode* cur = head; //除数字字符与')'其他字符都不需要考虑,直接跳过就可以 while (')' != *str) { if ((*str >= '0'&&*str <= '9') || /*也可以使用数字字符判别函数 isdigit(*str)==-1*/ (*str >= 'a'&&*str <= 'z') || (*str >= 'A'&&*str <= 'Z')) { cur->_next = new GeneralizedNode(VALUE, *str++); cur = cur->_next; } else if ('(' == *str) { cur->_next = new GeneralizedNode(SUB, *str); cur->_next->_subLink = _CreateList(str); cur = cur->_next; } else { str++; } } str++;//跳过 ')' return head; } GeneralizedNode* _copy(GeneralizedNode* head) { GeneralizedNode* dst = new GeneralizedNode(HEAD); GeneralizedNode* cur = dst; if (head == NULL) return NULL; while (head != NULL) { if (head->_type == VALUE) { cur->_next = new GeneralizedNode(VALUE, head->_value); cur = cur->_next; } else if (head->_type == SUB) { cur->_next = new GeneralizedNode(SUB); cur->_next->_subLink = _copy(head->_subLink); cur = cur->_next; } head = head->_next; //cur->_next = new GeneralizedNode(VALUE, head->_value); } return dst; } void _PrintNode(GeneralizedNode* head) { // GeneralizedList b2("(a,(b,c))"); GeneralizedNode* tmp = head; while (tmp != NULL) { if (HEAD == tmp->_type) { cout << "("; tmp = tmp->_next; } else if (VALUE == tmp->_type) { cout << (char)tmp->_value; tmp = tmp->_next; if (tmp != NULL) { cout << ", "; } } else { _PrintNode(tmp->_subLink); if (tmp->_next != NULL) { cout << ", "; } tmp = tmp->_next; } } cout << ")"; } void _size(GeneralizedNode* head, size_t& size) { GeneralizedNode* tmp = head; while (tmp != NULL) { if (HEAD == tmp->_type) { tmp = tmp->_next; } else if (VALUE == tmp->_type) { ++size; tmp = tmp->_next; } else { _size(tmp->_subLink, size); tmp = tmp->_next; } } } size_t _depth(GeneralizedNode* head) { size_t depth = 1; size_t count = 0; GeneralizedNode* tmp = head; while (tmp != NULL) { if (SUB == tmp->_type) { size_t subdep = _depth(tmp->_subLink); if (subdep + 1 > depth) { depth = subdep + 1; } } tmp = tmp->_next; } return depth; } void _Dele(GeneralizedNode* head) { if (head == NULL) return; else if (head->_type == SUB) { _Dele(head->_subLink); _Dele(head->_next);//注意 在删除SUB结点后紧接着删除下一结点 //cout << "dele" << " "; delete head; } else { _Dele(head->_next); //cout << "dele" << " "; delete head; } } private: GeneralizedNode* _head; }; #include"GeneralizedList.h" void test() { GeneralizedList b1("(a,b)"); b1.PrintList(); cout << endl; GeneralizedList b2("(a,(b,c))"); b2.PrintList(); cout << endl; GeneralizedList b3("(a,(b,c),d)"); b3.PrintList(); cout << endl; GeneralizedList b4("(a,(b,c),(d,(e),f),(h,i))"); b4.PrintList(); cout << "\n" << endl; cout << "b1.size = " << b1.size() << endl; cout << "b2.size = " << b2.size() << endl; cout << "b3.size = " << b3.size() << endl; cout << "b4.size = " << b4.size() << endl; cout << "b1.Depth = " << b1.Depth() << endl; cout << "b2.Depth = " << b2.Depth() << endl; cout << "b3.Depth = " << b3.Depth() << endl; cout << "b4.Depth = " << b4.Depth() << endl; GeneralizedList b5("(a,(b,c),(h,i),(d,(e),f))"); cout << "b5.Depth = " << b5.Depth() << endl; GeneralizedList b6(b2); b6.PrintList(); cout << endl; GeneralizedList b7(b3); b7.PrintList(); GeneralizedList b8; b8 = b7; b8.PrintList(); b7.PrintList(); } int main() { test(); system("pause"); return 0; }