码迷,mamicode.com
首页 > 其他好文 > 详细

广义表

时间:2016-03-06 17:41:06      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:广义表的实现

广义表是非线性的结构,是线性表的一种扩展,是有n个元素组成有限序列。

广义表的定义是递归的,因为在表的描述中又得到了表,允许表中有表。

eg:

<1> A = ()

<2> B = (a,b)

<3> C = (a,b,(c,d))

<4> D = (a,b,(c,d),(e,(f),h)) 

<5> E = (((),()))



#ifndef GENERALIZEDLIST__H_
#define GENERALIZEDLIST__H_
#include<iostream>
#include<ctype.h>
#include<assert.h>
using namespace std;
enum  NodeType
{
	HEAD,
	VALUE,
	SUB
};
struct GeneralizedNode
{
	NodeType _type;
	GeneralizedNode*  _next;
	union
	{
		char _value;
		GeneralizedNode* _subLink;
	};
	GeneralizedNode(NodeType type=HEAD,char value=0)
		:_type(type)
		,_next(NULL)
	{
		if(_type==VALUE)
			_value=value;
		else if(_type==SUB)
			_subLink=NULL;
	}
};
class  GeneralizedList
{
protected:
	GeneralizedNode* _head;
protected:
	bool _Valid(char c)
	{
		//isalpha()不是字母返回0,大写返回1,小写返回2
		//isdigit()为宏,不是函数,如果是阿拉伯数字返回true,否则返回NULL(0)
		if(0!=isalpha(c)||isdigit(c))
			return true;
		return false;
	}
	GeneralizedNode* _CreateList(const char*& str)
	{
		assert(*str==‘(‘);
		GeneralizedNode* head=new GeneralizedNode(HEAD);
		GeneralizedNode* cur=head;
		++str;
		while(*str!=‘\0‘)
		{
			if(*str==‘(‘)
			{
				GeneralizedNode* sub=new GeneralizedNode(SUB);
				cur->_next=sub;
				cur=cur->_next;
				cur->_subLink=_CreateList(str);
			}
			else if(*str==‘)‘)
			{
				++str;
				return head;
			}
			else  if(_Valid(*str))
			{
				GeneralizedNode* node=new GeneralizedNode(VALUE,*str);
				cur->_next=node;
				cur=cur->_next;
				++str;
			}
			else
			{
				++str;
			}
		}
		return head;
	}
	int _Size(GeneralizedNode*  g)
	{
		GeneralizedNode* cur=g;
		int size=0;
		while(cur)
		{
			if(cur->_type==VALUE)
				++size;
			else if(cur->_type==SUB)
				size+=_Size(cur->_subLink);
			cur=cur->_next;
		}
		return size;
	}
	void  _Display(GeneralizedNode* g)
	{
		GeneralizedNode* cur=g;
		while(cur)
		{
			if(cur->_type==HEAD)
				cout<<‘(‘;
			else if(cur->_type==VALUE)
			{
				cout << cur->_value;
				if (cur->_next)
					cout << ‘,‘;
			}
			else
			{
				_Display(cur->_subLink);
				if (cur->_next)
					cout << ‘,‘;
			}
			cur=cur->_next;
		}
		cout<<‘)‘;
	}
	//递归:在同一层次找出子表深度最大的
	int _Depth(GeneralizedNode* head)
	{
		int  depth = 1;
		GeneralizedNode* cur = head;
		while (cur)
		{
			if (cur->_type == SUB)
			{
				int  subDepth = _Depth(cur->_subLink);
				if (subDepth + 1 > depth)
					depth = subDepth + 1;
			}
			cur = cur->_next;
		}
		return depth;
	}
	void _Clear(GeneralizedNode* g)
	{
		GeneralizedNode* cur = g;
		while (cur)
		{
		   if (cur->_type == SUB)
				_Clear(cur->_subLink);
		   GeneralizedNode* del = cur;
			cur = cur->_next;
			delete del;
		}
	}
	GeneralizedNode* _Copy(GeneralizedNode* g)
	{
		GeneralizedNode* cur = g;
		GeneralizedNode* head =NULL;
		GeneralizedNode* newCur = head;
		while (cur)
		{
			if (cur->_type == HEAD)
			{
				head = new GeneralizedNode(HEAD);
				newCur = head;
			}
			else if (cur->_type == VALUE)
			{
				GeneralizedNode* node = new GeneralizedNode(VALUE, cur->_value);
				newCur->_next = node;
				newCur = newCur->_next;
				
			}
			else
			{
				newCur->_next = new GeneralizedNode(SUB);
				newCur = newCur->_next;
				newCur->_subLink = _Copy(cur->_subLink);
			}		
			cur = cur->_next;
		}
		return  head;
	}
public:
	GeneralizedList(const char* str)
		:_head(_CreateList(str))
	{}
	GeneralizedList(const GeneralizedList& g)
	{
		_head = _Copy(g._head);
	}
	GeneralizedList& operator=(GeneralizedList g)
	{
		swap(g._head, _head);
		return *this;
	}
	~GeneralizedList()
	{
		Clear();
		_head = NULL;
	}
	int Size()
	{
		return  _Size(_head);
	}
	int Depth()
	{
		return _Depth(_head);
	}
	void Clear()
	{
		_Clear(_head);
	}
	void  Print()
	{
		_Display(_head);
		cout<<endl;
	}
};
#endif
#include"GeneralizedList.h"
int main()
{
	char* str1 = "()";
	char* str2 = "(a,b)";
	char* str3 = "(a,b,(c,d))";
	char* str4 = "(a,b,(c,d),(e,(f),g))";
	GeneralizedList g1(str1);
	GeneralizedList g2(str2);
	GeneralizedList g3(str3);
	GeneralizedList g4(str4);
	g1.Print();
	g2.Print();
	g3.Print();
	g4.Print();
	cout << g1.Size() << " " << g2.Size() << " " << g3.Size() << " " << g4.Size() << endl;
	cout << g1.Depth() << " " << g2.Depth() << " " << g3.Depth() << " " << g4.Depth() << endl;
	GeneralizedList g5(g4);
	g5.Print();
	g5 = g2;
	g5.Print();
	system("pause");
	return 0;
}


本文出自 “小止” 博客,请务必保留此出处http://10541556.blog.51cto.com/10531556/1748094

广义表

标签:广义表的实现

原文地址:http://10541556.blog.51cto.com/10531556/1748094

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!