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

Бинарное дерево, поинтеры - C++

Восстановить пароль Регистрация
 
Пушкин
1 / 1 / 0
Регистрация: 26.10.2010
Сообщений: 8
07.11.2010, 16:16     Бинарное дерево, поинтеры #1
Попросили реализовать бинарную структуру, я вот пробую, в инете поискал - что это и как. Начал делать все с помощью поинтеров. Создаются объекты, добавляются в вектор и с помощью функции обрабатываются - назначаются левое и правое ответвления.

Проблема в бесконечно повторяющемся алгоритме.

Там есть условие - если текущий поинтер содержит левое (например) ответвление, значит текущий поинтер заменяется этим ответвлением. И цикл повторяется, пока левое ответвление не будет равно null. Вот эти строки:

C++
1
2
3
4
5
6
7
8
9
10
11
12
 if (curP->hasLeft == false) {
                                        cout << "PASSED_1_1 (break)" << endl;
                                        curP->hasLeft = true;
                                        curP->setLeftChild(sbs[i]); // set child
                                        cout << &curP->getLeftChild() << endl; 
                                        break; // exit cycle
                                        // else if it has child
                                } else {                                        
                                        cout << "PASSED_1_2" << endl;
                                        curP = &curP->getLeftChild(); //set new current pointer and try cycle again <-- PROBLEM 
                                        //cout << curP->getID() << endl;
                                }
вот программа полностью

subscriber.h

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
#include <cstdlib>
#include <iostream>
#include <string>
 
#ifndef _SUBSCRIBER_H
#define _SUBSCRIBER_H
 
using namespace std;
 
class subscriber {
 
private:
    string name;
    string number;
    int ID;
    subscriber *p; //parrent
    subscriber *l; // left child
    subscriber *r; //right child
    
public:
    bool hasRight;
    bool hasLeft;
    subscriber(string nm, string nmb, int id):name(nm), number(nmb), ID(id), hasRight(false), hasLeft(false) {}
    string getInfo();
    int getID();
    void setLeftChild(subscriber&);
    void setRightChild(subscriber&);
    void setParrent(subscriber&);
    subscriber& getLeftChild();
    subscriber& getRightChild();
 
 
};
 
#endif
subscriber.cpp

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
#include "subscriber.h"
 
string subscriber:: getInfo() {
    return name + " " + number;
}
 
int subscriber:: getID() {
    return ID;
}
 
void subscriber:: setLeftChild(subscriber& s) {
    l = &s;
}
 
void subscriber:: setRightChild(subscriber& s){
    r = &s;
}
 
void subscriber::setParrent(subscriber& s) {
    p = &s;
}
 
subscriber& subscriber::getLeftChild() {
    return *l;
}
 
subscriber& subscriber::getRightChild() {
    return *r;
}
main.cpp

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
#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <Windows.h>
 
#include "subscriber.h"
 
using namespace std;
 
int main() {
 
    int wait = 0;
 
    void makeTree(vector<subscriber> sbs, subscriber head);
 
    subscriber a("Sasha", "321321", 45);
    subscriber b("andrew", "321321", 3);
    subscriber c("zheniqe", "321321", 8);
    subscriber d("henadiy", "321321", 12);
    subscriber e("miron", "321321", 82);
    subscriber f("vasya", "321321", 35);
    subscriber g("angel", "321321", 88);
    subscriber h("tgr", "321321", 12);
 
    vector<subscriber> sbs;
    sbs.push_back(a);
    sbs.push_back(b);
    sbs.push_back(c);
    sbs.push_back(d);
    sbs.push_back(e);
    sbs.push_back(f);
    sbs.push_back(g);
    sbs.push_back(h);
 
    subscriber* head = &sbs[0];
 
    //cout << head->getLeftChild();
 
    
 
    makeTree(sbs, *head);
 
 
 
    //cout << "\n" << &sbs[0].getLeftChild() << endl;
 
    //for (int i = 0; i < sbs.size(); i ++) {
    //  cout << &sbs[i] << endl;
    //}
    //cout << head->getLeftChild()->getID() << endl;
    //cout << head->getRightChild()->getID() << endl;
 
    //cout << endl << head->getLeftChild().getID() << endl;
    //head->setLeftChild(c);
    //cout << head->getLeftChild().getID();
 
    //cout << head->getLeftChild().getID() << endl;
 
    cin >> wait;
    return 0;
 
}
 
void makeTree(vector<subscriber> sbs, subscriber head) {
 
    subscriber* curP;
 
    cout << &sbs[1] << endl;
 
    for (int i = 1; i < sbs.size(); i++) {
        
        cout << i << endl;
 
        while (true) {
            
            
 
            curP = &head;
            
 
            //if sbs[i]'s ID less than current pointers ID
            
            if (sbs[i].getID() < curP->getID()) {
                cout << "PASSED_1" << endl;
                //and if current pointer have no child
                if (curP->hasLeft == false) {
                    cout << "PASSED_1_1 (break)" << endl;
                    curP->hasLeft = true;
                    curP->setLeftChild(sbs[i]); // set child
                    cout << &curP->getLeftChild() << endl; 
                    break; // exit cycle
                    // else if it has child
                } else {                    
                    cout << "PASSED_1_2" << endl;
                    curP = &curP->getLeftChild(); //set new current pointer and try cycle again <-- PROBLEM 
                    //cout << curP->getID() << endl;
                }
            } else { // if sbs[i]'s ID equals or greather than current pointers ID
 
                cout << "PASSED_2" << endl;
                if (curP->hasRight == false) {
                    curP->hasRight = true;
                    curP->setRightChild(sbs[i]); // set child
                    cout << curP->getID() << endl;
                    cout << "PASSED_2_2 (break)" << endl;
                    break; // exit cycle
                    // else if it has child
                } else {
                    curP = &curP->getRightChild(); //set new current pointer and try cycle again
                }
                
            }
 
        Sleep(1000);    
                        
        }
        
 
        
 
    }
 
    cout << "Complited";
    //cout << sbs[2].getLeftChild().getID() << endl;
    //cout << curP->getLeftChild().getID() << endl;
 
}
Помогите решить проблему
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2010, 16:16     Бинарное дерево, поинтеры
Посмотрите здесь:

C++ Бинарное дерево
C++ Бинарное дерево
Бинарное дерево C++
Бинарное дерево C++
бинарное дерево C++
Бинарное дерево C++
Бинарное дерево C++
C++ Бинарное дерево

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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