To zadanie oczywiście da się wykonać bez alokacji tablicy dynamicznej czy wektora. Jedyne wywołania new, będą występowały dla struktury node. Będzie także trzeba pamiętać o prawidłowym dodaniu słowa do drzewa. Stąd trzeba wczytać parę słów i następnie "związać je" w 2 drzewach. Strukturę obydwu drzew należy prawidłowo zniszczyć przed wyjściem z programu.
Kod ideowy (choć działa):
#include <fstream>
#include <iostream>
#include <tuple>
#include <utility>
struct node {
std::string word;
node * left;
node * right;
node * translate;
};
// Dodaje węzeł do drzewa
void insert_node_to_tree(node * word_node, node * word_tree) {
// FIXME: Wykonać poprawną implementację dodawania do słownika
// Ta jest _TOTALNIE_ nieprawidłowa. Dodaje ciągle do lewej gałęzi.
node * current_node = word_tree;
while(current_node->left != nullptr) {
current_node = current_node->left;
}
current_node->left = word_node;
}
void delete_tree(node * tree) {
// FIXME: Zaimplementować poprawne usunięcie drzewa
delete tree;
}
// Wyszukiwanie węzła w drzewie.
const node * find_node(const node * word_node, const node * word_tree) {
// FIXME: Zaimplementować poprawnie.
return nullptr;
(void) word_node;
(void) word_tree;
}
std::pair<node *, node*> read_words(std::ifstream& file) {
// Tworzenie 2 pierwszych węzłów które będą korzeniami drzew
node * pl_en_tree = new(std::nothrow) node();
node * en_pl_tree = new(std::nothrow) node();
// Wczytanie pierwszych 2 słów
file >> pl_en_tree->word >> en_pl_tree->word;
// Kontrola czy alokacja i stan strumienia umożliwia kontynuację
if(!file || (pl_en_tree == nullptr) || (en_pl_tree == nullptr)) {
delete pl_en_tree;
delete en_pl_tree;
return {};
}
// Budowanie słownika
std::string pl_word;
std::string en_word;
while(file >> pl_word >> en_word) {
node * pl_node = new node{pl_word, nullptr, nullptr, nullptr};
node * en_node = new node{en_word, nullptr, nullptr, nullptr};
// Wiązanie słów do translacji
pl_node->translate = en_node;
en_node->translate = pl_node;
insert_node_to_tree(pl_node, pl_en_tree);
insert_node_to_tree(en_node, en_pl_tree);
}
return {pl_en_tree, en_pl_tree};
}
int main() {
std::ifstream file("dictionary.txt");
if(!file) {
std::cerr << "Open file error!\n";
return -1;
}
node * pl_en_tree;
node * en_pl_tree;
std::tie(pl_en_tree, en_pl_tree) = read_words(file);
if((pl_en_tree == nullptr) || (en_pl_tree == nullptr)) {
delete pl_en_tree;
delete pl_en_tree;
std::cerr << "Tree construction error!\n";
return -1;
}
delete_tree(pl_en_tree);
delete_tree(en_pl_tree);
}
W FIXME widzisz części które trzeba implementować.