Англо-русский словарь построен в виде вдоичного дерева.
Каждая компонента содержит английское слово, соответствующее ему русское слово и счетчик количества обращений к данной компоненте.
Первоначально дерево формируется в порядке английского алфавита. В процессе эксплуатации словаря при каждом обращении к компоненте к счетчику обращений прибавляется единица.
Написать программу, которая:
1) обеспечивает начальный ввод словаря с конкретными значениями счетчика обращений;
2) формирует новое представление словаря в виде двоичного дерева по следующему алгоритму:
а) в старом словаре ищется компонента с наибольшим значением счетчика обращений;
б) найденная компонента заносится в новый словарь и удаляется из старого;
в) переход к пункту а) до исчерпания исходного словаря.
3) Производит вывод исходного и нового словарей.
Программа должна обеспечивать диалог с помощью меню и кантроль ошибок при вводе.
Попыталась еёрешить и вот во что это вылилось…
Код программы:
line.h
struct Node
{
char English[20];
char Russian[20];
int K;
Node* left;
Node* right;
};
Node* first(char* Eng,char* rus,int);
Node* search_insert(Node* root,char* Eng,char* rus,int);
void print_tree(Node*,int lev);
line.cpp
#include "line.h"
#include <iostream>
using namespace std;
Node* first(char* Eng,char* rus, int k)
{
Node* pv=new Node;
strcpy(pv->English,Eng);
pv->English[strlen(Eng)+1]='\0';
strcpy (pv->Russian,rus);
pv->Russian[strlen(rus)+1]='\0';
pv->K=k;
pv->left=0;
pv->right=0;
return pv;
}
Node* search_insert(Node* root,char* word,char*rus,int k)
{
Node* pv=root;
Node* prev;
bool flag=false;
while(pv&&!flag)
{
prev=pv;
if(word==pv->English)flag=true;
else if(pv->K<prev->K)pv=pv->left;
else pv=pv->right;
}
if(flag) return pv;
Node* pnew=new Node;
strcpy(pnew->English,word);
pnew->English[strlen(word)+1]='\0';
strcpy(pnew->Russian,rus);
pnew->Russian[strlen(rus)+1]='\0';
pnew->K=k;
pnew->left=0;
pnew->right=0;
if(pnew->K<prev->K)
prev->left=pnew;
else prev->right=pnew;
return pnew;
}
void print_tree(Node* root,int level)
{
if(root)
{
print_tree(root->left,level+1);
for(int i=0;i<level;i++) cout<<"";
cout<<root->English<<endl;
cout<<root->Russian<<endl;
cout<<root->K<<endl;
print_tree(root->right,level+1);
}
}
main.cpp
#include<iostream>
#include<conio.h>
#include"line.h"
#include<windows.h>
using namespace std;
char* Rus (const char*);
void main()
{
int i,K;
char text1[20];
char text2[20];
Node *root,*root1;
for(i=1;i<=5;i++)
{
cout<<Rus("Введите английские слова:");
cin>>text1;
cout<<Rus("Введите русские слова:");
cin>>text2;
cout<<Rus("Введите количество обращений:");
cin>>K;
if(i==1) root=first(text1,text2,K);
else search_insert(root,text1,text2,K);
}
print_tree(root,0);
getch ();
}
char Bufrus[256];
char* Rus(const char* text)
{
CharToOemA(text,Bufrus);
return Bufrus;
}
смогла только вывести дерево ….. дальше вообще запуталась!!!!
ПОМОГИТЕ
14 ноября 2009 в 0:03
эх….профессия у меня такая…
я знаю что смогу…..вот и все!
14 ноября 2009 в 0:02
Как это никуда не дется? Подходишь к декану и цитируешь меня. И в тот-же день становишься свободным человеком, которому не надо ни знать C++, ни что такое бинарное дерево.
13 ноября 2009 в 23:05
то что уже3 курс… и не куда не дется
13 ноября 2009 в 23:02
#11 интересно, что мешает?
13 ноября 2009 в 21:03
Хотя похоже, что у тебя дерево вообще не строится неправильно, т.к. в search_insert написано
prev=pv;
if(word==pv->English)flag=true;
else if(pv->K<prev->K)pv=pv->left; // вот тут prev == pv
else pv=pv->right;
13 ноября 2009 в 21:03
короче..забили!!
всем спс…
13 ноября 2009 в 21:02
народ….я это то сделала с трудом….мне препод разрешил еще сней помучиться….потому что так все правильно…
но вдруг, до менй еще что дойдет, а у меня голова вообще не вариТ!!!!
13 ноября 2009 в 21:02
Я (или ты) не совсем понял задание, во-первых написано, что "Первоначально дерево формируется в порядке английского алфавита", а у тебя дерево строится в порядке счетчика обращений. По-моему это не правильно.
13 ноября 2009 в 21:01
Солныфко, а может ну его нах этот С++? )
13 ноября 2009 в 21:01
ох….Алексей, я бы с удоволствием…но не могу!
13 ноября 2009 в 21:01
а может из xml файла лучше читать словарик, ато тестирование напряжное будет
13 ноября 2009 в 20:05
=)
13 ноября 2009 в 20:05
где отступы сделать??!
везде?!
я не догоняю…
13 ноября 2009 в 20:04
Я же с отступами просил
13 ноября 2009 в 20:03
спс..щя так и сделаю
13 ноября 2009 в 20:03
//pastie.org/697549
13 ноября 2009 в 20:02
Просто вставь в окошеко код, который ты вставила сюда(только с отступами), выбери язык C++, и нажми paste. А сюда выложи ссылку на получившуюся страницу.
13 ноября 2009 в 20:01
Если не сложно, можеш выложить исходники, например на //pastie.org/ , а то здесь они совсем нечитаемые.
13 ноября 2009 в 20:01
не поняла…это как??!
до такого я еще не доросла((!