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

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

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

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

06.11.2010, 15:19. Просмотров 2256. Ответов 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).
Не плодите одинаковых тем.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2010, 15:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Написать класс, описывающий дерево (C++):

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

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

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

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

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

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

20
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
06.11.2010, 16:09 #2
Ну, во-первых, у тебя неинициализирован указатель на объект "pp", поэтому при попытке вызова метода этого объекта произойдёт ошибка.
А во-вторых, функция "make" — это тихий ужас. Так нельзя работать с объектами.
0
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
06.11.2010, 16:36  [ТС] #3
а конструктор видели? или там нет инициализации по умолчанию? а на счёт функции make Ваш комметарий мягко говоря неинформативен хочется конкретики.. как бы Вы решели эту задачу?
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
06.11.2010, 17:29 #4
До вызова конструктора у тебя дело не доходит. Ты должен выделить память под объект прежде, чем его использовать.
C++
1
Tree *pp = new Tree;
Функция "make" ужасна тем, что работает с объектом "снаружи" являясь при этом его методом.
Вместо неё нужно сделать функцию "insert", которая добавляет в уже существующее дерево новый элемент.
1
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
06.11.2010, 21:34  [ТС] #5
действительно, память не выделилась.. спасибо! это мой косяк!
может так?
C++
1
pp = new Tree;
я так понимаю это должно быть внутри make?
а разве make не добавляет новые эл-ты?
как тогда выглядеть функция insert?
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
06.11.2010, 22:14 #6
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
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
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
 
class binary_tree {
private:
    class binary_tree_node {    
    public:
        binary_tree_node (int value) : m_value(value), m_left(0), m_right(0) {}
    
        ~binary_tree_node () {
            delete m_left;
            delete m_right;
        }
        
        void insert (int value) {
            if (value < m_value) insert_left(value);
            else insert_right(value);
        }
        
        void show () const {
            if (m_left != 0) m_left->show();
            std::cout << m_value << ' ';
            if (m_right != 0) m_right->show();
        }
        
    private:
        void insert_left (int value) {
            if (m_left == 0) m_left = new binary_tree_node(value);
            else m_left->insert(value);
        }
        void insert_right (int value) {
            if (m_right == 0) m_right = new binary_tree_node(value);
            else m_right->insert(value);
        }
    
    private:
        int m_value;
        
        binary_tree_node * m_left;
        binary_tree_node * m_right;
    };
    
public:
    binary_tree () : m_root(0) {}
    ~binary_tree () { delete m_root; }
 
    void insert (int value) {
        if (m_root == 0) m_root = new binary_tree_node(value);
        else m_root->insert(value);
    }
    
    void show () const { if (m_root != 0) m_root->show(); }
 
private:
    binary_tree_node * m_root;
};
 
int main () {
    binary_tree tree;
    
    for (int i = 0; i < 10; ++i) {
        int x = random() % 10;
        
        std::cout << x << ' ';
        tree.insert(x);
    }
    
    std::cout << std::endl;
    
    tree.show();
    
    return 0;
}
1
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
06.11.2010, 23:27  [ТС] #7
а вот в 51 строке слово const это к чему?
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
06.11.2010, 23:48 #8
velodro, это значит, что метод не модифицирует экземпляр своего класса. Помогает отлавливать большее число ошибок на этапе компиляции.
1
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
04.12.2010, 22:28  [ТС] #9
а как в таком дереве организовать удаление? поиск мне удался.
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
05.12.2010, 13:12 #10
Самый простой способ — левая ветвь удаляемого элемента вставляется в правую, а правая поттягивается на его место.
1
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
05.12.2010, 18:04  [ТС] #11
а как взять то к чему подтягивать.. создать поле с идентификационными номерами, расположенными по порядку, и искать предыдущий по ним?
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
05.12.2010, 18:10 #12
velodro, нет, просто всю процедуру удаления производить из того узла, к которому подтягивать.
0
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
05.12.2010, 19:40  [ТС] #13
вот такую штуку написал и ЗАРАБОТАЛО!!! ОГРОМНОЕ СПАСИБО!!!
C++
1
2
3
4
5
6
7
8
9
10
11
12
binary_tree_node* f(int v)                          /////////////////////////поиск                  
{
    if (m_value == v)
    return this;
    else
    {
        if (m_left != 0)
        m_left->f(v);
        if (m_right != 0)
            m_right->f(v);
    }
}
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
void del(int v)
{
        binary_tree_node* p = new binary_tree_node;
        p = f(v);
    if (m_left == p)
    {
        binary_tree_node* p1 = new binary_tree_node;
            p1 = m_left;
        if (m_left)
        {
            p1->m_right = p1->m_left;
                m_left = p1->m_right;
        }
        else 
                {
                p1->m_left = p1->m_right;
            m_left = p1->m_left;
        }
         }
         else 
    {
        binary_tree_node* p1 = new binary_tree_node;
            p1 = m_right;
        if (m_left)
        {
            p1->m_right = p1->m_left;
            m_right = p1->m_right;
        }
        else
                {
                p1->m_left = p1->m_right;
            m_right = p1->m_left;
                }
    }
}
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
05.12.2010, 23:05 #14
velodro, сомнительно. Поиск выдаёт правильный результат только в том случае, когда искомый элемент попадается сразу. А в удалении я вообще не понял, что происходит.
0
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
06.12.2010, 01:31  [ТС] #15
да я чё то тоже потестировал - расстроился - написал такое. стало легче, но всё равно глючит...
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
void del(int v)
{
        binary_tree_node* p = new binary_tree_node;
        p = f(v);
        if (m_left == p)
        {
                
                binary_tree_node* p1 = new binary_tree_node;
                p1 = m_left;
                if (m_left)
                {
                        p1->m_left = p1->m_right;
                        m_left = p1->m_left;
                }
                else 
                {                                                
                        p1->m_right = p1->m_left;
                        m_left = p1->m_right;
                }
        }
    else
        if (m_right == p)
        {
                      binary_tree_node* p1 = new binary_tree_node;
                      p1 = m_right;
                      if (m_left)
                      {
                             p1->m_left = p1->m_right;
                     m_right = p1->m_left;
                      }
                      else
                      {
                    p1->m_right = p1->m_left;
                            m_right = p1->m_right;
                      }
                 }
         else
         {
            if (m_left != NULL)
                    m_left->del(v);
            else
                    m_right->del(v);
         }
}
Добавлено через 10 минут
volovzi, как проводить всю процедуру удаления производить из того узла, к которому подтягивать?
0
06.12.2010, 01:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2010, 01:31
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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