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

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

Войти
Регистрация
Восстановить пароль
 
Ne_Mega_Ne_Keek
4 / 4 / 0
Регистрация: 10.07.2011
Сообщений: 10
#1

Обход упорядоченного дерева. Не могу понять на что ругается прогорамма... Ошибок вроде как нет... - C++

14.07.2011, 22:25. Просмотров 957. Ответов 10
Метки нет (Все метки)

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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <vector> 
#include <ctime>
 
using namespace std;
 
struct node
{[FLEFT][/FLEFT]
    int Key;
    int Cout;
    node *Left;
    node *Right;
};
 
class TREE
{
    private:
    node *Tree; // Указатель на корень дерева
    void Search (int, node**);
    public:
    TREE() {Tree=NULL;}
    node** GetTree (){return & Tree;} // Получение узла дерева.
    void BuildTree ();
    void CleanTree (node**);
    void ObhodEnd (node** );
    void ObhodLeft (node** );
    void Obhodback (node** );
    void Vyvod (node**,int);
};
 
void main ()
{
    setlocale(LC_ALL,"Russian");
    TREE A;
    A.BuildTree();
    cout<< endl <<"Вывод дерева:"<<endl;
    A.Vyvod (A.GetTree(),0);
    cout<<"Прямой обход дерева:";
    A.ObhodLeft (A.GetTree());
    cout<< endl<< "Обратный обход дерева:";
    A.ObhodEnd (A.GetTree());
    cout<< endl<< "Симметричный обход дерева:";
    A.Obhodback (A.GetTree());
    A.CleanTree (A.GetTree());
}
 
void TREE::BuildTree()
//Построение бинарного дерева (рекурсивный алгоритм).
//Tree-указатель на корень дерева.
{
    int el;
    cout<<"Введите ключи вершин дерева. Затем введите 0." <<endl;
    cin>> el;
    while(el!=0)
    {
        Search (el,&Tree);
        cin>>el;
    }
 
}
 
void TREE::Search(int x, node**p)
// Поиск вершины с ключом x в дереве со вставкой
//(рекурсивный алгоритм).
//*p- указатель на корень дерева.
{
    if(*p=NULL)
    {
    // Вершины в дереве нет; включить её.
        *p=new(node);
        (**p).Key =x;
        (**p).Cout =1;
        (**p).Left =NULL;
        (**p).Right =NULL;
    }
    else
    if(x<(**p).Key)
    Search(x,&(**p).Left);
    else
    if(x>(**p).Key)
    Search (x,&(**p).Right);
    else
    (**p).Cout=(**p).Cout +1;
}
 
void TREE::ObhodLeft(node**w)
//Прямой обход дерева.
//*w- указатель на корень дерева.
{
    if(*w!=NULL)
    {
        cout<<(**w).Key<<"";
        ObhodLeft(&((**w).Left));
        ObhodLeft(&((**w).Right));
    }
}
 
void TREE::ObhodEnd(node**w)
//Обратный обход дерева.
//*w- указатель на корень дерева.
{
    if(*w!=NULL)
    {
        ObhodEnd(&((**w).Left));
        ObhodEnd(&((**w).Right));
        cout<<(**w).Key<<" ";
    }
}
 
void TREE::Obhodback(node **w)
//Симметричный обход дерева.
//*w- указатель на корень дерева.
{
    if(*w!=NULL)
    {
        Obhodback(&((**w).Left));
        cout<<(**w).Key<<" ";
        Obhodback(&((**w).Right));
    }
}
 
void TREE::CleanTree(node **w)
//Очистка дерева.
//*w- указатель на корень дерева.
{
    if(*w!=NULL)
    {
        CleanTree(&((**w).Left));
        CleanTree(&((**w).Right));
        delete *w;
    }
}
 
void TREE::Vyvod(node**w,int l)
//Изображение дерева *w на экране
//(рекурсивный алгоримт).
//*w- указатель на корень дерева.
{
    int i;
    if(*w!=NULL)
    {
        Vyvod(&((**w).Right),l+1);
        for(i=1;i<=l;i++)
        cout<<" ";
        cout<<(**w).Key<<endl;
        Vyvod(&((**w).Left),l+1);
    }
}
 Комментарий модератора 
Используйте теги форматирования кода!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.07.2011, 22:25     Обход упорядоченного дерева. Не могу понять на что ругается прогорамма... Ошибок вроде как нет...
Посмотрите здесь:

C++ не могу понять что не так
не могу понять что не так((((( C++
Как осуществлять обход бинарного дерева? C++
C++ что не верно? не могу понять.
Мьютекс, не могу понять, сигналирован или нет C++
Не могу понять, что за ошибка и как устранить C++
C++ Синтаксических и арифметических ошибок в цикле вроде как нет, но он не работает
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,304
14.07.2011, 23:12     Обход упорядоченного дерева. Не могу понять на что ругается прогорамма... Ошибок вроде как нет... #2
для начала:
C++
1
if(*p==NULL)
Добавлено через 34 секунды
И форматни код, имей совесть.
Ne_Mega_Ne_Keek
4 / 4 / 0
Регистрация: 10.07.2011
Сообщений: 10
15.07.2011, 00:01  [ТС]     Обход упорядоченного дерева. Не могу понять на что ругается прогорамма... Ошибок вроде как нет... #3
Я не умею))) Я нуб))))))
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,304
15.07.2011, 00:15     Обход упорядоченного дерева. Не могу понять на что ругается прогорамма... Ошибок вроде как нет... #4
Тут есть где-то тема, как пользоваться редактором сообщений, смотри её.
Ne_Mega_Ne_Keek
4 / 4 / 0
Регистрация: 10.07.2011
Сообщений: 10
15.07.2011, 00:34  [ТС]     Обход упорядоченного дерева. Не могу понять на что ругается прогорамма... Ошибок вроде как нет... #5
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <vector> 
#include <ctime>
 
using namespace std;
 
struct node
{
    int Key;
    int Cout;
    node *Left;
    node *Right;
};
 
class TREE
{
    private:
    node *Tree; // Указатель на корень дерева
    void Search (int, node**);
    public:
    TREE() {Tree=NULL;}
    node** GetTree (){return & Tree;} // Получение узла дерева.
    void BuildTree ();
    void CleanTree (node**);
    void ObhodEnd (node** );
    void ObhodLeft (node** );
    void Obhodback (node** );
    void Vyvod (node**,int);
};
 
void main ()
{
    setlocale(LC_ALL,"Russian");
    TREE A;
    A.BuildTree();
    cout<< endl <<"Вывод дерева:"<<endl;
    A.Vyvod (A.GetTree(),0);
    cout<<"Прямой обход дерева:";
    A.ObhodLeft (A.GetTree());
    cout<< endl<< "Обратный обход дерева:";
    A.ObhodEnd (A.GetTree());
    cout<< endl<< "Симметричный обход дерева:";
    A.Obhodback (A.GetTree());
    A.CleanTree (A.GetTree());
}
 
void TREE::BuildTree()
//Построение бинарного дерева (рекурсивный алгоритм).
//Tree-указатель на корень дерева.
{
    int el;
    cout<<"Введите ключи вершин дерева. Затем введите 0." <<endl;
    cin>> el;
    while(el!=0)
    {
        Search (el,&Tree);
        cin>>el;
    }
 
}
 
void TREE::Search(int x, node**p)
// Поиск вершины с ключом x в дереве со вставкой
//(рекурсивный алгоритм).
//*p- указатель на корень дерева.
{
    if(*p=NULL)
    {
    // Вершины в дереве нет; включить её.
        *p=new(node);
        (**p).Key =x;
        (**p).Cout =1;
        (**p).Left =NULL;
        (**p).Right =NULL;
    }
    else
    if(x<(**p).Key)
    Search(x,&(**p).Left);
    else
    if(x>(**p).Key)
    Search (x,&(**p).Right);
    else
    (**p).Cout=(**p).Cout +1;
}
 
void TREE::ObhodLeft(node**w)
//Прямой обход дерева.
//*w- указатель на корень дерева.
{
    if(*w!=NULL)
    {
        cout<<(**w).Key<<"";
        ObhodLeft(&((**w).Left));
        ObhodLeft(&((**w).Right));
    }
}
 
void TREE::ObhodEnd(node**w)
//Обратный обход дерева.
//*w- указатель на корень дерева.
{
    if(*w!=NULL)
    {
        ObhodEnd(&((**w).Left));
        ObhodEnd(&((**w).Right));
        cout<<(**w).Key<<" ";
    }
}
 
void TREE::Obhodback(node **w)
//Симметричный обход дерева.
//*w- указатель на корень дерева.
{
    if(*w!=NULL)
    {
        Obhodback(&((**w).Left));
        cout<<(**w).Key<<" ";
        Obhodback(&((**w).Right));
    }
}
 
void TREE::CleanTree(node **w)
//Очистка дерева.
//*w- указатель на корень дерева.
{
    if(*w!=NULL)
    {
        CleanTree(&((**w).Left));
        CleanTree(&((**w).Right));
        delete *w;
    }
}
 
void TREE::Vyvod(node**w,int l)
//Изображение дерева *w на экране
//(рекурсивный алгоримт).
//*w- указатель на корень дерева.
{
    int i;
    if(*w!=NULL)
    {
        Vyvod(&((**w).Right),l+1);
        for(i=1;i<=l;i++)
        cout<<" ";
        cout<<(**w).Key<<endl;
        Vyvod(&((**w).Left),l+1);
    }
}
Добавлено через 7 минут
if(*p==NULL) - Да... она на неё ругается... я это понял! Но почему?

Добавлено через 2 минуты
И спасибо что про тему сказал)) ... Я пока не так хорошо разбираюсь в структурах что бы понять, что он от меня требует...
grizlik78
Эксперт С++
 Аватар для grizlik78
1892 / 1424 / 105
Регистрация: 29.05.2011
Сообщений: 2,980
15.07.2011, 01:02     Обход упорядоченного дерева. Не могу понять на что ругается прогорамма... Ошибок вроде как нет... #6
Цитата Сообщение от Ne_Mega_Ne_Keek Посмотреть сообщение
if(*p==NULL) - Да... она на неё ругается... я это понял! Но почему?
"Она" ругается не на "неё". То есть на эту строку, но не в таком виде.
C
1
if (*p = NULL)
Здесь происходит присваивание. В переменную *p (в ячейку памяти, на которую указывает p) записывается NULL (будем считать, что это 0). В результате проверяемое условие всегда ложно (так как выражение равно нулю). Если сам указатель p равен нулю, то при попытке выполнить это действие программа упадёт.
C
1
if (*p == NULL)
Здесь значение по указателю p сравнивается с нулём (с нулевым указателем, если точнее). Но если сам p равен нулю, то программа в этом месте всё-равно упадёт. Но будем считать, что за этим должна следить вызывающая программа и сам указатель p имеет корректное значение. Тогда такой вариант работает правильно: указатель (*p) можно разыменовывать только если он не нулевой, иначе нужно задать для него корректное значение. Ну, в общем, там в программе так и делается. Ошибка только в использовании = вместо ==
Ne_Mega_Ne_Keek
4 / 4 / 0
Регистрация: 10.07.2011
Сообщений: 10
15.07.2011, 01:25  [ТС]     Обход упорядоченного дерева. Не могу понять на что ругается прогорамма... Ошибок вроде как нет... #7
Спасибо)))) Блин! Как всегда ошибка в какой-то мелочи которую без должной снаровки не разглядеть...) Фух... Теперь остаётся всё это отчитать)) Спасибо ещё раз)

Добавлено через 1 минуту
Вот я невнимательный капец(
Robotun
 Аватар для Robotun
1 / 1 / 0
Регистрация: 15.07.2011
Сообщений: 11
15.07.2011, 02:13     Обход упорядоченного дерева. Не могу понять на что ругается прогорамма... Ошибок вроде как нет... #8
Подскажи код ошибки...
Ne_Mega_Ne_Keek
4 / 4 / 0
Регистрация: 10.07.2011
Сообщений: 10
15.07.2011, 02:14  [ТС]     Обход упорядоченного дерева. Не могу понять на что ругается прогорамма... Ошибок вроде как нет... #9
Robotun Подскажи код ошибки...

Какой?
Robotun
 Аватар для Robotun
1 / 1 / 0
Регистрация: 15.07.2011
Сообщений: 11
15.07.2011, 02:22     Обход упорядоченного дерева. Не могу понять на что ругается прогорамма... Ошибок вроде как нет... #10
Давай в аське или в другом месте...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2011, 16:40     Обход упорядоченного дерева. Не могу понять на что ругается прогорамма... Ошибок вроде как нет...
Еще ссылки по теме:

не могу понять что с выводом C++
Написал программу, не могу понять правильно или нет C++
C++ Как можно совершить обход двоичного дерева нерекурсивно
C++ Вроде переполнение, а вроде бы и нет
C++ Нашел в схожей теме не могу понять в чем ошибка. Кроме того как конкретно сделать что были високосные года?

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

Или воспользуйтесь поиском по форуму:
Ne_Mega_Ne_Keek
4 / 4 / 0
Регистрация: 10.07.2011
Сообщений: 10
15.07.2011, 16:40  [ТС]     Обход упорядоченного дерева. Не могу понять на что ругается прогорамма... Ошибок вроде как нет... #11
Ну кинь что-нибудь сюда... Эмэйл... айди в вк... или скайп)
Yandex
Объявления
15.07.2011, 16:40     Обход упорядоченного дерева. Не могу понять на что ругается прогорамма... Ошибок вроде как нет...
Ответ Создать тему
Опции темы

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