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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Функция для простого числа http://www.cyberforum.ru/cpp-beginners/thread187513.html
В головной функции ввести массив чисел.И вывести количество простых чисел.Вот программа.Только почему-то, если она натыкается на составное число, а за ним есть еще простые, то те простые он не счиатет.никак не могу понять почему.вроде все верно.помогите разобраться. пожалуйста. int FunProstoe(int x ) {int i , k , n ; if (x==1) k=0 ; else { for(i=2; i<=sqrt(x) && n ;i++ ) { n=x%i ;...
C++ Сформировать строку, в которой слова из исходной строки упорядочены по алфавиту, удалив при этом лишние пробелы Вводится строка слов, разделенных пробелами (возможны лишние пробелы в начале и в конце строки и между словами). Сформировать строку, в которой слова из исходной строки упорядочены по алфавиту, удалив при этом лишние пробелы. Указание: для сравнения строк можно воспользоваться библиотечной функцией strcmp(s,s1). http://www.cyberforum.ru/cpp-beginners/thread187507.html
C++ Не могу додумать конец программы...
Доброго времени суток!) Задание заключается в том, что надо: Выяснить каким по счету стоит число 3. Если числа 3 нет, напечатать текст «числа три нет». Программу собственно почти сделал, но я не знаю как сделать, что бы после поиска числа 3, выводилось что «числа три нет». Ну вот сам код программы: //--------------------------------------------------------------------------- #pragma...
C++ массивы
1)Удалить из массива все нечётные числа и вывести размер полученного массива и его содержимое 2)Перед каждым положительным элементом массива вставить элемент с нулевым значением 3)Дан массив все элементы которого, за исключением одного упорядочены по убыванию. Сделать массив упорядоченным, переместив элемент, нарушающий упорядоченность на новую позицию. 4)Дан массив размера N. Осуществить...
C++ строки http://www.cyberforum.ru/cpp-beginners/thread187471.html
Помогите, пожалуйста решить задачу (сама не могу разобраться ) : Дан текст в строке. В случае, если встречается больше одного знака арифметической операции - уменьшить последовательность до одного
C++ Форматированный ввод данных в массив. Поиск среднего значения. Дана задача: Я выбрал задачу такую: есть 8 студентов, ими написано 4 экзамена. Нужно найти максимальную, минимальную оценки, а так же среднюю оценку для каждого студента и среднюю оценку для каждого экзамена. Как организовать форматированный ввод данных в массив (эти самые оценки в пределах от 0 до 100)? Как поправить программу, чтобы она считала среднюю оценку для каждого экзамена... подробнее

Показать сообщение отдельно
Пушкин
1 / 1 / 0
Регистрация: 26.10.2010
Сообщений: 8

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

07.11.2010, 16:16. Просмотров 413. Ответов 0
Метки (Все метки)

Попросили реализовать бинарную структуру, я вот пробую, в инете поискал - что это и как. Начал делать все с помощью поинтеров. Создаются объекты, добавляются в вектор и с помощью функции обрабатываются - назначаются левое и правое ответвления.

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

Там есть условие - если текущий поинтер содержит левое (например) ответвление, значит текущий поинтер заменяется этим ответвлением. И цикл повторяется, пока левое ответвление не будет равно 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;
 
}
Помогите решить проблему
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 21:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru