Динамическая структура : бинарное дерево. Требуется помощь в поиске ош

Тема в разделе "Общие вопросы по С и С++", создана пользователем llerik, 13 май 2008.

  1. llerik

    llerik Гость

    Дали задание:
    Англо-русский словарь построен в виде вдоичного дерева.
    Каждая компонента содержит английское слово, соответствующее ему русское слово и счетчик количества обращений к данной компоненте.
    Первоначально дерево формируется в порядке английского алфавита. В процессе эксплуатации словаря при каждом обращении к компоненте к счетчику обращений прибавляется единица.
    Написать программу, которая:
    1) обеспечивает начальный ввод словаря с конкретными значениями счетчика обращений;
    2) формирует новое представление словаря в виде двоичного дерева по следующему алгоритму:
    а) в старом словаре ищется компонента с наибольшим значением счетчика обращений;
    б) найденная компонента заносится в новый словарь и удаляется из старого;
    в) переход к пункту а) до исчерпания исходного словаря.
    3) Производит вывод исходного и нового словарей.
    Программа должна обеспечивать диалог с помощью меню и кантроль ошибок при вводе.

    Попытался его решить и вот во что это вылилось...
    Код программы:
    [codebox]#include <vcl.h>
    #include <iostream.h>
    #include <string.h>
    #pragma hdrstop
    #pragma argsused
    using namespace std;
    // Структура:
    struct tree
    {
    string eng; //слово
    int count; //количество обращений
    tree *left;
    tree *right;
    };
    string temp_eng;
    int temp_count;
    const int level=0;
    // Функция поиска и добавления элемента
    tree *search_insert (tree *root, string eng, int count);
    // Функция показа дерева
    void print_tree (tree *p, int level);
    //---------------------------------------------------
    // Главная функция:
    int main()
    {
    int vibor;
    tree *root=NULL;
    do {
    cout<<"Najmite: "<<endl;
    cout<<"1| Dobavit slovo v slovar"<<endl;
    cout<<"2| Vihod"<<endl;
    cin>>vibor;
    switch (vibor)
    {
    case 1: {cout<<"Vvedite angliskoe slovo: "<<endl;
    cin>>temp_eng;
    cout<<"Vvedite znachenie schetchika: "<<endl;
    cin>>temp_count;
    //создание дерева
    root=search_insert (root, temp_eng, temp_count);
    print_tree (root, level);
    }; break;
    case 2: break;
    default: return 1;
    }
    }
    while (vibor!=2);
    delete root;
    return 0;
    }
    // Функция поиска и добавления элемента в дерево:
    tree *search_insert (tree *root, string temp_eng, int temp_count)
    {
    tree *pv, *prev;
    bool found=false;
    pv=root;
    //поиск по дереву:
    while (pv!=0 && found==false) {
    prev=pv;
    if (temp_eng==pv->eng) found = true;
    else if (temp_count < pv->count) pv=pv->left;
    else pv=pv->right;
    }
    if (found==true) return pv;
    //создание нового узла
    tree *pnew=new tree;
    pnew->eng=temp_eng;
    pnew->count=temp_count;
    pnew->left=0;
    pnew->right=0;
    if (pv!=0) {if (temp_count < prev->count)
    prev->left=pnew; //присоединение к левому поддереву предка
    else prev->right=pnew;} //присоединение к правому поддереву предка
    return pnew;
    }
    // Функция показа дерева
    void print_tree (tree *p, int level)
    {
    //не равно 0:
    if (p!=0)
    print_tree(p->left, level+1);
    for (int i=0; i<level; i++)
    cout<<" ";
    //не равно 0:
    if (p!=0)
    cout<<p->eng<<" "<<'('<<p->count<<')'<<endl<<endl;
    //равно 0:
    else cout<<'@'<<endl<<endl;
    if (p!=0) print_tree (p->right, level+1);
    }[/codebox]
    Теперь о том, что здесь написано, что получается и что должно получиться:

    Приведенный выше код у меня работает, т.е. запускается.
    И так, после запуска программы на экране появляется:
    Najmite:
    1| Dobavit slovo v slovar
    2| Vihod
    //Жмем 1
    Vvedite angliskoe slovo:
    //вводим абракадабру, для экономии времени (на англ. раскладке), вида: "dkgdsgkds" (без кавычке)
    Vvedite znachenie schetchika:
    //вводим число, например 45
    //Появляется результат (т.е. полученное дерево) вида:
    Код (Text):
            @
    dkgdsgkds (45)
    @
    //Значком "@" я решил обозначить "пустых потомков", или их отсутствие, иначе говоря.
    //После чего можно повторить то же самое, в результате мы всегда будем получать то, что ввели в последний раз.

    В идеале это должно было бы выгледеть примерно так:
    Код (Text):
                    @
    ldkghld (12)         
    @
    dkgdsgkds (45)
    @        
    dkghdk (60)
    @
    И как всегда два вопроса: кто виноват и что делать?
    P.S. Работаю в Builder С++ 6.0 (компилятор по дефолту).
     
Загрузка...

Поделиться этой страницей