Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2018, 16:23   #1
MerrinZ
Новичок
Джуниор
 
Регистрация: 27.05.2018
Сообщений: 1
По умолчанию Англо-русский словарь в виде двоичного дерева

Код:
#include "stdafx.h"
#include "windows.h"
#include <cstdlib>
 
#include <math.h>
#include <iostream> 
#include <string> 
using namespace std;
#pragma hdrstop 
//#pragma argsused 
using std::string;
using std::cout;
using std::endl;
using std::cin;
// Структура: 
struct tree
{
    string eng;            //английское слово 
    string rus;            //русский перевод 
    int count;             //количество обращений 
    tree *left;
    tree *right;
};
string temp_eng;
string temp_rus;
int temp_count;
int level = 0;
 
// Функция создания первого элемента 
tree *first(string eng, string rus, int count);
// Функция поиска и добавления элемента 
tree *search_insert(tree *root, string eng, string rus, int count);
 
// Функция показа дерева 
void print_tree(tree *p, int level);
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    int vibor;
    tree *root = NULL;
    do {
        cout << "Нажмите: " << endl;
        cout << "1| Добавить слово и его перевод в словарь" << endl;
 
        cout << "2| Выход" << endl;
        cout << "3| Вывести дерево на экран" << endl;
        cout << "4) Ввести английское слово и искать его перевод" << endl;
        cout << "5) Удалить слово из словаря" << endl;
        cin >> vibor;
        switch (vibor)
        {
        case 1: {cout << "Введите английское слово: " << endl;
            cin >> temp_eng;
            cout << "Введите русское слово: " << endl;
            cin >> temp_rus;
            cout << "Введите значение счетчика: " << endl;
            cin >> temp_count;
            //создание первого элемента дерева 
            if (!root) root = first(temp_eng, temp_rus, temp_count);
            //создание элементо-потомков дерева 
            else root = search_insert(root, temp_eng, temp_rus, temp_count);
 
        };
                break;
        case 2: return 0; break;
        case 3: print_tree(root, 0); break;
        default: cout << "Нужно нажать клавишу от 1 до 5" << endl;
            break;
        }
    }
 
    while (vibor != 3);
    system("pause");
    return 0;
}
 
//--------------------------------------------------------------------------- 
// Функции программы: 
// Функция фрмирования первого элемента дерева: 
tree *first(string temp_eng, string temp_rus, int count)
{
    tree *pv = new tree;
    pv->eng = temp_eng;
    pv->rus = temp_rus;
    pv->count = temp_count;
    pv->left = 0;
    pv->right = 0;
    return pv;
}
// Функция поиска и добавления элемента в дерево: 
tree *search_insert(tree *root, string temp_eng, string temp_rus, int temp_count)
{
    
    tree *pv = root, *prev;
    bool found = false;
    //поиск по дереву 
    prev = pv;
    while (pv && !found) {
    
        if (temp_eng == pv->eng) found = true;
        else if (temp_count < pv->count) pv = pv->left;
        else pv = pv->right;
    }
    if (found) return pv;
    //создание нового узла 
    tree *pnew = new tree;
    pnew->eng = temp_eng;
    pnew->rus = temp_rus;
    pnew->count = temp_count;
    pnew->left = 0;
    pnew->right = 0;
    if (temp_count < prev->count) prev->left = pnew; //присоединение к левому поддереву предка 
    else prev->right = pnew;                    //присоединение к правому поддереву предка 
    return pnew;
}
// Функция показа дерева 
void print_tree(tree *p, int level)
{
    if (p)
    {
        print_tree(p->left, level + 1);
        for (int i = 0; i<level; i++)
            cout << "   ";
        cout << p->eng;
        for (int i = 0; i<level; i++)
            cout << "   ";
        cout << p->rus;
        for (int i = 0; i<level; i++)
            cout << "   ";
        cout << p->count;
        print_tree(p->right, level + 1);
    }
}
Осталось добавить удаление элемента и поиск русского слова по введенному английскому слову.

Код:
#include <iostream>
#include <cstdlib>
 
struct Tree {
    int   val;
    Tree* left;
    Tree* right;
};
 
Tree* InsertNode(Tree* node, int val);
void  PrintNode(std::ostream& _out, const Tree* node);
void  ClearNode(Tree* node);
 
 
//удаление
Tree* DeleteNode(Tree* node, int val){
    if(node == NULL)
        return node;
 
    if(val == node->val){
 
        Tree* tmp;
        if(node->right == NULL)
            tmp = node->left;
        else {
 
            Tree* ptr = node->right;
            if(ptr->left == NULL){
                ptr->left = node->left;
                tmp = ptr;
            } else {
 
                Tree* pmin = ptr->left;
                while(pmin->left != NULL){
                    ptr  = pmin;
                    pmin = ptr->left;
                }
                ptr->left   = pmin->right;
                pmin->left  = node->left;
                pmin->right = node->right;
                tmp = pmin;
            }
        }
 
        delete node;
        return tmp;
    } else if(val < node->val)
        node->left  = DeleteNode(node->left, val);
    else
        node->right = DeleteNode(node->right, val);
    return node;
}
 
 
int main(void){
    Tree* tree = NULL;
    for(int i = 0; i < 20; ++i)
        tree = InsertNode(tree, std::rand() % 10);
    
    PrintNode(std::cout, tree);
    std::cout << std::endl;
 
    tree = DeleteNode(tree, 5);
    tree = DeleteNode(tree, 2);
    tree = DeleteNode(tree, 9);
    
    PrintNode(std::cout, tree);
    ClearNode(tree);
    return 0;
}
 
 
//вставка
Tree* InsertNode(Tree* node, int val){
    if(node == NULL){
        node = new (std::nothrow) Tree();
        if(node != NULL){
            node->val  = val;
            node->left = node->right = NULL;
        }
        return node;
    }
 
    if(val < node->val)
        node->left  = InsertNode(node->left, val);
    else
        node->right = InsertNode(node->right, val);
    return node;
}
 
//печать
void PrintNode(std::ostream& _out, const Tree* node){
    if(node != NULL){
        if(node->left != NULL)
            PrintNode(_out, node->left);
 
        _out << node->val << ' ';
 
        if(node->right != NULL)
            PrintNode(_out, node->right);
    }
}
 
//удаление всего
void ClearNode(Tree* node){
    if(node != NULL){
        if(node->left != NULL)
            ClearNode(node->left);
        if(node->right != NULL)
            ClearNode(node->right);
        delete node;
    }
}
Как этот пример переделать под мой код?
MerrinZ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
англо-русский переводчик abab Помощь студентам 0 30.12.2011 19:41
Англо-русский словарь на делфи! nelly.nelly Помощь студентам 3 15.05.2011 13:39
англо-русский словарь в txt the_deer_one Свободное общение 4 19.04.2011 19:24
Как сделатьформирование данных в виде двоичного дерева? T@tali Общие вопросы C/C++ 3 29.12.2010 19:20
англо - русский словарь в txt или в Accesse! ! IT-man Свободное общение 3 07.04.2009 20:40