其中包括广义表的创建、输出、拷贝构造、赋值运算符重载、析构、有效数据个数以及广义表深度
#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;
}