温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

【代码】C++实现广义表及其测试用例

发布时间:2020-07-20 07:38:16 来源:网络 阅读:360 作者:pawnsir 栏目:编程语言

    广义表是我第一次用递归接触链式的数据结构,其结构如下:

    HEAD->VAL->VAL->LINK(->HEAD.....)->VAL->......

    在这里,我们的头结点与link节点是不存储数据的,由此我们便可以定义出节点的数据结构:

typedef int DataType; enum NodeType//枚举类型定义节点类型 {	HEAD,	VALUE,	SUB, }; struct GeneralizedNode { public:	GeneralizedNode()	:_next(NULL)	, _link(NULL)	{}	NodeType _type;	GeneralizedNode* _next;	union//因为link与value是不可能同时存在的,故用共同体节省空间	{	GeneralizedNode* _link;	DataType _value;	}; };

    因为广义表是链式的嵌套结构,所以我们必须用递归来进行遍历,这里面递归的方式有很多种,可以循环套递归,也可以递归套递归,也可以递归套循环,根据我们不同的需求,可以吧这三种方法都运用在合适的地方,这里,我简单的实现了,返回对象的层数,数据个数,以及一些常用的成员函数,其代码如下:

class Generalized { public:	Generalized()	:_head(NULL)	{}	Generalized(const char *str)//构造函数是用字符串来体现广义表如(1,2,(2,3))	{                           //这样可以更好的体现出广义表的结构	_head = _CreatList(str);	}	~Generalized()	{	_Destory(_head);	}	void Print()//控制台打印广义表,也是打印出字符串类型	{	_Print(_head);	}	Generalized(const Generalized &g)	{	_head = _Copy(g._head);	}	Generalized&operator = (Generalized g)	{	swap(_head, g._head);	return *this;	}	size_t Depth()	{	return _Depth(_head);	}	size_t Size()	{	size_t size = 0;	_Size(_head, size);	return size;	} protected:	size_t _Depth(GeneralizedNode* head)	{	size_t depth = 1;	GeneralizedNode* cur = head;	while (cur)	{	if (cur->_type == SUB)	{	size_t newdepth = _Depth(cur->_link) + 1;	depth = depth < newdepth ? newdepth : depth;	}	cur = cur->_next;	}	return depth;	}	void _Size(GeneralizedNode* head, size_t &size)	{	GeneralizedNode* cur = head;	while (cur)	{	if (cur->_type == VALUE)	++size;	else if (cur->_type == SUB)	_Size(cur->_link, size);	cur = cur->_next;	}	}	GeneralizedNode* _Copy(GeneralizedNode *head)	{	GeneralizedNode* cur = head;	GeneralizedNode* newHead = new GeneralizedNode;	GeneralizedNode*tail = newHead;	tail->_type = HEAD;	while (cur)	{	if (cur->_type == SUB)	{	tail->_next = new GeneralizedNode;	tail = tail->_next;	tail->_type = SUB;	tail->_link = _Copy(cur->_link);	}	else if (cur->_type == VALUE)	{	tail->_next = new GeneralizedNode;	tail = tail->_next;	tail->_type = VALUE;	tail->_value = cur->_value;	}	cur = cur->_next;	}	return newHead;	}	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!=NULL&&	cur->_next->_type == VALUE)	cout << ",";	}	else	_Print(cur->_link);	cur = cur->_next;	}	cout << ")";	}	GeneralizedNode* _CreatList(const char* &str)	{	assert('(' == *str);	GeneralizedNode* head = new GeneralizedNode;	GeneralizedNode* cur = head;	head->_type = HEAD;	while (*++str)	{	if (IsValue(str))	{	cur->_next = new GeneralizedNode;	cur = cur->_next;	cur->_type = VALUE;	cur->_value = *str;	str++;	}	else if (')' == *str)	{	return head;	}	else if ('(')	{	cur->_next = new GeneralizedNode;	cur = cur->_next;	cur->_type = SUB;	cur->_link = _CreatList(str);	}	cur->_next = NULL;	*str++;	}	return head;	}	bool IsValue(const char *str)//判断表内存储数据是否为所需数据类型	{	if (*str <= '9'&&	*str >= '0')	return true;	return false;	}	void _Destory(GeneralizedNode*head)	{	GeneralizedNode*cur = head;	if (cur->_value == SUB)	_Destory(cur->_link);	else if (cur->_next != NULL)	_Destory(cur->_next);	delete cur;	} protected:	GeneralizedNode* _head; };

    如有什么不足或疑问希望提出。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI