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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CTree 
:(
    Опции темы
_Ghost_
Дата 6.12.2010, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день.
есть класс CTree. помогите пожалуйста понять как исползовать этот класс. т.е. как создать дерево как добовлять,удалвть и все методы класса.


не получилось поправить фонты.
я прекрипил класс в тхт документе.

п.с пожалуйста ногами не бить . просто пожалуйста покажите. 

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  ctree.txt 17,40 Kb
PM MAIL   Вверх
Cheloveck
Дата 6.12.2010, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

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



_Ghost_, колись, как умудрился записать cp-1251 c 2-мя байтами на символ?
PS файл нечитабельный (только у меня?)


--------------------
user posted image
PM Jabber   Вверх
bsa
Дата 6.12.2010, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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




 ! 
bsa
_Ghost_, пользуйся кнопкой "Код".

PM   Вверх
_Ghost_
Дата 6.12.2010, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



bsa а почму тема перемешена ?

Добавлено через 6 минут и 22 секунды
вот класс
Код

#if !defined __CTREE__INCLUDED__
#define __CTREE__INCLUDED__

#include <cstdio>
#include <iostream>
#include <vector>


template <typename T>
struct STreeNode
{
    //! ветки дерева
        
    std::vector<STreeNode<T> *> ChildNodes; //!ветки дерева     
                    
    STreeNode * BackNode; //! предеыдыший узел 
    T data;               //! данные на ткушей позиции (операция либо значене х)
                     
    //!вес точки дерева 

    //!уникальное число точки древа 
    //  данное число будет генерироватся от 0 до количеста узлов в дереве с шагом 1    
    //! по этому весу можно  будет добратся с помошью метода MoveToNode    
    int weight;
};
static int cur_w = -1;
static int am_w = 0;
// класс дерево
//! first - первоая опорная точка дерева  всегда содержит в себе начало дерева
//! node - всегда текуший ызел дерева но не первый узел дерева
 
template <typename T>
class CTree
{
    typedef STreeNode<T> * st_node;
private:
    //! узлы дерева
        
    st_node node; //! дерево
    //! стартовая часть древа ,самая верхняя точка дерева
         
    st_node first;
    //! 1 = ïóñòîé, 0 = непустой
    int is_empty;
    //! Выгручить дерево из памяти 
    void Clear(STreeNode<T> * n);
    //! текушяя глуина
    int cur_depth;
public:
    
    CTree();
    ~CTree();
    void Destroy();
    void ForceDestroy();

    

    //функция создает самый первый узел ,эта функция должна вызыватся самой первой
    void CreateMainNode(T data);


    void push_node(T data);


    //добавить ответвление от текушей  точки 
    void push_node(STreeNode<T> *&n, T data);

    
    перемешает теку. курсор на данный узел 
    //! n - откуда искать
    //! r - результат
    //! num_node - с каким весом искать
    void MoveToNode(STreeNode<T> *n, STreeNode<T> *&r,int num_node);
    //! перемешает  на текуший узел
    void MoveToNode(int num_node);


    функция возвр. количество весов в дереве
    int getAmountWeights()
    {
        ClearGeneratorWeights();
        GenerateWeights(first, 0);
        return am_w;
    }



    функция должна вызывать после окончателного создания дерева гля установки его весов если эта функция не будет вызванна то в генерическом классе произаидет ошибка в вычисление    
    void GenerateWeights(STreeNode<T> *n, int cur_weight);

    //! очистиь генератор весов
    //! должен вызуватся перед  функцией  void GenerateWeights(STreeNode<T> *n, int cur_weight);
    void ClearGeneratorWeights();


    функция  возврошает ветку дерева исходя из текушей позиции
    //! flag параметр устанавливает какую ветку необходимо возвратит  правую или левую
        
//    STreeNode<T> * getBranch(branch_type &flag);

    //! поменять две ветки местами
    void ChangeBranch(STreeNode<T> *&n1, STreeNode<T> *&n2);
    
    void Display(STreeNode<T> *n);
    void SelfDisplay();


    копирует алготитм из дерева в текстовый массив
    void getAlgFromTree(STreeNode<T> *n, std::vector<T> &arr);

    
    //! шаг назат
    void StepBack();

    
    bool Empty(){return is_empty;}


    возврошает указатель на текишую позицию дерева
    STreeNode<T> * &getCurentNode(){return node;}
    STreeNode<T> * getFirstNode()const{return first;}
    //! возврошает количество веток у текушего узла
    
    int getAmountBranch()const{return node->ChildNodes.size();}
    int getCurentDepth()const{return cur_depth;}
    void ToBegin(){node = first; cur_depth = 1;}
};


template <typename T>
CTree<T>::CTree(void): node(0), is_empty(1), cur_depth(0)
{
}//! end of Constructor

//! удалить
template <typename T>
void CTree<T>::Clear(STreeNode<T> * n)
{
    if(!n)
        return;
    if(n->ChildNodes.size() != 0)
    {
        std::vector<STreeNode<T> *>::iterator It_Node = n->ChildNodes.begin();
        while(It_Node != n->ChildNodes.end())
        {
            Clear(*It_Node);
            ++It_Node;
        }//! end of while
    }//! end of if
    printf("\nNode of tree is removed... id node: %c, number of segment node: %d", n->data, n->weight);
    delete n;
    n = 0;
    am_w = 0;
    cur_w = -1;
}
//! удалить упрошенны вариант
template <typename T>
void CTree<T>::Destroy()
{
    this->Clear(this->first);
    is_empty = 1;
    cur_depth = 0;
}
//! удалить
template <typename T>
void CTree<T>::ForceDestroy()
{
    is_empty = 0;
    this->Clear(this->first);
    is_empty = 1;
    cur_depth = 0;
}

template <typename T>
void CTree<T>::CreateMainNode(T data)
{
    if(!is_empty)
    {
        printf("Error: A tree is already created!!!");
        return;
    }//! end of if
    is_empty = false; //! дерево не пустое
    STreeNode<T> * new_node = new STreeNode<T>();//! делаем нулевой узел

    new_node->data = data;
    new_node->BackNode = 0; 
    new_node->weight = 0;
    first = node = new_node;
    ++cur_depth;
}

template <typename T>
void CTree<T>::GenerateWeights(STreeNode<T> *n, int cur_weight)
{
    if(!n)
        return;
    cur_w += 1;
    am_w += 1;
    n->weight = cur_w;
    if(n->ChildNodes.size() != 0)
    {
        std::vector<STreeNode<T> *>::iterator It_Node = n->ChildNodes.begin();
        while(It_Node != n->ChildNodes.end())
        {
            GenerateWeights(*It_Node, cur_weight);
            ++It_Node;
        }//! end of while
    }//! end of if
}

template <typename T>
void CTree<T>::ClearGeneratorWeights()
{
    cur_w = -1;
    am_w = 0;
}

template <typename T>
void CTree<T>::MoveToNode(STreeNode<T> *n, STreeNode<T> *&r,int num_node)
{
    if(!n)
        return;
    if(n->weight == num_node)
    {
        r = n;
        return;
    }//! end of if
    if(n->ChildNodes.size() != 0)
    {
        std::vector<STreeNode<T> *>::iterator It_Node = n->ChildNodes.begin();
        while(It_Node != n->ChildNodes.end())
        {
            MoveToNode(*It_Node, r, num_node);
            ++It_Node;
        }//! end of while
    }//! end of if
}

template <typename T>
void CTree<T>::MoveToNode(int num_node)
{
    MoveToNode(first, node, num_node);
}

//! добавить узел
template <typename T>
void CTree<T>::push_node(STreeNode<T> *&n, T data)
{
    if(is_empty)
    {
        printf("Error: A tree is not created!!!");
        return;
    }//! end of if
    STreeNode<T> * new_node = new STreeNode<T>();//! делаем новый узел

    
    new_node->data = data;
    
    new_node->BackNode = this->node;

    new_node->weight = 0;

    
    n->ChildNodes.push_back(new_node);

    
    this->node = new_node;
    ++cur_depth;
}

template <typename T>
void CTree<T>::push_node(T data)
{
    this->push_node(node, data);
}

template <typename T>
void CTree<T>::ChangeBranch(STreeNode<T> *&n1, STreeNode<T> *&n2)
{
    try
    {
        STreeNode<T> *temp = new STreeNode<T>();

        temp->ChildNodes = n1->ChildNodes;
        temp->data = n1->data;
        temp->weight = n1->weight;

        n1->ChildNodes = n2->ChildNodes;
        n1->data = n2->data;
        n1->weight = n2->weight;


        n2->ChildNodes = temp->ChildNodes;
        n2->data = temp->data;
        n2->weight = temp->weight;

        this->ClearGeneratorWeights();
        this->GenerateWeights(n1, 0);

        this->ClearGeneratorWeights();
        this->GenerateWeights(n2, 0);
    }
    catch(...)
    {
        cout << "Error in ChangeBranch(!)";
        return;
    }
}

template <typename T>
void CTree<T>::Display(STreeNode<T> *n)
{
    if(!n)
        return;
    std::cout <<  n->data << " ";
    if(n->ChildNodes.size() != 0)
    {
        std::vector<STreeNode<T> *>::iterator It_Node = n->ChildNodes.begin();
        while(It_Node != n->ChildNodes.end())
        {
            Display(*It_Node);
            ++It_Node;
        }//! end of while
    }//! end of if
}

template <typename T>
void CTree<T>::SelfDisplay()
{
    Display(first);
}

template <typename T>
void CTree<T>::getAlgFromTree(STreeNode<T> *n, std::vector<T> &arr)
{
    if(!n)
        return;
    arr.push_back(n->data);
    if(n->ChildNodes.size() != 0)
    {
        std::vector<STreeNode<T> *>::iterator It_Node = n->ChildNodes.begin();
        while(It_Node != n->ChildNodes.end())
        {
            getAlgFromTree(*It_Node, arr);
            ++It_Node;
        }//! end of while
    }//! end of if
}

template <typename T>
void CTree<T>::StepBack()
{
    if(node->BackNode)
    {
        node = node->BackNode;
        --cur_depth;
    }//! end of if
}


template <typename T>
CTree<T>::~CTree(void)
{
    Destroy();
}//! end of Destructor
#endif //! end of __CTREE__INCLUDED__



надо создать дерево. добовлять, удалять, перемешать,  распечатать дерево
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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