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

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

Восстановить пароль Регистрация
 
murzilka6002
0 / 0 / 0
Регистрация: 11.11.2011
Сообщений: 23
24.11.2011, 01:19     Ошибка в поиску дерева #1
Не могу найти в чем ошибка, должен производиться поиск по всему дереву, а он дальше первого уровня не идет.

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;
}
 Комментарий модератора 
Используйте соответствующие теги форматирования кода.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
24.11.2011, 01:49     Ошибка в поиску дерева #2
murzilka6002,

Мне кажется вы зря используете ссылки, так как может быть перераспределение памяти при добавлении новых элементов, и ссылки станут не действительными.
murzilka6002
0 / 0 / 0
Регистрация: 11.11.2011
Сообщений: 23
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
Сообщений: 23
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     Ошибка в поиску дерева
Ответ Создать тему
Опции темы

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