广义表的C++简单实现
2016-06-03 13:15
417 查看
广义表是数据结构中非常关键的一部分,它的学习对于树和二叉树有很大的起承作用。那么,它是怎么实现的呢?广义表的实现应用到了一个很熟悉的算法——递归。来看看它的代码吧!#pragma once
#include<iostream>
#include<cassert>
using namespace std;
enum Type
{
HEAD,//头
VALUE, //值
SUB, //子表
};
struct GeneralizedNode
{
Type _type;
GeneralizedNode* _next;
union
{
char _value;
GeneralizedNode* _sublink;
};
GeneralizedNode(Type type=HEAD,char value=0)
:_type(type)
,_next(NULL)
{
if(_type==VALUE)
{
_value=value;
}
else if(_type==SUB)
{
_sublink=NULL;
}
}
};
class Generalized
{
public:
Generalized(const char* str)
:_head(NULL)
{
_head=_CreateList(str);
}
Generalized()
:_head(new GeneralizedNode())
{}
~ Generalized()
{
_Clear(_head);
_head=NULL;
}
size_t Depth() //深度
{
return _Depth(_head);
}
void Print()
{
_Print(_head);
cout<<endl;
}
size_t Size()
{
return _Size(_head);
}
Generalized(const Generalized &g)
{
_head=_Copy(g._head);
}
Generalized& operator=( Generalized g)
{
swap(this->_head,g._head);
return *this;
}
protected:
GeneralizedNode* _head;
GeneralizedNode* _CreateList(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=_CreateList(str);
}
else if(*str==')')
{
++str;
return head;
}
else
{
++str;
}
}
assert(false);
return head;
}
bool _Isvalue(char ch)
{
if( (ch>='0'&&ch<='9') || (ch>='a'&&ch<='z') || (ch>='A'&&ch<='z'))
{
return true;
}
else
{
return false;
}
}
/*int _Depth(GeneralizedNode* head)
{
GeneralizedNode* cur=head;
int max=0;
if(!cur)
{
return 1;
}
if(cur->_type==VALUE)
{
return 0;
}
for( max=0;cur;cur=cur->_next)
{
int dep=_Depth(cur->_next);
if(dep>max)
{
max=dep;
}
}
return max+1;
}*/
size_t _Depth(GeneralizedNode* head)
{
size_t dep=1;
GeneralizedNode* cur=head;
while(cur!=NULL)
{
if(cur->_type==SUB)
{
if(_Depth(cur->_sublink)+1> dep)
{
dep=_Depth(cur->_sublink)+1 ;
}
}
cur=cur->_next;
}
return dep;
}
void _Clear(GeneralizedNode* head)
{
GeneralizedNode* cur = head;
while(cur != NULL)
{
GeneralizedNode* del = cur;
cur = cur->_next;
if(del->_type == SUB)
{
_Clear(del->_sublink);
}
delete del;
}
}
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 size=0;
while(cur)
{
if(cur->_type==VALUE)
{
++size;
}
else if(cur->_type==SUB)
{
size+=_Size(cur->_sublink);
}
cur=cur->_next;
}
return size;
}
GeneralizedNode* _Copy(GeneralizedNode* head)
{
GeneralizedNode* newHead=new GeneralizedNode(HEAD);
assert(head->_type==HEAD);
GeneralizedNode* cur=head->_next;
GeneralizedNode* newcur=newHead;
while(cur)
{
if(cur->_type==VALUE)
{
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(cur->_sublink);
}
cur=cur->_next;
}
return newHead;
}
};代码虽然看起来很长,但是只要你理解了其结构,相信是不难的。
博主也是调试了好久的~~~~~~~~~~~~
本文出自 “七月朔风” 博客,请务必保留此出处http://luminous.blog.51cto.com/10797288/1765814
#include<iostream>
#include<cassert>
using namespace std;
enum Type
{
HEAD,//头
VALUE, //值
SUB, //子表
};
struct GeneralizedNode
{
Type _type;
GeneralizedNode* _next;
union
{
char _value;
GeneralizedNode* _sublink;
};
GeneralizedNode(Type type=HEAD,char value=0)
:_type(type)
,_next(NULL)
{
if(_type==VALUE)
{
_value=value;
}
else if(_type==SUB)
{
_sublink=NULL;
}
}
};
class Generalized
{
public:
Generalized(const char* str)
:_head(NULL)
{
_head=_CreateList(str);
}
Generalized()
:_head(new GeneralizedNode())
{}
~ Generalized()
{
_Clear(_head);
_head=NULL;
}
size_t Depth() //深度
{
return _Depth(_head);
}
void Print()
{
_Print(_head);
cout<<endl;
}
size_t Size()
{
return _Size(_head);
}
Generalized(const Generalized &g)
{
_head=_Copy(g._head);
}
Generalized& operator=( Generalized g)
{
swap(this->_head,g._head);
return *this;
}
protected:
GeneralizedNode* _head;
GeneralizedNode* _CreateList(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=_CreateList(str);
}
else if(*str==')')
{
++str;
return head;
}
else
{
++str;
}
}
assert(false);
return head;
}
bool _Isvalue(char ch)
{
if( (ch>='0'&&ch<='9') || (ch>='a'&&ch<='z') || (ch>='A'&&ch<='z'))
{
return true;
}
else
{
return false;
}
}
/*int _Depth(GeneralizedNode* head)
{
GeneralizedNode* cur=head;
int max=0;
if(!cur)
{
return 1;
}
if(cur->_type==VALUE)
{
return 0;
}
for( max=0;cur;cur=cur->_next)
{
int dep=_Depth(cur->_next);
if(dep>max)
{
max=dep;
}
}
return max+1;
}*/
size_t _Depth(GeneralizedNode* head)
{
size_t dep=1;
GeneralizedNode* cur=head;
while(cur!=NULL)
{
if(cur->_type==SUB)
{
if(_Depth(cur->_sublink)+1> dep)
{
dep=_Depth(cur->_sublink)+1 ;
}
}
cur=cur->_next;
}
return dep;
}
void _Clear(GeneralizedNode* head)
{
GeneralizedNode* cur = head;
while(cur != NULL)
{
GeneralizedNode* del = cur;
cur = cur->_next;
if(del->_type == SUB)
{
_Clear(del->_sublink);
}
delete del;
}
}
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 size=0;
while(cur)
{
if(cur->_type==VALUE)
{
++size;
}
else if(cur->_type==SUB)
{
size+=_Size(cur->_sublink);
}
cur=cur->_next;
}
return size;
}
GeneralizedNode* _Copy(GeneralizedNode* head)
{
GeneralizedNode* newHead=new GeneralizedNode(HEAD);
assert(head->_type==HEAD);
GeneralizedNode* cur=head->_next;
GeneralizedNode* newcur=newHead;
while(cur)
{
if(cur->_type==VALUE)
{
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(cur->_sublink);
}
cur=cur->_next;
}
return newHead;
}
};代码虽然看起来很长,但是只要你理解了其结构,相信是不难的。
博主也是调试了好久的~~~~~~~~~~~~
本文出自 “七月朔风” 博客,请务必保留此出处http://luminous.blog.51cto.com/10797288/1765814
相关文章推荐
- 应用栈求解迷宫问题(C++实现)
- C++实现单链表
- 利用C++类实现顺序表
- 利用C++日期类实现简单的日期计算器
- C++入门小程序练习
- c语言通用平台des加密算法
- iOS复习OC语言 NSString与NSArray 使用
- 简单总结C语言中的运算符优先级
- C语言运算符及其优先级汇总表口诀
- C语言运算符优先级列表(超详细)
- C++ STL 基础及应用(5) 字符串
- C语言的指针(进阶篇章之二)
- 非托管C++通过C++/CLI包装调用C# DLL
- C++面试笔记_1
- c语言 sqlite3数据库模块
- C++ 类的静态成员详细讲解
- 【C++错误检查】binary '>>' :
- c++ 修改内存
- c++ int to byte
- windows下C语言多线程编程