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

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

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

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

08.07.2013, 23:30. Просмотров 380. Ответов 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 * +

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

не могу разобраться как написать функцию сортировки и исправить функцию добавления в стек - C++
#include <iostream> #include<Windows.h> using namespace std; struct NE{ int x; NE *pnext,*ppor,*cur;}; class SPISOK { NE...

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.07.2013, 10:43 #2
что-то не совсем понятно, по какому принципу строиться граф...
0
Александр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);
}
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.07.2013, 15:21 #4
Александр30, я имею ввиду результат построения. Что-то не совсем прослеживается зависимость.
0
Александр30
0 / 0 / 0
Регистрация: 06.06.2013
Сообщений: 14
09.07.2013, 20:43  [ТС] #5
xtorne21st, каждая внутренняя вершина дерева должна соответствовать одной из трех возможных арифметических операций и иметь значение –1 для операции сложения, –2 для операции вычитания и –3 для операции умножения; левое и правое дочерние поддеревья любой внутренней вершины-операции должны соответствовать выражениям слева и справа от знака операции; листьями полученного дерева должны быть выражения-цифры.
0
xtorne21st
интересующийся
304 / 275 / 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);
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2013, 01:20
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.07.2013, 01:20
Ответ Создать тему
Опции темы

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