一个简单的树结构

 

#头文件

#lyftree.h


#ifndef __LYF_TREE_H__
#define __LYF_TREE_H__
namespace lyf
{
	struct pair
	{
		pair():first(NULL),second(NULL){}
		void* first;
		void* second;
	};

	typedef pair tnode[256];
	
	template<class T>
	class hashtree
	{
		public:
			hashtree():m_pHead(NULL){};
			~hashtree(){clear();}
		public:
			void insert(const char* ckey,T value )
			{
				const char* pkey = ckey;
				tnode* pNode = &m_pHead; 
				void** pvalue = NULL;
				void** pPreNode = NULL;
				while(*pkey++)
				{
					if( !pNode )
					{
						pNode = (tnode*)malloc(sizeof(tnode));
						*pPreNode = pNode;
					}
					pvalue = &((*pNode)[*pkey].second);
					pPreNode = &((*pNode)[*pkey].first);
					pNode = (tnode*)(*pPreNode);
				}
				if( pvalue )
				{
					if(*pvalue)
					{
						delete (T*)(*pvalue);
					}
					T* ptmp =  new T();
					*ptmp = value;
					*pvalue = ptmp;
				}
			}
			bool find(const char* ckey,T* value) 
			{
				const char* pkey = ckey;
				tnode* pNode = &m_pHead; 
				void** pvalue = NULL;
				while(*pkey++)
				{
					if( !pNode ) break;
					pvalue = &((*pNode)[*pkey].second);
					pNode = (tnode*)((*pNode)[*pkey].first);
				}
				if( pvalue )
				{
					if(*pvalue)
					{
						*value = *((T*)(*pvalue));
						return true;
					}
				}
				return false;
			}

			void clear()
			{
				clearNode( m_pHead );
			}
		private:
			void clearNode( tnode* pNode )
			{
				if( pNode )
				{
					for( int i = 0; i < 256; i++ )
					{
						tnode* pNext = (T*)((*pNode)[i].first);
						T* pvalue = (T*)((*pNode)[i].second);
						if(pvalue) delete pvalue;
						if(pNext) clearNode(pNext);
						free(pNext);
						(*pNode)[i].first = NULL;
						(*pNode)[i].second = NULL;
					}
				}
			}
		private:
			tnode m_pHead;
	};
}
#endif
 
 
#测试
#test.cpp
#include "lyftree.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
	lyf::hashtree<int> nTree;
	nTree.insert("test",100 );
	nTree.insert("1",200);
	nTree.insert("0909",300);

	int ntmp = 0;
	if( nTree.find("1",&ntmp ) )
	{
		cout << "find 1 :" << ntmp << endl;
	}

	string str1 = "liuyifeng";
	string str2 = "asioinfo";
	lyf::hashtree<string*> strTree;
	

	strTree.insert("1234",&str1 );
	strTree.insert("12345",&str2);

	string* pStr;
	if( strTree.find("12345",&pStr ) )
	{
		cout << "find 12345 :" << *pStr << endl;
	}

	return 1;
}


 


 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值