Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.82
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
#1

Написать класс, описывающий дерево - C++

06.11.2010, 15:19. Просмотров 2205. Ответов 20
Метки нет (Все метки)

Хочется понять, как написать простейший класс, описывающий дерево.
Компилирует данный код, но пишет пишет "ошибка сегментирования"

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
 
using namespace std;
 
class Tree
{
    int data;
    Tree *right;
    Tree *left;
public:
    Tree()
    {
        data = 0;
        right = left = NULL;
    }
    void make(Tree **pp, int d);
};
 
void Tree::make(Tree **pp, int d)
{
    if(!(*pp))
    {
        Tree *p = new Tree;
        p->data = d;
        *pp = p;
    }
    else 
    {
        if ((*pp)->data > d)
            make(&((*pp)->right), d);
        else
            make(&((*pp)->right), d);
    }
}
 
int main()
{
    Tree *pp;
    pp->make(&pp,3);
    return 0;
}
Подскажите пожалуйста!

 Комментарий модератора 
Дублирование тем запрещено правилами форума (п. 3.4).
Не плодите одинаковых тем.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2010, 15:19     Написать класс, описывающий дерево
Посмотрите здесь:

Написать класс, описывающий эллипс - C++
Здравствуйте.. необходимо написать программу... столкнулся с трудностями.. помогите кто может.. Написать класс описывающий эллипс (...

Создать класс, описывающий треугольник, и наследник, описывающий прямые треугольной призмы - C++
Создать класс описывающий треугольник. найти площадь треугольника. создать класс наследник, описывающий прямые треугольной призмы. найти...

Создать классы, описывающий прямоугольники и класс-наследник, описывающий прямоугольные параллепипеды - C++
Создать классы, описывающий прямоугольники. Найти площадь прямоугольника. Создать класс-наследник, описывающий прямоугольные параллепипеды....

Класс, описывающий окружность - C++
Доброго времени суток! Помогите пожалуйста с написанием программы на основе объектно ориентированного программирования. Задание такое: ...

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

Класс описывающий квадрат, перегрузка - C++
Здравствуйте, помогите пожалуйста. Создать класс, описывающий квадрат. Перегрузить операцию умножения так, чтобы можно было получить...

Класс, описывающий прямоугольную трапецию - C++
Класс, описывающий прямоугольную трапецию. Его данные-члены должны быть закрытыми, функции-члены доступными. Одна сторона трапеции является...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
06.12.2010, 01:31     Написать класс, описывающий дерево #16
У тебя удаление использует неправильный поиск, так что начни с него.
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
06.12.2010, 01:55  [ТС]     Написать класс, описывающий дерево #17
для проверки поиска написал дополнительно вот такую функцию в классе binary_tree_node:
C++
1
2
3
4
5
6
int ff(int v)
{
     binary_tree_node* p = new binary_tree_node;
     p = f(v);
     return p->m_value;
}
и вот такую в binary_tree:
C++
1
2
3
4
5
void find(int v)
{
    if (m_root != 0) 
    cout<<m_root->ff(v);
}
здесь всё работает правильно...

с чего вы взяли что проблема в поиске тоже есть?
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
06.12.2010, 02:40     Написать класс, описывающий дерево #18
velodro, проблема в том, что поиск возвращает результат только в том случае, если m_value == v, а в остальных случаях не возвращает ничего.

Должно быть примерно так:
C++
1
2
3
4
5
6
binary_tree_node * f (int v) {
        if (v == m_value) return this;
        else if (v < m_value && m_left != 0) return m_left->f(v);
        else if (v > m_value && m_right != 0) return m_right->f(v);
        else return 0;
}
Замечание, не относящееся к деревьям: ты неправильно используешь оператор "new". Он используется только тогда, когда тебе нужно выделить память под новый объект. И потом ты обязан удалить выделенную память оператором "delete". Если же ты используешь указатель как псевдоним другого объекта (как в функции "ff"), то выделять память не нужно. Пиши просто
C++
1
 binary_tree_node * p = f(v);
Добавлено через 5 минут
Я сейчас подумал, и понял, что если ты собираешься удалять узел с помощью найденного указателя на него, то тебе нужно в узле создать дополнительную переменную, в которой будет храниться указатель на родительский узел. Иначе просто не получится.

Добавлено через 15 минут
Подумал ещё раз.
Нет, всё-таки удалять узел надо из более высокого уровня, т.к. если узел не имеет родительского, то удалить сам себя не сможет.
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
07.12.2010, 22:58  [ТС]     Написать класс, описывающий дерево #19
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
binary_tree_node * f (int v)
{
    if (v == m_value) return this;
    else if (v < m_value && m_left != 0) return m_left->f(v);
    else if (v > m_value && m_right != 0) return m_right->f(v);
    else return 0;
}
binary_tree_node* fdel(binary_tree_node* p2,binary_tree_node* p)
{
    if ((p2->m_left == p) || (p2->m_right == p))
                return p2;
    if ((p2->m_left != p) && (p2->m_right != p))
    {
        if (p2->m_left != NULL)
            return fdel(p2->m_left,p);
        else
            return fdel(p2->m_right,p);
    }
}               
void del(int v)
{
    binary_tree_node* p;
        p = f(v);
        binary_tree_node* p2;
        p2 = fdel(this,p);
 
    if (p2->m_left == p)
        {
        binary_tree_node* p1;
        p1 = p2->m_left;
 
                if (p1->m_left != NULL)
                {
                p1->m_right = p1->m_left;
                p2->m_left = p1->m_right;
            }   
            else
            {
                    p1->m_left = p1->m_right;
                p2->m_left = p1->m_right;
        }
        }
    if (p2->m_right == p)
        {
        binary_tree_node* p1;
                p1 = p2->m_right;
                
                if (p1->m_left != NULL)
                {
            p1->m_right = p1->m_left;
            p2->m_right = p1->m_right;
        }
        else
        {
            p1->m_left = p1->m_right;
            p2->m_right = p1->m_right;
        }
        }
}
осталось сделать обработку крайних.. Спасибо Вам большое! =)
lemegeton
08.12.2010, 06:00
  #20

Не по теме:

Цитата Сообщение от velodro Посмотреть сообщение
... написать простейший класс, описывающий дерево.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// класс дерево
class Tree
{
public:
    bool is_peed;
    Tree() { is_peed = false; };
};
 
// класс, описывающий дерево
class Dog
{
public:
    void pee_on(Tree& a_tree)
    {
        a_tree.is_peed = true;
    }
};
 
void main()
{
    Dog dog;
    Tree oak;
 
    dog.pee_on(oak);
}

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.12.2010, 21:05     Написать класс, описывающий дерево
Еще ссылки по теме:

Класс, описывающий вектор в пространстве - C++
Создайте класс, описывающий вектор в пространстве. Такой вектор задаётся тремя координатами. Перегрузите операции +, -, * соответственно...

Создать класс,описывающий треугольник - C++
Создать класс,описывающий треугольник.Найти площадь треугольника.Ребята,помогите пожалуйста.Где ошибки в этом коде? #include &lt;stdio.h&gt; ...

Класс TPlane, описывающий плоскость в пространстве - C++
Собственно само задание: переписать программу, используя новые знания о классах и перезагрузке операций. Использовать динамическое...

Создать класс, описывающий багаж пассажира - C++
. Создать класс, описывающий багаж пассажира. Данные класса: количество вещей и общий вес вещей. Открытые функции класса: ввод количества...

Создать класс, описывающий комплексные числа - C++
Помогите, пожалуйста! Нужно создать класс, описывающий комплексные числа. Класс содержит два поля вещественного типа для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
08.12.2010, 21:05  [ТС]     Написать класс, описывающий дерево #21
надо обработать ситуацию со сливом =)
Yandex
Объявления
08.12.2010, 21:05     Написать класс, описывающий дерево
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru