#头文件#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; }
一个简单的树结构
最新推荐文章于 2024-03-27 21:23:34 发布