亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

【代碼】C++實現廣義表及其測試用例

發布時間:2020-07-20 07:38:16 來源:網絡 閱讀:315 作者: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

巴青县| 通化县| 眉山市| 山东| 佛冈县| 门头沟区| 永新县| 泸溪县| 巴南区| 阳城县| 饶河县| 丹东市| 府谷县| 奉节县| 柘城县| 霍山县| 河北区| 博兴县| 甘肃省| 武冈市| 同仁县| 亳州市| 英山县| 龙陵县| 和林格尔县| 龙口市| 阳江市| 永州市| 郓城县| 于都县| 东乌珠穆沁旗| 织金县| 麦盖提县| 邢台市| 花莲县| 竹北市| 望谟县| 辰溪县| 农安县| 开阳县| 临清市|