Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > С++ STL деревья


Автор: TRUE10 13.12.2006, 01:17
Код

#include <conio.h> 

#include <set> 
#include <iostream> 
using namespace std; 
//////////////////////////////////////////////////////////////////////////// 
template<class ELEM_TYPE> 
class CTreeElem 
{ 
private: 
   ELEM_TYPE m_value; 
   set<CTreeElem *> m_children; 
public: 
   CTreeElem(ELEM_TYPE value): m_value(value) {} 
   ~CTreeElem() 
   { 
      for (set<CTreeElem *>::iterator iter = m_children.begin(); iter != m_children.end(); ++iter) 
      { 
         if (*iter) delete *iter; 
      } 
      m_children.clear(); 
   } 

   ELEM_TYPE get_value() const { return m_value; } 

   CTreeElem<ELEM_TYPE> *add_elem(CTreeElem<ELEM_TYPE> *parent, ELEM_TYPE elem_value) 
   { 
      if (parent == this) 
      { 
         CTreeElem<ELEM_TYPE> *new_elem = new CTreeElem<ELEM_TYPE>(elem_value); 
         m_children.insert(new_elem); 
         return new_elem; 
      } 
      set<CTreeElem *>::iterator iter_find = m_children.find(parent); 
      if (iter_find != m_children.end()) return (*iter_find)->add_elem(parent, elem_value); 
      CTreeElem<ELEM_TYPE> *new_elem(NULL); 
      for (set<CTreeElem *>::iterator iter = m_children.begin(); iter != m_children.end(); ++iter) 
      { 
         new_elem = (*iter)->add_elem(parent, elem_value); 
         if (new_elem != NULL) return new_elem; 
      } 
      return new_elem; 
   } 

   bool del_elem(ELEM_TYPE elem_value) 
   { 
      for (set<CTreeElem *>::iterator iter = m_children.begin(); iter != m_children.end(); ++iter) 
      { 
         if ((*iter)->get_value() == elem_value) 
         { 
            delete *iter; 
            m_children.erase(iter); 
            return true; 
         } 
         if ((*iter)->del_elem(elem_value)) return true; 
      } 
      return false; 
   } 

   friend ostream &operator<<(ostream &os, const CTreeElem<ELEM_TYPE> &tree_elem) 
   { 
      os<<tree_elem.m_value; 
      if (!tree_elem.m_children.empty()) 
      { 
         os<<"\n   |\n   "; 
         for (set<CTreeElem *>::const_iterator iter = tree_elem.m_children.begin(); iter != tree_elem.m_children.end(); ++iter) 
         { 
            os<<" "<<*(*iter); 
         } 
         os<<"   "<<endl; 
      } 
      return os; 
   } 
}; 
//////////////////////////////////////////////////////////////////////////// 
template<class ELEM_TYPE> 
class CTree 
{ 
private: 
   CTreeElem<ELEM_TYPE> *m_root; 
public: 
   CTree(): m_root(NULL) {} 
   ~CTree() 
   { 
      if (m_root) delete m_root; 
   } 

   CTreeElem<ELEM_TYPE> *add_elem(CTreeElem<ELEM_TYPE> *parent, ELEM_TYPE elem_value) 
   { 
      if (!m_root) 
      { 
         m_root = new CTreeElem<ELEM_TYPE>(elem_value); 
         return m_root; 
      } else 
      { 
         if (parent == NULL) return NULL; 
         return m_root->add_elem(parent, elem_value); 
      } 
   } 

   bool del_elem(ELEM_TYPE elem_value) 
   { 
      if (!m_root) return false; 
      if (m_root->get_value() == elem_value) 
      { 
         delete m_root; 
         m_root = NULL; 
         return true; 
      } 
      return m_root->del_elem(elem_value); 
   } 

   friend ostream &operator<<(ostream &os, const CTree<ELEM_TYPE> &tree) 
   { 
      if (!tree.m_root) return os<<"empty tree"<<endl; 
      else return os<<*(tree.m_root); 
   } 
}; 
//////////////////////////////////////////////////////////////////////////// 
int main() 
{ 
   CTree<int> tree; 

   CTreeElem<int> *root_elem = tree.add_elem(NULL, 0); 
   CTreeElem<int> *first_elem = tree.add_elem(root_elem, 1); 
   CTreeElem<int> *second_elem = NULL; 
   for (int i = 10; i < 13; ++i) 
   { 
      second_elem = tree.add_elem(first_elem, i); 
   } 

   first_elem = tree.add_elem(root_elem, 2); 
   for (int i = 20; i < 25; ++i) 
   { 
      second_elem = tree.add_elem(first_elem, i); 
   } 
   for (int i = 200; i < 207; ++i) 
   { 
      tree.add_elem(second_elem, i); 
   } 

   first_elem = tree.add_elem(root_elem, 3); 
   for (int i = 30; i < 40; ++i) 
   { 
      second_elem = tree.add_elem(first_elem, i); 
   } 
    
   cout<<tree<<endl; 

    
   cout<<"del element 204: "<<tree.del_elem(204)<<endl; 
   cout<<tree<<endl; 

   cout<<"\n\ndel element 3: "<<tree.del_elem(3)<<endl; 
   cout<<tree<<endl; 

   cout<<"\n\ndel element 555: "<<tree.del_elem(555)<<endl; 
   cout<<tree<<endl; 

   cout<<"\n\ndel root: "<<tree.del_elem(0)<<endl; 
   cout<<tree<<endl; 
    
   cout<<"\n\nThe end!"<<endl; 
   getch(); 
   return 0; 
} 
////////////////////////////////////////////////////////////////////////////



Добавлено @ 01:18 
Что здесь не правильно??????  и вообще правильно ли я это делаю?

Автор: bsa 13.12.2006, 11:43
Ты б сначала описал проблему, как должно работать и как работает. А отлаживать за тебя твой код никто не будет.

Автор: OneFourth 14.12.2006, 13:49
Да и код бы поменьше... Фрагментами... Локализируй проблему, что конкретно не работает... А то так получается выкинул прогу, а вы ищите, че тут не правильно smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)