數據結構-廣義表(GeneralizedList)實現

廣義表

  • 廣義表是非線性的數據結構,是線性表的一種推廣,由N個序列組成的有序序列;
  • 廣義表在表的描述中又得到了表,即允許表中有表,簡而言之,廣義表的定義是遞歸的。
廣義表的簡單表示:
(1)A=();
(2)B=(a,b);
(3)C=(c,(a,b));
(4)D=(d,(c,(a,b)));
示意圖:

代碼實現:
//GeneralizedList.h
#pragma once
#include <iostream>
#include <assert.h>
using namespace std;

enum Type
{
	HEAD_TYPE,
	VALUE_TYPE,
	SUB_TYPE,
};

struct GeneralizedNode
{
	Type _type;
	GeneralizedNode* _next;

	union
	{
		char _value;
		GeneralizedNode* _subLink;
	};

	GeneralizedNode(Type type = HEAD_TYPE, char value = 0)
		:_type(type)
		,_next(NULL)
	{
		if (_type == VALUE_TYPE)
		{
			_value = value;
		}
		else if (_type == SUB_TYPE)
		{
			_subLink = NULL;
		}
	}
};

class Generalized
{
	typedef GeneralizedNode Node;
public:
	Generalized()
		:_head(new Node(HEAD_TYPE))
	{}

	Generalized(const char* str)
	{
		_head = _CreateLized(str);
	}

	Generalized(const Generalized& g)
	{
		_head = _Copy(g._head);
	}

	//賦值運算符重載函數現代寫法
	Generalized& operator= (Generalized g)
	{
		swap(this->_head, g._head);
		return *this;
	}

	~Generalized()
	{
		_Destory(_head);
		_head = NULL;
	}

	//打印廣義表
	void Print()
	{
		_Print(_head);
		cout<<endl;
	}

	//求廣義表元素個數
	size_t Size()
	{
		return _Size(_head);
	}

	//求廣義表深度
	size_t Depth()
	{
		return _Depth(_head);
	}

protected:
	//對已有廣義表複製,便於實現拷貝構造函數和賦值運算符重載函數
	Node* _Copy(Node* head)
	{
		Node* newHead = new Node(HEAD_TYPE);
		assert(head->_type == HEAD_TYPE);

		Node* cur = head->_next;
		Node* newCur = newHead;

		while (cur)
		{
			if (cur->_type == VALUE_TYPE)
			{
				newCur->_next = new Node(VALUE_TYPE, cur->_value);
				newCur = newCur->_next;
			}
			else if (cur->_type == SUB_TYPE)
			{
				newCur->_next = new Node(SUB_TYPE);
				newCur = newCur->_next;

				newCur->_subLink = _Copy(cur->_subLink);
			}

			cur = cur->_next;
		}

		return newHead;
	}

	//對廣義表銷燬,便於完成析構函數
	void _Destory(Node* head)
	{
		Node* cur = head;
		while (cur)
		{
			Node*del = cur;
			cur = cur->_next;

			if (del->_type == SUB_TYPE)
			{
				_Destory(del->_subLink);
			}

			delete del;
		}
	}

	bool _IsValue(char ch)
	{
		if ((ch >= '0' && ch <= '9')
			|| (ch >= 'a' && ch <= 'z')
			|| (ch >= 'A' && ch <= 'Z'))
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	//創建廣義表(遞歸實現)
	Node* _CreateLized(const char* & str)
	{
		assert(str && *str == '(');
		++str;
		Node* head = new Node(HEAD_TYPE);
		Node* cur = head;

		while (*str)
		{
			if (_IsValue(*str))
			{
				cur->_next = new Node(VALUE_TYPE, *str);
				cur = cur->_next;
				++str;
			}
			else if (*str == '(')
			{
				cur->_next = new Node(SUB_TYPE);
				cur = cur->_next;
				cur->_subLink = _CreateLized(str);
			}
			else if (*str == ')')
			{
				++str;
				return head;
			}
			else
			{
				++str;
			}
		}
		
		assert(false);
		return head;
	}	

	void _Print( Node* head)
	{
		Node* cur = head;
		while(cur)
		{
			if (cur->_type == HEAD_TYPE)
			{
				cout<<"(";
			}
			else if (cur->_type == VALUE_TYPE)
			{
				cout<<cur->_value;
				if (cur->_next)
				{
					cout<<",";
				}
			}
			else
			{
				_Print(cur->_subLink);
				if (cur->_next)
				{
					cout<<",";
				}
			}

			cur = cur->_next;
		}

		cout<<")";
	}

	size_t _Size(Node* head)
	{
		size_t size = 0;
		Node* cur = head;
		while (cur)
		{
			if (cur->_type == VALUE_TYPE)
			{
				++size;
			}
			else if (cur->_type == SUB_TYPE)
			{
				size += _Size(cur->_subLink);
			}

			cur = cur->_next;
		}

		return size;
	}

	size_t _Depth(Node* head)
	{
		int depth = 1;
		Node* cur = head;
		while (cur)
		{
			if (cur->_type == SUB_TYPE)
			{
				int subDepth = _Depth(cur->_subLink);
				if (subDepth+1 > depth)
				{
					depth = subDepth+1;
				}
			}
			
			cur = cur->_next;
		}

		return depth;
	}
protected:
	Node* _head;
};
//test.cpp
#include "GeneralizedList.h"
void test()
{
	//Generalized g1("(a,b,(c,d),(e,(f),h))");
	Generalized g1("(a,b,(c,d))");
	cout<<"g1:";
	g1.Print();
	cout<<"g1 Of Size Is:"<<g1.Size()<<endl;
	cout<<"g1 Of Depth Is:"<<g1.Depth()<<endl;
	
	Generalized g2("(a,b,(c,d),(e,(f),h))");
	cout<<"g2:";
	g2.Print();
	cout<<"g2 Of Size Is:"<<g2.Size()<<endl;
	cout<<"g2 Of Depth Is:"<<g2.Depth()<<endl;

	Generalized g3(g2);
	cout<<"g3:";
	g3.Print();
	g2=g1;
	cout<<"g2:";
	g2.Print();
}

int main()
{
	test();
	getchar();
	return 0;
}

發佈了49 篇原創文章 · 獲贊 10 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章