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

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

Войти
Регистрация
Восстановить пароль
 
murzilka6002
0 / 0 / 0
Регистрация: 11.11.2011
Сообщений: 24
#1

Ошибка в поиску дерева - C++

24.11.2011, 01:19. Просмотров 252. Ответов 3
Метки нет (Все метки)

Не могу найти в чем ошибка, должен производиться поиск по всему дереву, а он дальше первого уровня не идет.

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
#include <cstdlib>
#include <iostream>
#include <vector>
#include <string>
 
using namespace std;
 
//Class drzewa
class tree_node
       {
       public:
        int id;                                        //Numer
        string data;                                   //zawartosc
        vector <tree_node> children;                   //dzieci
        };
 
//Funkcja wyszukiwania
void szukaj(tree_node& t, string& s)
{
         if (t.data==s)                                //Wyszuk
            {
             cout<< t.data<<"\t";                      //Wywod wyszukiwania
             cout<<"id= "<< t.id<<endl;
            }           
         for(int i=0; i<t.children.size();i++)         //Sprawdzanie wezla
                {
                 szukaj(t.children[i],s);
                }
}
 
        
int main(int argc, char *argv[])
{
    
tree_node root;
root.id=1;
root.data="Ivan";
 
tree_node node2;
node2.id=2;
node2.data="text";
root.children.push_back(node2);
 
tree_node node3;
node3.id=3;
node3.data="Andrzej";
root.children.push_back(node3);
 
tree_node node4;
node4.id=4;
node4.data="Swieta";
root.children.push_back(node4);
 
tree_node node5;
node5.id=5;
node5.data="Kolia";
root.children.push_back(node5);
 
tree_node node6;
node6.id=6;
node6.data="Mihal";
node2.children.push_back(node6);
 
tree_node node7;
node7.id=7;
node7.data="Ivan";
node2.children.push_back(node7);
 
tree_node node8;
node8.id=8;
node8.data="Tania";
node4.children.push_back(node8);
 
tree_node node9;
node9.id=9;
node9.data="Andrzej";
node4.children.push_back(node9);
 
tree_node node10;
node10.id=10;
node10.data="Olia";
node5.children.push_back(node10);
 
tree_node node11;
node11.id=11;
node11.data="Sasza";
node5.children.push_back(node5);
 
tree_node node12;
node12.id=12;
node12.data="Tania";
node5.children.push_back(node12);
 
tree_node node13;
node13.id=13;
node13.data="Kolia";
node7.children.push_back(node13);
 
tree_node node14;
node14.id=14;
node14.data="Tania";
node10.children.push_back(node14);
 
tree_node node15;
node15.id=15;
node15.data="Swieta";
node10.children.push_back(node15);
 
tree_node node16;
node16.id=16;
node16.data="Dawid";
node12.children.push_back(node16);
 
tree_node node17;
node17.id=17;
node17.data="Wiktor";
node12.children.push_back(node17);
 
tree_node node18;
node18.id=18;
node18.data="Ania";
node12.children.push_back(node18);
 
 
////////////////Wyszukiwanie//////////////////////////
 
string szuk;
 
cin>>szuk;
szukaj(root,szuk);
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
Добавлено через 10 часов 18 минут
Как бы с предыдущим вопросом разобрался, добавил ссылку на адрес узла, изменил vector на deque.
Но теперь проблема другая - выбивает ошибку памяти при запуску программы (при компилировании нет ошибки).
Ошибка появляется начиная с node13 (это третий ряд потомков root->node2->node7->node13)
В чём может быть ошибка?
Вот полный код
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 <cstdlib>
#include <iostream>
#include <vector>
#include <string>
#include <deque>
 
using namespace std;
 
//Class drzewa
class tree_node
       {
       public:
        int id;                                        //Numer
        string data;                                   //zawartosc
        deque <tree_node> children;                   //dzieci
        };
 
//Funkcja wyszukiwania
void szukaj(tree_node& t, string& s)
{
         if (t.data==s)                                //Wyszuk
            {
             cout<<"id= "<< t.id<<"\t";                //Wywod wyszukiwania
            }           
         for(int i=0; i<t.children.size();i++)         //Sprawdzanie wezla
                {
                 szukaj(t.children[i],s);
                }
}
 
        
int main(int argc, char *argv[])
{
    
tree_node root;
root.id=1;
root.data="Ivan";
 
tree_node node2;
node2.id=2;
node2.data="Dawid";
root.children.push_back(node2);
tree_node& node2Ref = root.children.back();
 
tree_node node3;
node3.id=3;
node3.data="Andrzej";
root.children.push_back(node3);
tree_node& node3Ref = root.children.back();
 
tree_node node4;
node4.id=4;
node4.data="Swieta";
root.children.push_back(node4);
tree_node& node4Ref = root.children.back();
 
tree_node node5;
node5.id=5;
node5.data="Kolia";
root.children.push_back(node5);
tree_node& node5Ref = root.children.back();
 
tree_node node6;
node6.id=6;
node6.data="Mihal";
node2Ref.children.push_back(node6);
tree_node& node6Ref = node2.children.back();
 
tree_node node7;
node7.id=7;
node7.data="Ivan";
node2Ref.children.push_back(node7);
tree_node& node7Ref = node2.children.back();
 
tree_node node8;
node8.id=8;
node8.data="Tania";
node4Ref.children.push_back(node8);
tree_node& node8Ref = node4.children.back();
 
tree_node node9;
node9.id=9;
node9.data="Andrzej";
node4Ref.children.push_back(node9);
tree_node& node9Ref = node4.children.back();
 
tree_node node10;
node10.id=10;
node10.data="Olia";
node5Ref.children.push_back(node10);
tree_node& node10Ref = node5.children.back();
 
tree_node node11;
node11.id=11;
node11.data="Sasza";
node5Ref.children.push_back(node11);
tree_node& node11Ref = node5.children.back();
 
tree_node node12;
node12.id=12;
node12.data="Tania";
node5Ref.children.push_back(node12);
tree_node& node12Ref = node5.children.back();
 
tree_node node13;
node13.id=13;
node13.data="Kolia";
node7Ref.children.push_back(node13);
tree_node& node13Ref = node7.children.back();
 
tree_node node14;
node14.id=14;
node14.data="Tania";
node10Ref.children.push_back(node14);
tree_node& node14Ref = node10.children.back();
 
tree_node node15;
node15.id=15;
node15.data="Swieta";
node10Ref.children.push_back(node15);
tree_node& node15Ref = node10.children.back();
 
tree_node node16;
node16.id=16;
node16.data="Dawid";
node12Ref.children.push_back(node16);
tree_node& node16Ref = node12.children.back();
 
tree_node node17;
node17.id=17;
node17.data="Wiktor";
node12Ref.children.push_back(node17);
tree_node& node17Ref = node12.children.back();
 
tree_node node18;
node18.id=18;
node18.data="Ania";
node12Ref.children.push_back(node18);
tree_node& node18Ref = node12.children.back();
 
 
////////////////Wyszukiwanie//////////////////////////
 
string szuk;
 
cin>>szuk;
szukaj(root,szuk);
cout<<endl;
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
 Комментарий модератора 
Используйте соответствующие теги форматирования кода.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2011, 01:19     Ошибка в поиску дерева
Посмотрите здесь:

Ошибка в бинарному поиску - C++
Много было тем про бинарный поиск.Я их посмотрел.Где ошибка в моем коде #include&lt;iostream&gt; #include&lt;stdio.h&gt; using namespace std; ...

Ошибка при выводе дерева - C++
#include &lt;iostream&gt; using namespace std; struct node { int inf; node *left; node *right; };

Ошибка при вводе дерева - C++
В заданном непустом бинарном дереве найти длину (число ветвей) пути от корня до ближайшей вершины со значением, равным заданному....

Построение бинарного дерева. Где ошибка? - C++
Насколько понял, tree-&gt;left, tree-&gt;right указывает на NULL. Почему, не могу разобратся. #include &lt;iostream&gt; #include &lt;ctime&gt; using...

Функция удаления элемента из дерева, ошибка в коде - C++
Добрый вечер, уважаемые программисты! :) Помогите, пожалуйста, понять где здесь ошибка. static bool h = false; // узел...

Поиск значения минимального листа дерева/ошибка - C++
всем привет, такая проблема: в чем ошибка поиска значения минимального листа? #include &lt;tchar.h&gt; #include &lt;stdio.h&gt; #include...

В чем может быть ошибка. Расстояние между вершинами дерева - C++
Входные данные: Первая строка содержит количество вершин в дереве n(1&lt;=n&lt;=500000). Вершины имеют значения от 0 до n-1. В следующих n-1...

Запись бинарного дерева в файл и восстановление из него этого дерева - C++
Задача такая: есть бинарное дерево. Каждый элемент дерева содержит 3 указателя - 1 указатель на структуру с данными, 2 и 3й указатель на...

Написать шаблон бинарного дерева с функцией распечатки дерева - C++
Не понимаю, что от меня хотят. Дано такое задание: Написать шаблон бинарного дерева с функцией распечатки дерева *(+(d,e),c) в виде...

Ошибка при реализации бинарного дерева: error C1075: конец файла обнаружен ранее, чем левая фигурная скобка - C++
Почему выскакивает ошибка? Вроде все правильно. error C1075: конец файла обнаружен ранее, чем левая фигурная скобка &quot;{&quot; в...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
24.11.2011, 01:49     Ошибка в поиску дерева #2
murzilka6002,

Мне кажется вы зря используете ссылки, так как может быть перераспределение памяти при добавлении новых элементов, и ссылки станут не действительными.
murzilka6002
0 / 0 / 0
Регистрация: 11.11.2011
Сообщений: 24
24.11.2011, 02:04  [ТС]     Ошибка в поиску дерева #3
Вот исправленный вариант, всё работает, проблемы была в записи
C++
1
2
3
4
5
tree_node node13;
node13.id=13;
node13.data="Kolia";
node7Ref.children.push_back(node13);
tree_node& node13Ref = node7Ref.children.back();
вот полный код
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 <cstdlib>
#include <iostream>
#include <vector>
#include <string>
#include <deque>
 
using namespace std;
 
//Class drzewa
class tree_node
       {
       public:
        int id;                                        //Numer
        string data;                                   //zawartosc
        deque <tree_node> children;                    //dzieci
        };
 
//Funkcja wyszukiwania
void szukaj(tree_node& t, string& s)
{
         if (t.data==s)                                //Wyszuk
            {
             cout<<"id= "<< t.id<<"\t";                //Wywod wyszukiwania
            }           
         for(int i=0; i<t.children.size();i++)         //Sprawdzanie wezla
                {
                 szukaj(t.children[i],s);
                }
}
 
        
int main(int argc, char *argv[])
{
    
tree_node root;
root.id=1;
root.data="Ivan";
 
tree_node node2;
node2.id=2;
node2.data="Dawid";
root.children.push_back(node2);
tree_node& node2Ref = root.children.back();
 
tree_node node3;
node3.id=3;
node3.data="Andrzej";
root.children.push_back(node3);
tree_node& node3Ref = root.children.back();
 
tree_node node4;
node4.id=4;
node4.data="Swieta";
root.children.push_back(node4);
tree_node& node4Ref = root.children.back();
 
tree_node node5;
node5.id=5;
node5.data="Kolia";
root.children.push_back(node5);
tree_node& node5Ref = root.children.back();
 
tree_node node6;
node6.id=6;
node6.data="Mihal";
node2Ref.children.push_back(node6);
tree_node& node6Ref = node2Ref.children.back();
 
tree_node node7;
node7.id=7;
node7.data="Ivan";
node2Ref.children.push_back(node7);
tree_node& node7Ref = node2Ref.children.back();
 
tree_node node8;
node8.id=8;
node8.data="Tania";
node4Ref.children.push_back(node8);
tree_node& node8Ref = node4Ref.children.back();
 
tree_node node9;
node9.id=9;
node9.data="Andrzej";
node4Ref.children.push_back(node9);
tree_node& node9Ref = node4Ref.children.back();
 
tree_node node10;
node10.id=10;
node10.data="Olia";
node5Ref.children.push_back(node10);
tree_node& node10Ref = node5Ref.children.back();
 
tree_node node11;
node11.id=11;
node11.data="Sasza";
node5Ref.children.push_back(node11);
tree_node& node11Ref = node5Ref.children.back();
 
tree_node node12;
node12.id=12;
node12.data="Tania";
node5Ref.children.push_back(node12);
tree_node& node12Ref = node5Ref.children.back();
 
tree_node node13;
node13.id=13;
node13.data="Kolia";
node7Ref.children.push_back(node13);
tree_node& node13Ref = node7Ref.children.back();
 
tree_node node14;
node14.id=14;
node14.data="Tania";
node10Ref.children.push_back(node14);
tree_node& node14Ref = node10Ref.children.back();
 
tree_node node15;
node15.id=15;
node15.data="Swieta";
node10Ref.children.push_back(node15);
tree_node& node15Ref = node10Ref.children.back();
 
tree_node node16;
node16.id=16;
node16.data="Dawid";
node12Ref.children.push_back(node16);
tree_node& node16Ref = node12Ref.children.back();
 
tree_node node17;
node17.id=17;
node17.data="Wiktor";
node12Ref.children.push_back(node17);
tree_node& node17Ref = node12Ref.children.back();
 
tree_node node18;
node18.id=18;
node18.data="Ania";
node12Ref.children.push_back(node18);
tree_node& node18Ref = node12Ref.children.back();
 
 
////////////////Wyszukiwanie//////////////////////////
 
string szuk;
 
cin>>szuk;
szukaj(root,szuk);
cout<<endl;
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
А как лучше сделать? Что изменить, дабы не возникли проблемы (в последней реализации ужене было )
murzilka6002
0 / 0 / 0
Регистрация: 11.11.2011
Сообщений: 24
25.11.2011, 11:07  [ТС]     Ошибка в поиску дерева #4
Ну и окончательный, вариант
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
#include <cstdlib>
#include <iostream>
#include <string>
#include <deque>
 
using namespace std;
 
//Class drzewa
class tree_node
{
      public:
        int id;                                        //Numer
        string data;                                   //zawartosc
        deque <tree_node> children;                    //dzieci
        
        tree_node(int theId, string theData):          //Konstruktor
               id(theId),
               data(theData)
                {
                }
  
        tree_node& add_node(const tree_node& node)
                {
                 children.push_back(node);
                 return children.back();
                }
};
 
//Funkcja wyszukiwania
void szukaj(tree_node& t, string& s)
{
         if (t.data==s)                                //Wyszuk
            {
             cout<<"id= "<< t.id<<"\t";                //Wywod wyszukiwania
            }           
         for(int i=0; i<t.children.size();i++)         //Sprawdzanie wezla
                {
                 szukaj(t.children[i],s);
                }
}
 
        
int main(int argc, char *argv[])
{
    
tree_node root(1, "Ivan");
  tree_node& node2Ref = root.add_node(tree_node(2, "Mihal"));
  tree_node& node3Ref = root.add_node(tree_node(3, "Dawid"));
  tree_node& node4Ref = root.add_node(tree_node(4, "Mihal"));
  tree_node& node5Ref = root.add_node(tree_node(5, "Tania"));
    tree_node& node6Ref = node2Ref.add_node(tree_node(6, "Andrzej"));
    tree_node& node7Ref = node2Ref.add_node(tree_node(7, "Tania"));
    tree_node& node8Ref = node4Ref.add_node(tree_node(8, "Sasza"));
    tree_node& node9Ref = node4Ref.add_node(tree_node(9, "Ivan"));
    tree_node& node10Ref = node5Ref.add_node(tree_node(10, "Dawid"));
    tree_node& node11Ref = node5Ref.add_node(tree_node(11, "Ania"));
    tree_node& node12Ref = node5Ref.add_node(tree_node(12, "Ania"));
      tree_node& node13Ref = node7Ref.add_node(tree_node(13, "Olia"));
      tree_node& node14Ref = node10Ref.add_node(tree_node(14, "Kolia"));
      tree_node& node15Ref = node12Ref.add_node(tree_node(15, "Bohdan"));
      tree_node& node16Ref = node12Ref.add_node(tree_node(16, "Andrzej"));
      tree_node& node17Ref = node12Ref.add_node(tree_node(17, "Tania"));
      tree_node& node18Ref = node12Ref.add_node(tree_node(18, "Mihal"));
 
 
////////////////Wyszukiwanie//////////////////////////
 
string szuk;
 
cin>>szuk;
szukaj(root,szuk);
cout<<endl;
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
Yandex
Объявления
25.11.2011, 11:07     Ошибка в поиску дерева
Ответ Создать тему
Опции темы

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