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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с деревьями, деревья в классах на с++ 
:(
    Опции темы
Artas
Дата 25.4.2005, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет пипл.Начал осваивать деревья на с++.Помогите справиться с такой проблемой.Надо создать дерево,из данных о машинах из 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

Это сообщение отредактировал(а) Artas - 25.4.2005, 20:58
PM MAIL   Вверх
podval
Дата 25.4.2005, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

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



Перенесено из раздела "Алгоритмы", ибо вопрос чисто на С++.
PM WWW ICQ   Вверх
Ggamhat
Дата 26.4.2005, 04:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А зачем тебе двойные указатели? Делай связанный спискок: каждый элемент имеет указатель на предыдущий и на следующий. По краям - 0.
PM MAIL   Вверх
Artas
Дата 26.4.2005, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Дело в том что задачу надо решить именно вначале с помощью деревьев,а потом уже с помощью списка.
PM MAIL   Вверх
Ggamhat
Дата 28.4.2005, 05:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Artas
А дерево разве не список? По сути...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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