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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление узла из бинарного дерева, Работает не правильно 
V
    Опции темы
Voldemar2004
  Дата 9.6.2007, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Есть бинарное дерево.

Информационная часть узла: предложение, количество символов в предложении, количество цифр в предложении, указатели на левый и правый узел, соответственно.

Узлы формируются по ключу количество символов в предложении.

Удаление я сделал по ключу количество цифр в предложении. Но работает он неправильно, не пойму, где ошибка.

Код
//---------------------------------------------------------------------------

#include <iostream.h>
#include <string.h>
#include <ctype.h>      // isdigit()

//---------------------------------------------------------------------------

class Tree{

public:

        class Node {

        public:

        string Text;            // Предложение.
        int Counter;            // Количество цифр в предложении.
        int Symbols_Counter;    // Количество символов в предложении.

        Node* Left;             // Указатель на левый узел
        Node* Right;            // Указатель на правый узел
        };

        Node* First(string Text);
        Node* Search_Insert(Node* root, string Text);
        void Print_Back(Node* root, int Level);

        // Функция удаления элемента из дерева:

        Node* Delete(int Key, Node** T);

        private:

        // Вспомогательная рекурсивная функция для удаления:
        void Del(Node** R, Node** K);

        // Метод возвращает количество цифр в предложении:
        int Counter(string Text);

        // Метод возвращает количество всех символов в предложении:
        int Symbols_Counter(string Text);


};

//---------------------------------------------------------------------------
int main()
{

Tree My;

Tree::Node Info;

Tree::Node* root = My.First("1dh4646hdfhfhgfhg");

// Добавляем элементы:

My.Search_Insert(root, "12kkhkhjkghk");

My.Search_Insert(root, "gdf45344v46543vg46");

My.Search_Insert(root, "as534df");

My.Search_Insert(root, "97d9eryt7f");



My.Delete(12, &root);

My.Print_Back(root, 0);

cin.get();

return 0;
}
//---------------------------------------------------------------------------

// Формирование первого элемента дерева:
Tree::Node* Tree::First(string Text) {

Node* pv = new Node;

// Добавление информационной части узла в первый элемент дерева:

pv->Symbols_Counter = Symbols_Counter(Text);

pv->Text = Text;

pv->Counter = Counter(Text);

pv->Left = 0;
pv->Right = 0;

return pv;

}

//---------------------------------------------------------------------------
// Поиск элемента с включением его в дерево:
Tree::Node* Tree::Search_Insert(Node* root, string Text) {

Node* pv = root, *prev;

bool found = false;

        while(pv && !found){

        prev = pv;

               if (Symbols_Counter(Text) == pv->Symbols_Counter) found = true;
               else if (Symbols_Counter(Text) < pv->Symbols_Counter) pv = pv->Left;
               else pv = pv->Right;
        }

        if(found) return pv;

        // Создание нового узла:

        Node* pnew = new Node;

        // Добавление информационной части узла в новый элемент дерева:
        pnew->Symbols_Counter = Symbols_Counter(Text);
        pnew->Text = Text;
        pnew->Counter = Counter(Text);

        pnew->Left = 0;
        pnew->Right = 0;

                if(Symbols_Counter(Text) < prev->Symbols_Counter)
                // Присоединение к левому поддереву предка:
                        prev->Left = pnew;
                else
                        prev->Right = pnew;
                // Присоединение к правому поддереву предка:
                return pnew;
}
//---------------------------------------------------------------------------

// Обратный обход дерева:

void Tree::Print_Back(Node* root, int Level) {

        if(root) {

        Print_Back(root->Left, Level + 1);

        cout << root->Symbols_Counter << '\t' << root->Counter << '\t' << root->Text << '\n';

        Print_Back(root->Right, Level + 1);

        }

}

//---------------------------------------------------------------------------
// Метод возвращает количество цифр в предложении:

int Tree::Counter(string Text) {

int Counter = 0;

        for(int i=0; i<strlen( (char*)Text.c_str() ); ++i)
        isdigit(Text[i]) ? ++Counter : Counter;

return Counter;

}

//---------------------------------------------------------------------------

// Метод возвращает количество всех символов в предложении:

int Tree::Symbols_Counter(string Text) {

return strlen( (char*)Text.c_str() );

}

//---------------------------------------------------------------------------

void Tree::Del(Node** R, Node** K) {

Node* r, *k;

r = *R; k = *K;

        if(r->Right != 0) {

        Del(&r->Right, &k);

        }

        else {

        k->Counter = r->Counter;

        *K = *R;

        *R = r->Left;

        free(r);

        }

}

//---------------------------------------------------------------------------

Tree::Node* Tree::Delete(int Key, Node** T) {

Node* K, *t;

t = *T;

        if(*T == 0) return NULL;

        if(Key < t->Counter)
        {
        Delete(Key, &t->Left);
        }

        else

        if (Key > t->Counter)
        {
        Delete(Key, &t->Right);
        }

        else {

        K = *T;

                if(K->Right == 0)
                {t = *T; *T = K->Left; free(t);}

                else

                if(K->Left == 0)
                {t = *T; *T = K->Right; free(t);}

                else Del(&K->Left, &K);

                }

return K;

}

//---------------------------------------------------------------------------


Вот где ошибка:  
Код


My.Delete(3, &root); - удаления не происходит

My.Delete(2, &root); - удаляет нормально

My.Delete(0, &root); - вообще не удаляет нормально



Надеюсь, хорошо объяснил.


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
boriska
Дата 10.6.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Странная реализация дерева  smile  но все же....
Задал начальное значение указателю К и вроде бы заработало
Код

Tree::Node* Tree::Delete(int Key, Node** T) 
{
         Node* K = NULL, *t;
         // .....

         return K;
}


это имелось ввиду ?
PM MAIL ICQ   Вверх
Voldemar2004
Дата 10.6.2007, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(boriska @  10.6.2007,  13:22 Найти цитируемый пост)
Странная реализация дерева
Чего тут странного?

Цитата(boriska @  10.6.2007,  13:22 Найти цитируемый пост)
Задал начальное значение указателю К и вроде бы заработало
Не работает.

Вот так все правильно работает, когда я удаляю элементы по 1-му полю, количество символов в предложении:
Код
//---------------------------------------------------------------------------

#include <iostream.h>
#include <string.h>
#include <ctype.h>      // isdigit()

//---------------------------------------------------------------------------

class Tree{

public:

        class Node {

        public:

        string Text;            // Предложение.
        int Counter;            // Количество цифр в предложении.
        int Symbols_Counter;    // Количество символов в предложении.

        Node* Left;             // Указатель на левый узел
        Node* Right;            // Указатель на правый узел
        };

        Node* First(string Text);
        Node* Search_Insert(Node* root, string Text);
        void Print_Back(Node* root, int Level);

        // Функция удаления элемента из дерева:

        Node* Delete(int Key, Node** T);

        private:

        // Вспомогательная рекурсивная функция для удаления:
        void Del(Node** R, Node** K);

        // Метод возвращает количество цифр в предложении:
        int Counter(string Text);

        // Метод возвращает количество всех символов в предложении:
        int Symbols_Counter(string Text);


};

//---------------------------------------------------------------------------
int main()
{

Tree My;

Tree::Node Info;

Tree::Node* root = My.First("1dh4646hdfhfhgfhg");

// Добавляем элементы:

My.Search_Insert(root, "12kkhkhjkghk");

My.Search_Insert(root, "gdf45344v46543vg46");

My.Search_Insert(root, "as534df");

My.Search_Insert(root, "97d9eryt7f");

My.Print_Back(root, 0);

cin.get();

My.Delete(7, &root);
My.Delete(10, &root);
My.Delete(18, &root);
My.Delete(12, &root);

My.Print_Back(root, 0);

cin.get();

return 0;
}
//---------------------------------------------------------------------------

// Формирование первого элемента дерева:
Tree::Node* Tree::First(string Text) {

Node* pv = new Node;

// Добавление информационной части узла в первый элемент дерева:

pv->Symbols_Counter = Symbols_Counter(Text);

pv->Text = Text;

pv->Counter = Counter(Text);

pv->Left = 0;
pv->Right = 0;

return pv;

}

//---------------------------------------------------------------------------
// Поиск элемента с включением его в дерево:
Tree::Node* Tree::Search_Insert(Node* root, string Text) {

Node* pv = root, *prev;

bool found = false;

        while(pv && !found){

        prev = pv;

               if (Symbols_Counter(Text) == pv->Symbols_Counter) found = true;
               else if (Symbols_Counter(Text) < pv->Symbols_Counter) pv = pv->Left;
               else pv = pv->Right;
        }

        if(found) return pv;

        // Создание нового узла:

        Node* pnew = new Node;

        // Добавление информационной части узла в новый элемент дерева:
        pnew->Symbols_Counter = Symbols_Counter(Text);
        pnew->Text = Text;
        pnew->Counter = Counter(Text);

        pnew->Left = 0;
        pnew->Right = 0;

                if(Symbols_Counter(Text) < prev->Symbols_Counter)
                // Присоединение к левому поддереву предка:
                        prev->Left = pnew;
                else
                        prev->Right = pnew;
                // Присоединение к правому поддереву предка:
                return pnew;
}
//---------------------------------------------------------------------------

// Обратный обход дерева:

void Tree::Print_Back(Node* root, int Level) {

        if(root) {

        Print_Back(root->Left, Level + 1);

        cout << root->Symbols_Counter << '\t' << root->Counter << '\t' << root->Text << '\n';

        Print_Back(root->Right, Level + 1);

        }

}

//---------------------------------------------------------------------------
// Метод возвращает количество цифр в предложении:

int Tree::Counter(string Text) {

int Counter = 0;

        for(int i=0; i<strlen( (char*)Text.c_str() ); ++i)
        isdigit(Text[i]) ? ++Counter : Counter;

return Counter;

}

//---------------------------------------------------------------------------

// Метод возвращает количество всех символов в предложении:

int Tree::Symbols_Counter(string Text) {

return strlen( (char*)Text.c_str() );

}

//---------------------------------------------------------------------------

void Tree::Del(Node** R, Node** K) {

Node* r, *k;

r = *R; k = *K;

        if(r->Right != 0) {

        Del(&r->Right, &k);

        }

        else {

        k->Symbols_Counter = r->Symbols_Counter;

        *K = *R;

        *R = r->Left;

        free(r);

        }

}

//---------------------------------------------------------------------------

Tree::Node* Tree::Delete(int Key, Node** T) {

Node* K, *t;

t = *T;

        if(*T == 0) return NULL;

        if(Key < t->Symbols_Counter)
        {
        Delete(Key, &t->Left);
        }

        else

        if (Key > t->Symbols_Counter)
        {
        Delete(Key, &t->Right);
        }

        else {

        K = *T;

                if(K->Right == 0)
                {t = *T; *T = K->Left; free(t);}

                else

                if(K->Left == 0)
                {t = *T; *T = K->Right; free(t);}

                else Del(&K->Left, &K);

                }

return K;

}

//---------------------------------------------------------------------------
Я понял в чем ошибка: при удалении элемента из дерева, мы начинаем двигаться с верхушки - в данном случае просмотр идет по 1-му полю. Для второго поля такое условие не выполняется. 

Сейчас напишу функцию, которая будет искать элемент 2-го столбца соответствующий элементу 1-го и удалять его.


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Voldemar2004
Дата 10.6.2007, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Функцию сделал, но почему-то она ищет нормально только 3 из 5 элементов: int Search(Node* root, int Value);

Код
//---------------------------------------------------------------------------

#include <iostream.h>
#include <string.h>
#include <ctype.h>      // isdigit()

//---------------------------------------------------------------------------

class Tree{

public:

        class Node {

        public:

        string Text;            // Предложение.
        int Counter;            // Количество цифр в предложении.
        int Symbols_Counter;    // Количество символов в предложении.

        Node* Left;             // Указатель на левый узел
        Node* Right;            // Указатель на правый узел
        };

        Node* First(string Text);
        Node* Search_Insert(Node* root, string Text);
        void Print_Back(Node* root, int Level);

        // Поиск элемента в дереве:
        int Tree::Search(Node* root, int Value);

        private:

        // Метод возвращает количество цифр в предложении:
        int Counter(string Text);

        // Метод возвращает количество всех символов в предложении:
        int Symbols_Counter(string Text);

};

//---------------------------------------------------------------------------
int main()
{

Tree My;

Tree::Node Info;

Tree::Node* root = My.First("1dh4646hdfhfhgfhg");

// Добавляем элементы:

My.Search_Insert(root, "12kkhkhjkghk");

My.Search_Insert(root, "gdf45344v46543vg46");

My.Search_Insert(root, "as534df");

My.Search_Insert(root, "97d9eryt7f");

My.Print_Back(root, 0);

cout << '\n' << My.Search(root, 2);




cin.get();

return 0;
}
//---------------------------------------------------------------------------

// Формирование первого элемента дерева:
Tree::Node* Tree::First(string Text) {

Node* pv = new Node;

// Добавление информационной части узла в первый элемент дерева:

pv->Symbols_Counter = Symbols_Counter(Text);

pv->Text = Text;

pv->Counter = Counter(Text);

pv->Left = 0;
pv->Right = 0;

return pv;

}

//---------------------------------------------------------------------------
// Поиск элемента с включением его в дерево:
Tree::Node* Tree::Search_Insert(Node* root, string Text) {

Node* pv = root, *prev;

bool found = false;

        while(pv && !found){

        prev = pv;

               if (Symbols_Counter(Text) == pv->Symbols_Counter) found = true;
               else if (Symbols_Counter(Text) < pv->Symbols_Counter) pv = pv->Left;
               else pv = pv->Right;
        }

        if(found) return pv;

        // Создание нового узла:

        Node* pnew = new Node;

        // Добавление информационной части узла в новый элемент дерева:
        pnew->Symbols_Counter = Symbols_Counter(Text);
        pnew->Text = Text;
        pnew->Counter = Counter(Text);

        pnew->Left = 0;
        pnew->Right = 0;

                if(Symbols_Counter(Text) < prev->Symbols_Counter)
                // Присоединение к левому поддереву предка:
                        prev->Left = pnew;
                else
                        prev->Right = pnew;
                // Присоединение к правому поддереву предка:
                return pnew;
}
//---------------------------------------------------------------------------

// Обратный обход дерева:

void Tree::Print_Back(Node* root, int Level) {

        if(root) {

        Print_Back(root->Left, Level + 1);

        cout << root->Symbols_Counter << '\t' << root->Counter << '\t' << root->Text << '\n';

        Print_Back(root->Right, Level + 1);

        }

}

//---------------------------------------------------------------------------
// Метод возвращает количество цифр в предложении:

int Tree::Counter(string Text) {

int Counter = 0;

        for(int i=0; i<strlen( (char*)Text.c_str() ); ++i)
        isdigit(Text[i]) ? ++Counter : Counter;

return Counter;

}

//---------------------------------------------------------------------------

// Метод возвращает количество всех символов в предложении:

int Tree::Symbols_Counter(string Text) {

return strlen( (char*)Text.c_str() );

}

//---------------------------------------------------------------------------

// Поиск элемента в дереве:
int Tree::Search(Node* root, int Value) {

Node* pv = root, *prev;

bool found = false;

        while(pv && !found){

               if (Value == pv->Counter) found = true;

               else

               if (Value < pv->Counter) pv = pv->Left;

               else pv = pv->Right;
        }

        if(found) return pv->Symbols_Counter;

}

//---------------------------------------------------------------------------


 smile  smile  smile 


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Warchief
Дата 10.6.2007, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ребята срочно нужна помощь!!!
Помогите и мне пожалуйста с аналогичной задачей, нужно дописать функцию remove для удаления элемента дерева.Я что-то забуксовал на классах. Пасиб зарание!!

Код

#include <iostream>

using namespace std;


typedef int keyType;

struct dataType
{
  keyType key;

  dataType( keyType k) { key = k;}
};



template <class ItemType>
struct TreeNode
{
  ItemType* data;
  TreeNode<ItemType> *parent;
  TreeNode<ItemType> *left;
  TreeNode<ItemType> *right;

  TreeNode(ItemType* d) { data = d; parent = left = right = NULL;}
};

template <class ItemType>
class searchTree
{
 public:
  searchTree() { root = NULL; }
  TreeNode<ItemType>* search( keyType k );
  ItemType* isMember( keyType k );
  bool insert (ItemType* data );
  bool remove (keyType k );
  // вывод
  void print();
  void print(  TreeNode<ItemType> *node);  
 private:
   TreeNode<ItemType>* root;
};


template <class ItemType>
bool searchTree<ItemType>::remove ( keyType k ){
  // здесь нужно дополнить код
  // ...
}

template <class ItemType>
bool searchTree<ItemType>::insert (ItemType* data ){
  TreeNode<ItemType>* node = new TreeNode<ItemType>(data);
  if (!node) return false; // нехватка памяти

  if (!root){ // дерево пустое
    root = node; return true;
  }

  keyType k = data->key;

  TreeNode<ItemType>* currentNode = root;
  TreeNode<ItemType>* parentNode = NULL;
  while (currentNode != NULL){
    parentNode = currentNode;
    if (currentNode->data->key == k) return false; 
    if (currentNode->data->key > k)
      currentNode = currentNode->left;
    else 
       currentNode = currentNode->right; 
  }
  node->parent = parentNode;
  if (parentNode->data->key < k)
    parentNode->right = node;
  else
    parentNode->left = node;
  return true;
}

template <class ItemType>
TreeNode<ItemType>* searchTree<ItemType>::search( keyType k ){

  TreeNode<ItemType>* currentNode = root; 

  while (currentNode != NULL) {
    if ( currentNode->data->key == k ) 
      return currentNode;
    if (k < currentNode->data->key )
      currentNode = currentNode->left;
    else
      currentNode = currentNode->right;
  }
  return NULL;
}

template <class ItemType>
ItemType* searchTree<ItemType>::isMember( keyType k ){
  TreeNode<ItemType>* node = search( k );
  if (node == NULL) return NULL;
  cout << "isMember: " << k << std::endl;
  return node->data;
}




Это сообщение отредактировал(а) Warchief - 11.6.2007, 11:50
PM MAIL ICQ Skype   Вверх
Voldemar2004
  Дата 11.6.2007, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Посмотри как функция удаления оформлена здесь:

Код
//////////////////////////////////////////////////////////////////////////////
//
//  Dynamic structures (binary tree)
//  (c) Johna Smith, 1996
//
//  Method description:
//               *
//            /     \
//           *       *
//         /   \   /   \
//        *     * *     *
//
//   From current element X left element is less than X and right element
// is greater than X. All elements in the must be different.
//
//////////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <alloc.h>
#include <conio.h>
#include <math.h>

struct item
{
  int element;
  item *left;
  item *right;
};

item *tree; // base element of the list

// this function searches element in the tree and returns 0 if element wasn't
// found and 1 - if element was found, result is address of element
char Search(int element, item** result)
{
  item *p,*q;
  char found=0;

  p=tree;
  if (tree!=NULL)
  do
  {
    q=p;
    if (p->element==element) found=1;
    else
    {
      q=p;
      if (element<p->element) p=p->left;
      else p=p->right;
    }
  }
  while (!found && p!=NULL);
  *result=q;

  return found;
}

// this function adds an element to the tree
void Add(int element)
{
  item *r,*s;

  if (Search(element,&r)==0)
  {
    s=(item*)malloc(sizeof(item));
    s->element=element;
    s->left=NULL;
    s->right=NULL;
    if (tree==NULL) tree=s; // if tree is empty make s=top of the tree
    else
    {
      if (element<r->element) r->left=s;
      else r->right=s;
    }
  }
}

// this is auxulary function for Remove procedure
void Del(item **r, item **q)
{
  item *tmp;

  if ((*r)->right==NULL)
  {
    (*q)->element=(*r)->element;
    *q=*r;
    *r=(*r)->left;
  } 
  else Del(&((*r)->right),q);
}

// this function removes element with value 'element' from the tree
void Remove(int element, item **d)
{
  item *q;

  if (*d==NULL)
  printf("There is not element %d in the tree.\n",element);
  else
  if (element<(*d)->element) Remove(element, &((*d)->left)); else
  if (element>(*d)->element) Remove(element, &((*d)->right)); else
  {
    // element found
    q=*d;
    if (q->right==NULL) *d=q->left; else
    if (q->left==NULL) *d=q->right; else
    Del(&(q->left),&q);
    free(q);
  }
}

// this function prints the tree
void printtree(item *t, int offset=40, int depth=2)
{
  gotoxy(offset,depth);
  cprintf("%d",t->element);
  if (t->left!=NULL) printtree(t->left,offset-pow(2,6-depth),depth+1);
  if (t->right!=NULL) printtree(t->right,offset+pow(2,6-depth),depth+1);
}

void main(void)
{
  item *tmp;

  // creating tree
  Add(100);
  Add(20);
  Add(120);
  Add(15);
  Add(50);
  Add(130);
  Add(30);
  Add(55);
  Add(28);
  Add(35);
  Add(60);
  Add(33);

  // printing tree
  clrscr();
  printf("Press a key to delete element 50...\n");
  printtree(tree);
  getch();
  clrscr();
  Remove(50,&tree);
  printtree(tree);
  gotoxy(1,20);
  // searching
  cprintf("Element 20 is%s found",(Search(20,&tmp)?"":"n't"));
  printf("\nElement 25 is%s found\n",(Search(25,&tmp)?"":"n't"));
  // removing all elements
  Remove(100,&tree);
  Remove(20,&tree);
  Remove(120,&tree);
  Remove(15,&tree);
  Remove(35,&tree);
  Remove(130,&tree);
  Remove(30,&tree);
  Remove(55,&tree);
  Remove(28,&tree);
  Remove(33,&tree);
  Remove(60,&tree);

}


Взято отсюда


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Warchief
Дата 11.6.2007, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Voldemar2004, 

Пасиб!  Но я так и не смог разобраться с remov'om. Теоретически мне понятно как ремув ищет и удалет элементы. Не хватает имменно знаний C++. Мой код подключается к проекту как header, а я даже не знаю как вызвать потом в int main какую-либо функцию оттуда. Помогите пожалуйста разобраться!!
PM MAIL ICQ Skype   Вверх
Voldemar2004
Дата 11.6.2007, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Warchief @  11.6.2007,  16:41 Найти цитируемый пост)
а я даже не знаю как вызвать потом в int main какую-либо функцию оттуда. Помогите пожалуйста разобраться!!
Ну примерно так: объясняю по мере собственного понимания:

Код
#include <iostream>

template <class T>
class Tree{

// область private.... - это то, что будет видно только внутри класса Tree

        // Узел дерева:
        class Node {

        public:

        T Data;                 // Тип T
        Node* Left;             // Указатель на левый узел
        Node* Right;            // Указатель на правый узел
        };


// функции класса - это его методы:
public:

// область public.... - это то, что будет видно в функции main()

        void AddToTree(T Data){

        std::cout << Data;

        }


};

int main(){

Tree<float> My;

My.AddToTree(123.4);

std::cin.get();

return 0;
}



--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Warchief
Дата 11.6.2007, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Почти стало понятно, но всё-таки я не могу вызвать ни одну функцию из моего кода в int main. 
Пытаюсь добавить элемент в дерево так:

Код

int main(int argc, char *argv[])
{
  searchTree<int> my;
  my.insert(6);
    
    
    
    
    
    
    system("PAUSE");
   
}



в итоге получаю:
invalid conversion from `int' to `int*' 

Почему не работает?


Это сообщение отредактировал(а) Warchief - 11.6.2007, 17:54
PM MAIL ICQ Skype   Вверх
Voldemar2004
Дата 11.6.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



У тебя же в аргументе метода insert стоит указатель на ItemType, 
Код
bool insert (ItemType* data );
 а ты пытаешься туда запихнуть 6. Тогда так:

Код
int main()
{

  searchTree<int> my;

  int* a = new int [1];

  a[0] = 1;


  my.insert(a);


  cin.get();


  delete[] a;


return 0;
}
 Но тогда возникают ошибки в методе insert.




--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Warchief
Дата 11.6.2007, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Voldemar2004, 

Гы ;) Дык уже целый день пытаюсь разобраться, да всё никак  smile . Метод 100% правильный, а как его использовать ума не приложу.

PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0664 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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