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

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

Войти
Регистрация
Восстановить пароль
 
Александр30
0 / 0 / 0
Регистрация: 06.06.2013
Сообщений: 14
#1

Подскажите как исправить функцию - C++

08.07.2013, 23:30. Просмотров 377. Ответов 5
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
bool addNode(TNode *first, int key)
{
    TNode* tmp=first;
    if(tmp->Right)
        addNode(tmp->Right,key);
    else
        if(tmp->Data==-1||tmp->Data==-2||tmp->Data==-3)
        {
            tmp->Right=add(key);
            return true;
        }
        else
            if(tmp->Left)
                addNode(tmp->Left,key);
            else
                if((tmp->Data==-1||tmp->Data==-2||tmp->Data==-3))
                {
                    tmp->Left=add(key);
                    tmp->Left->Parent=tmp;
                    return true;
                }
}


+ это -1
- это -2
* это -3


Пример:
Дана строка: 5 6 7 + - 1 3 * +

Выход: дерево
Миниатюры
Подскажите как исправить функцию  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2013, 23:30     Подскажите как исправить функцию
Посмотрите здесь:

подскажите как исправить ошибки - C++
программы рабочие,но при компиляции в Borland C++ выдает кучу ошибок :С что делать? Error LAB8.CPP 1: Unable to open include file...

Подскажите как исправить код - C++
Исправить чтобы дважды не менялось одно и тоже поле #include <iostream> #include <ctime> #include <windows.h> using namespace std; ...

Подскажите как исправить код - C++
ТЗ: В матрице в строках с отрицательным элементом на главной диагонали найти наибольший элемент строки и минимум среди них Мой...

подскажите как исправить ошибку - C++
#include <stdio.h> #include <math.h> #include <conio.h> #define eps 1.e-6 double f_ln( double, double ); void main() ...

Подскажите как исправить ошибку - C++
Мужики, программы пишу на Dev-C++ И при любой программе выдаёт ошибку,как исправить это?

Подскажите, как исправить ошибку - C++
void crop(char *str) { while (*str) { char i = 'q'; if (*str == ' ') { *str = i; //ошибка здесь cout << str << '\n'; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.07.2013, 10:43     Подскажите как исправить функцию #2
что-то не совсем понятно, по какому принципу строиться граф...
Александр30
0 / 0 / 0
Регистрация: 06.06.2013
Сообщений: 14
09.07.2013, 14:32  [ТС]     Подскажите как исправить функцию #3
Я поисправил, разделил на 2 функции, но дерево не строиться полностью
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
bool addNodeRight(TNode *first, int key)
{
    TNode* tmp=first;
    if(tmp->Right)
        addNodeRight(tmp->Right, key);
    else
        if(tmp->Data==-1||tmp->Data==-2||tmp->Data==-3)
        {
            tmp->Right=add(key);
            tmp->Right->Parent=tmp;
            
            return true;
        }
        else
            addNodeLeft(tmp->Parent, key);
}
 
bool addNodeLeft(TNode *first, int key)
{
    TNode* tmp=first;
    if(tmp->Left)
        addNodeLeft(tmp->Left, key);
    else
        if((tmp->Data==-1||tmp->Data==-2||tmp->Data==-3))
        {
            tmp->Left=add(key);
            tmp->Left->Parent=tmp;
            return true;
        }
        else
            addNodeLeft(tmp->Parent->Parent, key);
}
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.07.2013, 15:21     Подскажите как исправить функцию #4
Александр30, я имею ввиду результат построения. Что-то не совсем прослеживается зависимость.
Александр30
0 / 0 / 0
Регистрация: 06.06.2013
Сообщений: 14
09.07.2013, 20:43  [ТС]     Подскажите как исправить функцию #5
xtorne21st, каждая внутренняя вершина дерева должна соответствовать одной из трех возможных арифметических операций и иметь значение –1 для операции сложения, –2 для операции вычитания и –3 для операции умножения; левое и правое дочерние поддеревья любой внутренней вершины-операции должны соответствовать выражениям слева и справа от знака операции; листьями полученного дерева должны быть выражения-цифры.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2013, 01:20     Подскажите как исправить функцию
Еще ссылки по теме:

Подскажите как исправить ошибку - C++
писал программу по заданию и не могу понять где ошибка но у меня она решает не правильно Сформировать одномерный массив из целых чисел....

ошибка подскажите как исправить!! - C++
1>d:\calcu\calcu\Form1.h(343): error C3861: strtoint32: идентификатор не найден int a; int b; a =...

Подскажите как исправить ошибку - C++
Здравствуйте! Подскажите, как исправить ошибку при выполнении программы: #include <iostream> #include <stdarg.h> using namespace std;...

ошибка в функции подскажите как исправить - C++
в функции ввод списка с экрана, там был бесконечный цикл который прерывался операторов Break, препод сказал что это не грамотно прерывать...


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

Или воспользуйтесь поиском по форуму:
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
11.07.2013, 01:20     Подскажите как исправить функцию #6
При условии что -1, -2, -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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include <iostream>
#include <list>
#include <cctype>
 
struct Token_error {};
struct Range_error {};
 
struct TNode
{
    TNode* left;
    TNode* right;
    int val;
 
    TNode(int v) : left(0), right(0) { val = v; }
    TNode(int v, TNode* l, TNode* r) : val(v), left(l), right(r) {}
};
 
typedef std::list<TNode*> Ln;
 
void makeTokensList(const char* line, Ln& emptyList)
{
    const char* p = line;
    while (*p)
    {
        switch (*p)
        {
        case '+':
            emptyList.push_back(new TNode(-1));
            break;
        case '-':
            emptyList.push_back(new TNode(-2));
            break;
        case '*':
            emptyList.push_back(new TNode(-3));
            break;
        default:
            if (isdigit(*p))
            {
                emptyList.push_back(new TNode(*p - '0'));
            }
            else if (isspace(*p))
            {
                ++p;
                continue;
            }
            else
            {
                throw Token_error();
            }
            break;
        }
        ++p;
    }
}
 
void showThis(TNode* v)
{
    std::cout << v->val << ' ';
    std::cout.flush();
}
 
TNode* tryLex(const char* line)
{
    // First part.
    Ln x;
    const char* p = line;
 
    while (*p)
    {
        switch (*p)
        {
        case '+':
            x.push_back(new TNode(-1));
            break;
        case '-':
            x.push_back(new TNode(-2));
            break;
        case '*':
            x.push_back(new TNode(-3));
            break;
        default:
            if (isdigit(*p))
            {
                x.push_back(new TNode(*p - '0'));
            }
            else if (isspace(*p))
            {
                ++p;
                continue;
            }
            else
            {
                throw Token_error();
            }
            break;
        }
        ++p;
    }
 
    // Second part.
    Ln::iterator it = x.begin();
    Ln::iterator tm = it;
    while (1 < x.size())
    {
        if ((*it)->val == -1 || (*it)->val == -2 || (*it)->val == -3)
        {
            tm = it; ++tm;
            Ln::iterator right_node = it;
            --right_node;
            Ln::iterator left_node = right_node;
            --left_node;
 
            if (right_node == x.begin())
            {
               throw Range_error();
            }
 
            (*it)->right = *right_node;
            (*it)->left = *left_node;
            x.erase(right_node);
            x.erase(left_node);
 
            it = x.begin();
            while (it != x.end() && it != tm)
            {
                ++it;
            }
        }
        else
        {
            ++it;
        }
    }
 
    return *x.begin();
}
 
void show(TNode* root)
{
    if (!root)
    {
        return;
    }
 
    show(root->left);
    std::cout << root->val << ' ';
    show(root->right);
}
 
int main()
{
    const char* parseLine = "5 6 7 + - 1 3 * +";
    TNode* root = tryLex(parseLine);
    show(root);
}
Yandex
Объявления
11.07.2013, 01:20     Подскажите как исправить функцию
Ответ Создать тему
Опции темы

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