Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> С++ STL деревья, что тут не так? 
:(
    Опции темы
TRUE10
Дата 13.12.2006, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.12.2006

Репутация: нет
Всего: нет



Код

#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 
Что здесь не правильно??????  и вообще правильно ли я это делаю?
PM MAIL   Вверх
bsa
Дата 13.12.2006, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Ты б сначала описал проблему, как должно работать и как работает. А отлаживать за тебя твой код никто не будет.
PM   Вверх
OneFourth
Дата 14.12.2006, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 17.1.2006

Репутация: нет
Всего: нет



Да и код бы поменьше... Фрагментами... Локализируй проблему, что конкретно не работает... А то так получается выкинул прогу, а вы ищите, че тут не правильно smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0489 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.