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


Автор: Artas 25.4.2005, 18:42
Привет пипл.Начал осваивать деревья на с++.Помогите справиться с такой проблемой.Надо создать дерево,из данных о машинах из txt. файла.Данные в файле имеют такое расположение
в каждой строке Keу(ключ идентификатор тип int) Name(имя машины char) Price(цена машины int) God(год выпуска int)
Надо используя класс сгруппировать в бинарное дерево по ключу.Затем поиск элемента и удаление.
Используя алгоритм уважаемого podval но модифицируя его в класс вот что у меня получилось.Данные я считал вроде из файла и создал дерево,хотел их вывести на печать ,создал метод но че то у меня не получается.Подкоректируйте плиз.
Код

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

struct car
       {
       int key;
       char *name;
       int price;
       int god;
       car *left;
       car *right;

       };
class Tree
      { private:
    car *Tree;

    public:
    char Search(int key,car** result);
    Tree() {Tree=NULL;}
    void BuildTree();
    car** GetTree () {return &Tree;}
    void PrintTree(car**);
      };

 void Tree::BuildTree()
       {
        FILE* fp;
       int key2;char name2[15];
       int price2;
       int god2;
       car *r,*s;

        if((fp=fopen("derevo.txt","r"))==NULL)
        {
         cout<<"read error"<<endl;getch();exit(1);}
         while (!feof(fp)) {
         fscanf(fp,"%d%s%d%d",&key2,&name2,&price2,&god2);
         if (Search(key2,&r))
           {
           s=(car*)malloc(sizeof(car));
           s->key=key2;
           s->name=name2;
           s->price=price2;
           s->god=god2;
           s->left=NULL;
           s->right=NULL;
           if (Tree==NULL) Tree=s; // if tree is empty make s=top of the tree
           else
            {
            if (key2<r->key) r->left=s;
             else r->right=s;
            }



           }
      }
}
char Tree::Search(int key2, car** result)
{
 car *p,*q;
 char found=0;

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

 return found;
}
void Tree::PrintTree(car **t )
{
 cprintf("%d",t->key);
 if (t->left!=NULL) PrintTree(t->left);
 if (t->right!=NULL) PrintTree(t->right);
}
void main()
{ Tree A;
  A.BuildTree();
 A.PrintTree(A.GetTree());

}



Скорее проблема с указателями.Я в них путаюсь.Если не сложно подскажите как работают двойные указатели.
Заранее сспасибо smile

Автор: podval 25.4.2005, 20:20
Перенесено из раздела "Алгоритмы", ибо вопрос чисто на С++.

Автор: Ggamhat 26.4.2005, 04:17
А зачем тебе двойные указатели? Делай связанный спискок: каждый элемент имеет указатель на предыдущий и на следующий. По краям - 0.

Автор: Artas 26.4.2005, 08:51
Дело в том что задачу надо решить именно вначале с помощью деревьев,а потом уже с помощью списка.

Автор: Ggamhat 28.4.2005, 05:44
Artas
А дерево разве не список? По сути...

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