Не пишется бинарное дерево

227
18 мая 2018, 19:30

Есть программа в которой мне нужно построить бинарное дерево. Элементы добавляются, всё вроде бы шикарно, но когда я начинаю обходить дерево, почему-то в корне остаётся только 1ая запись, а ссылки на left/right пустые. Вопрос, в связи с чем такое недоразумение произошло и как его поправить? Код:

            // Dinamic_Structure.cpp: определяет точку входа для консольного приложения.
            //
            /*
            на междугородней телефонной станциикартотека абонентов, содержащая сведения о телефонах и их владельцах, организована как двоичное дерево.
            Составить программу которая
             - Обеспечивает начальное формирование дерева
             - производит вывод картотеки
             - выводит номер телефона и время разговора
             - выводит извещение на оплату телефонного разговора
             сделать меню и обеспечить контроль ошибок
             //Не пишутся данные в листья дерева
             */
            #include "stdafx.h"
            #define _CRT_NONSTDC_NO_WARNINGS
            #define _CRT_SECURE_NO_WARNINGS
            #pragma warning(disable : 4996)
            #include <cstdlib>
            #include <iostream>
            #include <Windows.h>
            #include <iomanip>
            using namespace std;
            //обьявление элемента дерева
            typedef struct element
            {
                bool need_pay = true;
                char phone_number[11]; //телефонный номер
                int time; //время разговора 
                //int count
                struct element *left, *right; // ссылка на левого и правого потомка
            } element;
            //рекурсивное удаление дерева. очистка памяти
            void distruct(element **q)
            {
                if (*q != NULL)
                {
                    //рекурсивно бежим по элементам дерева и очищаем память
                    distruct(&((*q)->left));
                    distruct(&((*q)->right));
                    free(*q);
                }
            }
            //рекурсивная печать дерева слева на право.
            void print_tree(element *q)//здесь была n - расстояние отступа
            {
                if (q != NULL)
                {
                    print_tree(q->left);
                    cout << setw(2) << q->phone_number << endl << q->time << endl << q->need_pay;
                    print_tree(q->right);
                }
            }
            //функция поиска элемента с максимальным счетчиком обращений
            void touch_node(element **q, char *phone)
            {
                if (*q != NULL)
                {
                    long i = 0;
                    touch_node(&((*q)->right), phone);
                    //функция обращения к элементу, по его английскому названию, бежим по дереву, ищем элемент str, если таковой есть то увеличиваем счетчик обращений на 1
                    if (!strcmp((*q)->phone_number, phone))
                    {
                        cout << setw(3) << (*q)->phone_number << (*q)->time;
                        if ((*q)->need_pay) cout << "   " << "customer must pay" << endl;
                    }
                    touch_node(&((*q)->left), phone);
                }
            }
            //функция добавления элемента в дерево
            struct element *addtree(struct element *p, char *number, int _time) {
                //int cond;
                if (p == NULL) {
                    p = (struct element *)malloc(sizeof(struct element));
                    strcpy(p->phone_number, number);
                    //p->count = 1;
                    p->time = _time;
                    if (_time != 0)
                        p->need_pay = true;
                    else p->need_pay = false;
                    p->left = p->right = NULL;
                }
                else
                {
                    if (p->phone_number[0] > number[0])
                    {addtree(p->left, number, _time);}
                    else
                    {addtree(p->right, number, _time);}
                }
                return p;
            }
            //функция бежит по дереву, в поиске элемента с максимальным ключем, т.к дерево поиска, то смотрим справа
            element *last(element *q)
            {
                if (q == NULL)
                    return NULL;
                else
                if (q->right == NULL)
                    return q;
                else
                    return last(q->right);
            }
            void delete_node(element **q, char *number)
            {
                element *t;
                if (*q != NULL)
                {
                    if ((*q)->phone_number[0] > number[0]) // рекурсивно ищем элемент по ключу
                        delete_node(&((*q)->left), number);//наглядно показно как работает дерево поиска проверяем ключ элемента. если он меньше текущего элемента,то ищем слева
                    else // иначе ищем справа
                    if ((*q)->phone_number[0]<number[0])
                        delete_node(&((*q)->right), number);
                    else // иначе элемент найден
                    {
                        if ((*q)->left == NULL)
                        {
                            t = *q;
                            *q = (*q)->right;
                            free(t);
                        }
                        else
                        if ((*q)->right == NULL)
                        {
                            t = *q;
                            *q = (*q)->left;
                            free(t);
                        }
                        else
                        {
                            t = last((*q)->left);
                            strcpy((*q)->phone_number, t->phone_number);
                            (*q)->time = t->time;
                            (*q)->need_pay = t->need_pay;
                            delete_node(&((*q)->left), t->phone_number);
                        }
                    }
                }
            }
            void print_menu()
            {
                printf("1 - Ввести элемент\n");
                printf("2 - Показать дерево\n");
                printf("3 - Посмотреть элемент по английскому слову\n");
                //printf("4 - Запустить спец. алгоритм обработки дерева\n");
                //printf("5 - Удалить узел\n");
                printf("6 - Выход\n");
            }
            //функция проверки корректности введеных данных, нужно доработать.
            bool is_correct_data(char *str)
            {
                if ((int)str[0] == 0) return false;
                else
                return true;
            }
            int main(int argc, char *argv[])
            {
                SetConsoleCP(1251);
                SetConsoleOutputCP(1251);
                char number[10];
                int time = 0;
                int command = 0;
                element *root_first = NULL;//указатель на корень первого дерева
                element *root_modified = NULL; // указатель на корень второго дерева
                //gets(str);   
                while (command != 6)
                {
                    print_menu();
                    fscanf(stdin, "%d", &command);
                    switch (command)
                    {
                    case 1:
                        printf("Example: phone number, time of speech\n");
                        cin >> number;
                        cin >> time;
                    //  if (is_correct_data(number))
                            root_first = addtree(root_first, number, time); // если введеные данные верны, то добавляем новый элемент
                    //  else
                //          printf("Data is incorrect. Example: phone number, time of speech\nd");
                        break;
                    case 2:
                        print_tree(root_first); // печатаем дерево 
                        if (root_modified != NULL)
                        {
                            printf("\n_________________________________________________________________________________");
                            print_tree(root_modified); // если существует второе дерево то печатаем и его
                        }
                        break;
                    case 3:
                        printf("Input phone number for watch customer card\n");
                        cin >> number;
                        touch_node(&root_first, number);
                        break;
                    case 5:
                        printf("Input phone number for destroying customer card\n");
                        cin >> number;
                        delete_node(&root_first, number);
                        break;
                    case 6:
                        return 0;
                        break;
                        print_menu(); // в конце любого действия печатаем заного меню, пока не получим команду выхода
                    }
                }
                //distruct(&root_first);
                //distruct(&root_modified);
                system("PAUSE");
                return EXIT_SUCCESS;
            }
READ ALSO
Площадь треугольника

Площадь треугольника

Как вычислить площадь и периметр треугольника по 3 сторонам? Проверить возможно ли его создать?

209
нарушение доступа для чтения с бинарным файлом

нарушение доступа для чтения с бинарным файлом

Здравствуйте, третий час сижу и не могу понять, выдает ошибку при выходе из функции Get_write, помогите пожалуйста!

208
Подключение класса в cli c++

Подключение класса в cli c++

Вопрос на счет подключения своих классов в cli, есть код, и при подключении класса с интами все хорошо, но при попытке подключить со string выдает...

242
Умные указатели. C++

Умные указатели. C++

Имеется такая иерархия классов:

213