91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

GeneralList-廣義表

發布時間:2020-07-22 18:41:05 來源:網絡 閱讀:268 作者:LOVEMERIGHT 欄目:編程語言

GeneralList-廣義表:

廣義表是非線性的結構,是線性表的一種擴展,是有n個元素組成有限序列。

廣義表的定義是遞歸的,因為在表的描述中又得到了表,允許表中有表。

GeneralList-廣義表

廣義表結構

protected:
	GeneralizedNode* _head;

節點結構

struct GeneralizedNode
{
	GeneralizedNode(Type type=HEAD,char value=0)
		:_type(type)
		,_next(NULL)
	{
		if(_type==VALUE)
		{
			_value=value;
		}
		else if(_type==SUB)
		{
			_sublink=NULL;
		}
	}
	Type _type;
	GeneralizedNode* _next;

	union//聯合(共用體)
	{
		GeneralizedNode* _sublink;
		char _value;
	};
};

利用聯合來實現不同節點的成員不同

enum Type
{
	HEAD,
	VALUE,
	SUB,
};

構造函數:構造函數調用_CreateList函數

GeneralizedNode* _CreateList(const char*& str)//加引用避免子表遞歸返回時str跳到遞歸之前的位置
	{
		assert(str&&*str=='(');
		GeneralizedNode* head=new GeneralizedNode(HEAD);
		GeneralizedNode* cur = head;
		++str;
		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;
	}

析構函數:調用_Destroy

void _Destory(GeneralizedNode* head)
	{
		GeneralizedNode* cur=head;
		while(cur)
		{
			GeneralizedNode* del=cur;//記錄要刪除的節點
			if(cur->_type==SUB)
			{
				_Destory(cur->_sublink);//遞歸的條件:遇到SUB類型的節點
			}
			cur=cur->_next;
			delete del;
		}
	}

打印函數:調用_Print

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)//當前value節點后面不為空,打印逗號
				{
					cout<<",";
				}

			}
			else 
			{
				_Print(cur->_sublink);//遞歸的條件:遇到SUB類型的節點
				if(cur->_next)//子表遞歸返回時的next不為空
				{
					cout<<",";
				}
			}
			cur=cur->_next;
		}
		cout<<")";//表遍歷完成之后,打印表的后括號
	}

求廣義表的size:調用_Size

size_t _Size(GeneralizedNode* head)
	{
		GeneralizedNode* cur=head;
		size_t size=0;
		while(cur)
		{
			if(cur->_type==VALUE)//遇到value,size++
			{ 
				++size;
			}
			else if(cur->_type==SUB)
			{
				size+=_Size(cur->_sublink);//遞歸的條件:遇到SUB類型的節點
			}
			cur=cur->_next;
		}
		return size;
	}

求廣義表的深度:調用_Depth

size_t _Depth(GeneralizedNode* head)
	{
		size_t index=1;//廣義表為空時,深度為1
		GeneralizedNode* cur=head;
		while(cur)
		{
			if(cur->_type==SUB)
			{
				size_t subDepth=_Depth(cur->_sublink);//遞歸的條件:遇到SUB類型的節點
				if(subDepth+1>index)//更新深度
				{
					index=subDepth+1;
				}
			}
			cur=cur->_next;
		}
		return index;
	}

拷貝構造函數:調用_Copy

GeneralizedNode* _Copy(GeneralizedNode* head)
	{
		assert(head->_type==HEAD);//傳入的是頭結點才正確
		GeneralizedNode* newhead=new GeneralizedNode(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);//遞歸進入子表
				                                      //遞歸的條件:遇到SUB類型的節點
			}
			cur=cur->_next;
		}
		return newhead;
	}

賦值操作符的重載(采用現代寫法)

Generalized& operator=(Generalized g)//現代寫法
	{
		swap(_head,g._head);
		return *this;
	}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

镇巴县| 万全县| 喀喇沁旗| 深泽县| 星座| 蒲城县| 连州市| 镇江市| 穆棱市| 奎屯市| 康马县| 仙居县| 岚皋县| 寻乌县| 沙河市| 利津县| 武清区| 桓台县| 福贡县| 福鼎市| 金沙县| 郯城县| 贵阳市| 类乌齐县| 逊克县| 武川县| 宁海县| 明溪县| 桐城市| 池州市| 宁城县| 枣强县| 遵义县| 蒙山县| 莱阳市| 鹤庆县| 昌乐县| 临猗县| 南涧| 江北区| 承德县|