// trie.cpp (Uklada telefonni seznam do pismenkoveho stromu (trie) a pak v nem vyhledava.) // author: Acris #include "stdafx.h" #include #include #include #include #include using namespace std; class Nod { public: int znak; string cislo; vector deti; Nod() { for(int i= 0; i <= 26; i++) { deti.push_back(0); } cislo = "-"; } Nod(string telefon, int pismeno) { cislo = telefon; znak = pismeno; for(int i= 0; i <= 26; i++) { deti.push_back(0); } } ~Nod() { for(int i= 0; i <= 26; i++) { delete deti[i]; } } void pridejCislo(string telefon) { cislo = telefon; } }; Nod* root; int Znak(char c) { int aktZnak; if ( c == ' ') aktZnak = 26; else { if ( islower(c) ) { c = toupper(c); } aktZnak = (int)c - 'A'; } return aktZnak; } char NaZnak(int x) { char c; if ( x == 26 ) c = ' '; else c = (char)(x + 'A'); return c; } void Vloz(const string& jmeno, const string& tel) { int i=0; int aktZnak = Znak( jmeno.at(i) ); Nod* akt = root; while ( i < jmeno.size() ) { aktZnak = Znak( jmeno.at(i) ); if ( (*akt).deti.at(aktZnak) == 0 ) { (*akt).deti.at(aktZnak) = new Nod(); } akt = (*akt).deti.at(aktZnak); i++; } (*akt).cislo = tel; } Nod* Najdi(const string& jmeno) { //vraci 0, pokud tam neni int i=0; int aktZnak = Znak( jmeno.at(i) ); Nod* akt = root; while ( i < jmeno.size() ) { aktZnak = Znak( jmeno.at(i) ); if ( (*akt).deti.at(aktZnak) == 0 ) { cout << "Neni zaznam. " << endl; return 0; } akt = (*akt).deti.at(aktZnak); i++; } return akt; } void VypisPrefix( const string& prefix) { bool velke = true; for(int i=0; i < prefix.size(); i++) { if ( !velke && (prefix.at(i) != ' ') ) cout << (char)tolower(prefix.at(i)); else cout << prefix.at(i); if ( prefix.at(i) == ' ' ) velke = true; else velke = false; } } void Vypis(Nod* akt, string prefix) { if ((*akt).cislo != "-" ) { VypisPrefix(prefix); cout << "|" << (*akt).cislo << endl; } for(int i=0; i<= 26; i++) { if ( (*akt).deti.at(i) != 0 ) Vypis( (*akt).deti.at(i), prefix + (NaZnak(i)) ); } } void Hledej(const string& prefix) { Nod* muj = Najdi(prefix); if (muj != 0) Vypis(muj, prefix); } string Zpracuj(const string& retez) { string novy; for(int i=0; i< retez.size(); i++) { novy.push_back(toupper(retez.at(i))); } return novy; } int _tmain(int argc, _TCHAR* argv[]) { root = new Nod("-",'-'); /*Vloz("A","252"); Vloz("AB","2526"); Vloz("AC","25265"); Vloz("D","1526"); Vloz("ADC","2526");*/ //if (root != 0) Vypis(root, ""); /*Nod* muj = Najdi("AC"); if (muj != 0) cout << (*muj).cislo << endl;*/ //Hledej("A"); ifstream ifs("input.txt"); string radka; while ( getline(ifs, radka) ) { string::iterator b,e; b = radka.begin(); e = find( b, radka.end(), '|'); string jmeno(b,e); b = ++e; string tel(b,radka.end()); cout << jmeno << "|" << tel <