标签:广义表
什么是广义表呢?
广义表是非线性的结构,是线性表的一种扩展,是有n个元素组成有限序列。
广义表的定义是递归的,因为在表的描述中又得到了表,允许表中有表。
如:
<1> A = ()
<2> B = (a,b)
<3> C = (a,b,(c,d))
<4> D = (a,b,(c,d),(e,(f),h))
在广义表节点时,应注意一下几点:
(1)由图看出,节点存在三种类型。头,值,子表。
(2)指向下一个节点的指针。
(3)因广义表中允许表中有表。需要一个指向子表的指针。
//节点结构
enum Type
{
HEAD,//广义表表头
VALUE,//值
SUB,//子表
};
class GeneralizedNode//节点
{
public:
GeneralizedNode(Type type = HEAD,char value = 0)
:_type(type)
,_next(NULL)
{
if(type == VALUE)
{
_value = value;
}
if(type == SUB)//子表初始化
{
_subLink = NULL;
}
}
public:
Type _type;//类型
GeneralizedNode* _next;//指向下一个节点
union
{
char _value;//节点值
GeneralizedNode* _subLink;//指向子表的头
};
};在定义广义表之前,先来了解一下关于广义表的几个概念:
(1)广义表的节点的个数:广义表中所有节点的个数(包括子表节点)。
(2)广义表的长度:只看表层。
(3)广义表的深度:子表中深度最大的一个。
如: C = (a,b,(c,d)) 长度为3,深度为2
D = (a,b,(c,d),(e,(f),h)) 长度为4,深度为3
//广义表
class Generalized
{
public:
Generalized()//无参构造函数
:_head(new GeneralizedNode(HEAD))
{}
public:
bool IsValue(char ch)//判断是否为有效字符
{
if((ch>=‘0‘)&&(ch<=‘9‘)||((ch>=‘a‘)&&(ch<=‘z‘))||((ch>=‘A‘)&&(ch<=‘Z‘)))
{
return true;
}
return false;
}
public:
GeneralizedNode* _Generalized(const char* &str)
{
assert(str && *str == ‘(‘);
str++;
GeneralizedNode* head = new GeneralizedNode(HEAD);//创建头
GeneralizedNode* cur = head;
while(*str)
{
if(IsValue(*str))
{
cur->_next = new GeneralizedNode(VALUE,*str);
cur = cur->_next;
str++;
}
else if(*str == ‘(‘)
{
cur->_next = new GeneralizedNode(SUB);
cur = cur->_next;
cur->_subLink = _Generalized(str);//遇到子表递归
}
else if(*str == ‘)‘)//递归终止条件
{
str++;
return head;
}
else
{
str++;
}
}
assert(false);//强制判断
return head;
}
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)
{
cout<<",";
}
}
else
{
_Print(cur->_subLink);//遇到子表递归
if(cur->_next)
{
cout<<",";
}
}
cur = cur->_next;
}
cout<<")";
}
size_t _Size(GeneralizedNode* head)//节点的个数
{
GeneralizedNode* cur = head;
size_t count = 0;
while(cur)
{
if(cur->_type == VALUE)
{
count++;
}
else if(cur->_type == SUB) //子表递归
{
count = count + _Size(cur->_subLink);//所有节点的个数
}
cur = cur->_next;
}
return count;
}
size_t _Length(GeneralizedNode* head)//长度,只看表层,子表长度为1,元素长度为1
{
GeneralizedNode* cur = head;
size_t len = 0;
if(head == NULL)
return 0;
while(cur)
{
if(cur->_type == VALUE)
{
len++;
}
else if(cur->_type == SUB)
{
len++;
}
cur = cur->_next;
}
return len;
}
size_t _Depth(GeneralizedNode* head)//深度 需要对每个子表求深度,找最大的
{
GeneralizedNode* cur = head;
size_t depth = 0;
size_t max = 0;
while(cur)
{
if(cur->_type == SUB)
{
depth = _Depth(cur->_subLink);//子表递归
if(depth > max)//大于目前最大,更换
{
max = depth;
}
}
cur = cur->_next;
}
return max+1;
}
void _Destory(GeneralizedNode* head)
{
GeneralizedNode* cur = head;
while(cur)
{
GeneralizedNode* del = cur;
cur = cur->_next;
if(cur->_type == SUB)
{
_Destory(cur->_subLink);
}
delete del;
}
}
GeneralizedNode* _Copy(GeneralizedNode* head)//拷贝构造
{
GeneralizedNode* cur = head->_next;
GeneralizedNode* newHead = new Generalized(HEAD);
while(cur)
{
if(cur->_type == VALUE)//若为值,连接在新表头的后边
{
GeneralizedNode* newCur = newHead;
newCur->_next = new GeneralizedNode(VALUE,cur->_value);
newCur = newCur->_next;
}
else if(cur->_type == SUB)//若为子表
{
newCur->_next = new GeneralizedNode(SUB);
newCur = newCur->_next;
newCur->_subLink = _Copy(newCur->_subLink);//递归
}
cur = cur->_next;
}
return newHead;
}
public:
~Generalized()//析构函数
{
_Destory(_head);
_head = NULL;
}
Generalized(const Generalized& g)
{
_head = _Copy(g._head);
}
Generalized& operator=(const Generalized& g)
{
if(this != &g)//是否自复制
{
_Destory(_head);//释放原来的空间
_head = _Copy(g._head);
}
return *this;
}
//由于上述的赋值函数可能会不成功,所以先开辟空间保存
Generalized& operator=(const Generalized& g)
{
if(this != &g)
{
GeneralizedNode* tmp = _Copy(g._head);
_Destory(_head);
_head = tmp;
}
return *this;
}
//现代写法
Generalized& operator=(const Generalized g)//出了作用域后,g自动销毁
{
swap(_head,g._head);
return *this;
}
public:
Generalized(const char* str)//以链表形式存储
{
_head = _Generalized(str);
}
void Print()//打印
{
_Print(_head);
cout<<endl;
}
size_t Size()//节点个数
{
return _Size(_head);
}
size_t Length()//表的长度
{
return _Length(_head);
}
size_t Depth()
{
return _Depth(_head);
}
protected:
GeneralizedNode* _head;
};测试函数:
void Test()
{
Generalized g1("(a,b,(e,f),(c,d))");
Generalized g2("(a,b,(c,d))");
Generalized g3("(a,b,(c,d),(e,(f),h))");
g2.Print();
size_t ret1 = g2.Size();
size_t ret2 = g1.Length();
size_t ret3 = g3.Depth();
cout<<ret1<<endl;
cout<<ret2<<endl;
cout<<ret3<<endl;
}测试结果:
本文出自 “一起去看星星” 博客,转载请与作者联系!
标签:广义表
原文地址:http://10810429.blog.51cto.com/10800429/1765658