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

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

Войти
Регистрация
Восстановить пароль
 
NightVVanderer
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 16
#1

Почему программа "падает" на функции заполнения дерева? - C++

12.10.2013, 19:06. Просмотров 387. Ответов 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
#include "stdafx.h"
#include <iostream>
using namespace std;
 
struct Node //Звено дерева
{
   int x; //То, что записывается в дерево
   Node *l,*r; //Это указатели на новые звенья
};
 
 void Show(Node *&tree) //Вывод на экран дерева.
 
{
    if (NULL==tree)    return;    //Если дерева нет, выход
   
    cout<<tree->x<<endl; //Посещение узла
    Show(tree->l); //Обход левого поддерева   
    Show(tree->r); //Обход правого поддерева   
}
 
 
void add(int x,Node *&tree) //В функцию принимается записываемый элемент и указатель на ссылку на структуру.
{
    if (NULL==tree) //если ничего нет
    {
        tree=new Node; //выделить память 
        tree->l=tree->r=NULL; //очистка участков для роста
        tree->x=x; //записывание в звено данные 
    }
 
    else if (NULL==tree->l) add(x,tree->l); //если слева участок не занят, подзвено создается там 
    else add(x,tree->r); //если занят, подзвено создается справа
}   
 
void Fill(int m,Node *&tree) // Заполнение дерева
{
    if(tree->l==NULL && tree->r==NULL && tree->x<m) // Если у данного элемента дерева нет потомков и значение не превосходит максимум, то:
    {
        add(tree->x+1, *&tree); // Создать потомка от этого элемента, со значением элемент+1
        add(tree->x*2, *&tree); // Создать потомка от этого элемента, со значением элемент*2
    }
    Fill(m,tree->l); //Обход левого поддерева  
    Fill(m,tree->r); //Обход правого поддерева
}
 
int _tmain(int argc, _TCHAR* argv[])
{
      int k,max; 
      cout << "Kol-vo=";
      cin >> k;
      cout << "Max kol-vo=";
      cin >> max;
      Node *Tree=NULL;  //Создается указатель, тип которого = звено дерева и инициализируется пустотой
      add(k,Tree);
      Fill(max,Tree);
      Show(Tree); 
      delete Tree;
    return 0;
}
Проблема с функцией Fill. Что она должна делать: брать элемент дерева, начиная с первого, проверять есть ли у него потомки и не превосходит ли его значение заданного максимума, если потомков нет и значение не превосходит максимум, то она должна создать 2 потомка от этого элемента, один потомок со значением элемент+1, другой со значением элемент*2. Если одно из условий не выполняется она должна перейти к следующему элементу.
Код компилируется, но когда программа доходит до выполнения этой функции, то Windows(стоит Windows 7 Максимальная, х86) пишет "Прекращена работа программы". Подробности проблемы:
Сигнатура проблемы:
Имя события проблемы: APPCRASH
Имя приложения: ConsoleApplication3.exe
Версия приложения: 0.0.0.0
Отметка времени приложения: 52596e50
Имя модуля с ошибкой: ConsoleApplication3.exe
Версия модуля с ошибкой: 0.0.0.0
Отметка времени модуля с ошибкой: 52596e50
Код исключения: c0000005
Смещение исключения: 00014653
Версия ОС: 6.1.7600.2.0.0.256.1
Код языка: 1049
Дополнительные сведения 1: 0a9e
Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789
Дополнительные сведения 3: 0a9e
Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789

Подскажите, пожалуйста, почему так происходит, и как сделать что бы все работало правильно?

И вопрос: как выводить дерево на экран, так что бы оно на экране выглядело как дерево?
Как на картинке, например (начальное количество 4, макс 10)

Или выводить так что бы были видны все "пути" от корня к листьям? Например
4 5 6 7 8 9 10
4 5 10
4 6 12
4 8 9 10
4 8 9 18
4 8 16
0
Миниатюры
Почему программа "падает" на функции заполнения дерева?  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2013, 19:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему программа "падает" на функции заполнения дерева? (C++):

Почему "падает" программа - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; void vvodMas(int x, int n); void ydalenie(int x, int n); void...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

Странное поведение при работе со строками: почему программа выводит 8, если в input "МАКС"? - C++
Почему программа выводит 8, если в input: &quot;МАКС&quot;? #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;string.h&gt; using namespace...

Программа не "видит" класс. Почему? - C++
Задание: 2.15. Разработать класс Rectangle для работы с плоскими прямоугольниками, стороны которого параллельны осям координат. В качестве...

Почему переменная "d" не была удалена из стека после выхода из функции? - C++
Почему переменная &quot;d&quot; не была удалена из стека после выхода из функции? #include&quot;stdafx.h&quot; #include&quot;iostream&quot; using namespace std; ...

Вывод бинарного дерева на экран в виде "дерева" - C++
основная задача: подсчет количества листьев. проблема: при просмотре хочу выводить бин. дерево, в красивом виде, возможно использование...

1
Max Dark
шКодер самоучка
1849 / 1649 / 603
Регистрация: 09.10.2013
Сообщений: 3,676
Записей в блоге: 6
Завершенные тесты: 2
12.10.2013, 23:54 #2
нет проверки на tree == NULL

при x>=m происходит вызов Fill(m, NULL)
а это приводит к обращению (NULL)->l

Посмотрите в отладчике в пошаговом режиме
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2013, 23:54
Привет! Вот еще темы с ответами:

Подскажите почему может появляться ошибка: "неразрешенный внешний символ "_SDL_..."" - C++
Привет всем =) Скажите пожалуйста почему у меня пишет: 1&gt;SDL.obj : error LNK2001: неразрешенный внешний символ &quot;_SDL_CreateCursor&quot; ...

Почему не работает функция std::regex_replace(temp,"amp;",""); - C++
Пробую вызывать функцию std::regex_replace(temp,&quot;amp;&quot;,&quot;&quot;); Пишет ошибку: test_ok_ruDlg.cpp 1&gt;d:\visual studio...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Почему вместо обратного слеша "\" выводит "¥" - C++
Компилятор напрочь отказывается ставить обратный слеша В других программах все работает нормально. VS community 2015 Загружайте...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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