//广义表

//广义表
template< class _ID_TYPE,  class _V_TYPE>
class CLK_General_Map
{
public:
	typedef vector< _V_TYPE >						Map_Items_Type;
	typedef map< _ID_TYPE, Map_Items_Type* >		General_Map_Type;

	class Items
	{
	public:
		Items(General_Map_Type* _p_general_map,  _ID_TYPE _ID):m_p_general_map(_p_general_map), m_ID(_ID){}
		bool is_exist()
		{
			if( 0 == (*m_p_general_map)[m_ID])
				return false;
			return true;
		}
		bool push(_V_TYPE _val)
		{
			if( 0 == (*m_p_general_map)[m_ID])
			{
				Map_Items_Type* pItems = new Map_Items_Type();
				(*m_p_general_map)[m_ID] = pItems;
			}
			_V_TYPE pItem = get_item(_val);
			if( NULL == pItem)
			{
				(*m_p_general_map)[m_ID]->push_back(_val);
				return true;
			}
			else
			{
				return false;
			}
		}

		_V_TYPE get_item(_V_TYPE _val)
		{
			if( 0 != (*m_p_general_map)[m_ID])
			{
				Map_Items_Type* pItems = (*m_p_general_map)[m_ID];
				Map_Items_Type::iterator pIt = find(pItems->begin(), pItems->end(), _val);
				if( pIt != pItems->end())
					return *pIt;
			}
			return NULL;
		}

		void remove(_V_TYPE _val)
		{
			if( 0 != (*m_p_general_map)[m_ID])
			{
				Map_Items_Type* pItems = (*m_p_general_map)[m_ID];
				Map_Items_Type::iterator it = find(pItems->begin(),pItems->end(),_val);
				pItems->erase(it);
			}
		}

		vector< _V_TYPE >* get_set()
		{
			return (*m_p_general_map)[m_ID];
		}

		void erase()
		{
			if( 0 != (*m_p_general_map)[m_ID])
			{
				Map_Items_Type* pItems = (*m_p_general_map)[m_ID];
				pItems->clear();
				delete pItems;
				pItems = NULL;
				(*m_p_general_map)[m_ID] = NULL;
				(*m_p_general_map).erase(m_ID);
			}
		}

	private:
		General_Map_Type* m_p_general_map;
		_ID_TYPE m_ID; 
	};


	Items get_manager(_ID_TYPE _ID)
	{
		Items it(&m_general_map, _ID);
		return it;
	}

	void clear()
	{
		General_Map_Type::iterator it = m_general_map.begin();
		while(it != m_general_map.end())
		{
			get_manager(it->first).erase();
			it = m_general_map.begin();
		}
	}

	size_t get_all_size()
	{
		struct MapCount
		{
			MapCount():m_count(0){}
			void operator()(pair<_ID_TYPE, Map_Items_Type*> _items){ m_count += _items.second->size(); }
			int m_count;
		};
		MapCount map_count = for_each(m_general_map.begin(),m_general_map.end(),MapCount());
		return map_count.m_count;
	}


private:
	General_Map_Type m_general_map;
};

#include <stdio.h> #include <malloc.h> typedef char ElemType; typedef struct lnode { int tag; // 节点类型标识(0:原子,1:子) union { ElemType data; // 原子节点存储数据 struct lnode *sublist; //节点指向子头 } val; struct lnode *link; // 指向下一个兄弟节点 } GLNode; // 广义节点类型声明 // 由括号示法字符串s创建广义链式存储结构 GLNode *CreateGL(char *&s) { GLNode *g; char ch = *s++; // 读取当前字符并移动指针 if (ch == '\0') // 字符串结束,返回空 return NULL; g = (GLNode *)malloc(sizeof(GLNode)); // 创建新节点 if (ch == '(') // 遇到左括号,当前节点为子头 { g->tag = 1; g->val.sublist = CreateGL(s); // 递归构造子 } else if (ch == ')') // 遇到右括号,当前节点无效(释放并返回空) { free(g); return NULL; } else if (ch == '#') // 遇到#,示空(子类型) { g->tag = 1; g->val.sublist = NULL; } else // 原子字符,当前节点为原子节点 { g->tag = 0; g->val.data = ch; } // 处理兄弟节点:读取下一个字符判断是否为逗号 ch = *s++; if (g != NULL) { if (ch == ',') // 有兄弟节点,递归创建 g->link = CreateGL(s); else // 无兄弟节点,指针置空 g->link = NULL; } return g; // 返回当前节点 } //广义g的长度(顶层元素个数) int GLLength(GLNode *g) { int n = 0; g = g->val.sublist; // 指向广义第一个元素 while (g != NULL) { n++; g = g->link; // 遍历所有兄弟节点 } return n; } //广义g的深度 int GLDepth(GLNode *g) { int max = 0, dep; if (g->tag == 0) // 原子节点深度为0 return 0; g = g->val.sublist; // 指向第一个元素 if (g == NULL) //深度为1 return 1; while (g != NULL) // 遍历所有元素 { if (g->tag == 1) // 元素为子,递归求深度 { dep = GLDepth(g); if (dep > max) // 更新最大深度 max = dep; } g = g->link; // 遍历下一个兄弟元素 } return max + 1; // 的深度 = 最大子深度 + 1 } // 输出广义g void DispGL(GLNode *g) { if (g != NULL) { if (g->tag == 0) // 原子节点,直接输出数据 printf("%c", g->val.data); else //节点,输出括号并递归输出子 { printf("("); if (g->val.sublist == NULL) //输出# printf("#"); else DispGL(g->val.sublist); printf(")"); } if (g->link != NULL) // 有兄弟节点,输出逗号并递归输出 { printf(","); DispGL(g->link); } } } //广义g中最大原子(字符ASCII值最大) ElemType maxatom(GLNode *g) { ElemType max1, max2; if (g != NULL) { if (g->tag == 0) // 原子节点,比较当前原子与兄弟节点最大原子 { max1 = maxatom(g->link); return (g->val.data > max1) ? g->val.data : max1; } else //节点,比较子最大原子与兄弟节点最大原子 { max1 = maxatom(g->val.sublist); max2 = maxatom(g->link); return (max1 > max2) ? max1 : max2; } } else // 空节点返回最小ASCII值(不影响比较) return 0; } // 销毁广义g(释放所有节点空间) void DestroyGL(GLNode *&g) { GLNode *g1, *g2; g1 = g->val.sublist; // 指向第一个元素 while (g1 != NULL) { if (g1->tag == 0) // 原子节点,直接释放 { g2 = g1->link; free(g1); g1 = g2; } else //节点,递归销毁子后释放 { g2 = g1->link; DestroyGL(g1); g1 = g2; } } free(g); // 释放头节点 g = NULL; // 置空避免野指针 } int main() { GLNode *g; // 目标广义字符串(无多余括号,严格匹配预期输出) char *str = "(b,(b,a,(#),d),((a,b),c,((#))))"; g = CreateGL(str); printf("广义g:"); DispGL(g); printf("\n"); printf("广义g的长度:%d\n", GLLength(g)); printf("广义g的深度:%d\n", GLDepth(g)); printf("最大原子:%c\n", maxatom(g)); DestroyGL(g); // 销毁广义,释放内存 return 1; }怎么修改这段代码是他输出的广义为(b,(b,a,(#),d),((a,b),c,((#))))
最新发布
11-07
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值