Есть программа в которой мне нужно построить бинарное дерево. Элементы добавляются, всё вроде бы шикарно, но когда я начинаю обходить дерево, почему-то в корне остаётся только 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;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как вычислить площадь и периметр треугольника по 3 сторонам? Проверить возможно ли его создать?
Здравствуйте, третий час сижу и не могу понять, выдает ошибку при выходе из функции Get_write, помогите пожалуйста!
Вопрос на счет подключения своих классов в cli, есть код, и при подключении класса с интами все хорошо, но при попытке подключить со string выдает...