Drzewo slownikowe

0

Witam
Mam problem z pewnym zadankiem ktore dotyczy drzewa slownikowego. Tworze strukture , w ktorej zawartejest 26 liter alfabetu oraz w kazdym jednym wezle jest jeszcze flaga konac ktora oznacza czy w danym miejscu konczy sie jakis wyraz czy nie. Jesli sie konczy nie znaczy , ze nic dalej nie ma tylko tyle, ze istnieje dokladnie taki wyraz. np jesli mam wpisane w drzewo wyraz abba oraz ab, to jest mniej wiecej tak korzen->a(koniec = 0)->b(koniec = 1)->b(koniec = 0)->a(koniec = 1) Mianowicie, udalo mi sie zaimplementowac tworzenie struktury jednak nadal mam problem z wypisywaniem. Ogolnie probowalem robic to ze stosem, z rekurencja oraz iteracyjnie. Npoczatek potrzebuje jakos wypisac cale drzewo majac wskaznik na dany wezel tego drzewa, pozniej juz bedzie z gorki. Zamieszcze ponizej kod tego co zrobilem, moze ktos ma jakis pomysl.

#include <iostream>
#include <string>
using namespace std;

struct slownik{
slownik *t[26];
int koniec;
};

int do_indeksu(char litera); // zamiana litery na kod ASCII
char do_znaku(int indeks);
slownik *nowyElement();
void dodaj(char *slowo,slownik *s); // wskaznik na pierwszy element
void odnajdz (int slowo[256], slownik *korzen);
void wypisz(int slowo[256], slownik *wsk);

int main()
{
int t,k,z;
char slowo[256];
int slowoInt[256];

slownik *korzen = nowyElement();		// tworze korzen drzewa

cin>>t;
for(t;t > 0; t--)
{
	cin>>k;						// slow kluczowych
	cin>>z;						// zapytan uzytkownika
	for(k; k > 0; k--)			// podawanie argumentow
	{
		cin>>slowo;
		dodaj(slowo,korzen);
	}

	cout<<"---"<<endl;

for(int x = 0; x < 256;x++)			// wstawiam wszedzie null aby pozniej w petli wiedziec do ktorego momentu zamieniac indeksy
{
	slowo[x] = NULL;
	slowoInt[x] = NULL;
}

	for(z; z > 0; z--)
	{
		cin>>slowo;
		for(int x = 0; slowo[x] != NULL ;x++)
		{
			int asd = do_indeksu(slowo[x]);
			slowoInt[x] = do_indeksu(slowo[x]);
		}
		odnajdz(slowoInt,korzen);				// zaczynam wyszukiwanie podanego slowa , podaje adres korzenia + int'owe odpowiedniki slowa
	}
	
}
return 0;

}

//******************************************************************************************************************************
int do_indeksu(char litera) // zamiana litery na kod ASCII
{
return (litera - 97);
}
//******************************************************************************************************************************

char do_znaku(int indeks) // zamiana kodu ASCII na litere
{
//char slowo = indeks + 97
return (indeks + 97);
}
//******************************************************************************************************************************

slownik nowyElement(){ // tworze nowy element
slownik temp = new slownik;
for(int i = 0; i < 26; i++)
{
temp->t[i] = NULL;
}
temp->koniec = NULL;
return temp; // zwracam wartosc typu slownik
}
//
****************************************************************************************************************************

void dodaj(char slowo,slownik s) // wskaznik na pierwszy element
{
for(int i = 0; i < strlen(slowo);i++ )
{
int pos = do_indeksu(slowo[i]); // dodajemy po literach, funkcja do indeksu przeksztalca literke do indeksu w tabicy np z = 25
if(s->t[pos] != NULL) // wskaznik s, na poczatku pokazuje na korzen,
{
s = s->t[pos]; //jezeli rozne od nulla to tam sie przemieszczamy
}
else
{
slownik temp = nowyElement(); // tworzymy nowy element
s->t[pos] = temp; // s staje sie z NULLa rodzicem , ma syna t
s = s->t[pos]; // s pokazuje na syna
}
}
s->koniec = 1; // jezeli petla sie skonczy, to s wskazuje na element ostatni- znacznik konca
}
//
***************************************************************************************************************************

Jesli chodzi o funkcje do indeksu i do znaku to mam to zrobione w ten sposob , ze konweruje odpowiednie litery na inty iprzy wypisywaniu robilbym to samo w druga strone. Naturalnie to co podalem wyzej , jest sprawdzone i dziala prawidlowo.

0

Może Ci się przyda:

#include <iostream>
#include <cctype>

using namespace std;

const int n = 29;

typedef struct dictionary {
    struct dictionary *t[n];
} Uss, *Uss_ptr;

int to_index(char c);
char from_index(int n);
void save(char *word, Uss_ptr p);
void print(Uss_ptr p);
void find(char *word, Uss_ptr p);

int main() {
    int i;
    char content[100];
    Uss_ptr p = new Uss;
    for(i = 0; i < n; p->t[i++] = NULL);
    for(i = 1; i <= 9; i++) {
        cout << "Podaj slowo, ktore mam umiescic w slowniku:";
        cin >> content;
        save(content, p);
    }
    print(p);
    for(i = 1; i <= 4; i++) {
        cout << "Podaj slowo, ktorego mam poszukac w slowniku:";
        cin >> content;
        find(content, p);
    }
    return 0;
}

int to_index(char c) {
    if (c <= 'Z' && c >= 'A' || c <= 'z' && c>= 'a') {
        return toupper(c) - 'A';
    } else {
        if(c == ' ') return 26;
        if(c == '-') return 27;
    }
}

char from_index(int n) {
    if(n >= 0 && n <=('Z'-'A')) {
        return toupper((char) n+ 'A');
    } else {
        if(n == 26) return ' ';
        if(n == 27) return '-';
    }
}

void save(char *word, Uss_ptr p) {
    Uss_ptr q;
    int pos;
    for(int i = 1; i <= strlen(word); i++) {
        pos = to_index(word[i-1]);
        if(p->t[pos] != NULL) {
            p = p->t[pos];
        } else {
            q = new Uss;
            p->t[pos] = q;
            for(int k = 0; k < n; q->t[k++] = NULL);
            p = q;
        }
    }
    p->t[n-1] = p;
}

void print(Uss_ptr p) {
    for(int i = 0; i < 26; i++) {
        if(p->t[i] != NULL) {
            if((p->t[i])->t[n-1] == p->t[i]) {
                cout << from_index(i) << endl << " ";
            } else {
                cout << from_index(i);
            }
            cout << "-";
            print(p->t[i]);
        }
    }
}

void find(char *word, Uss_ptr p) {
    int test = 1;
    int i = 0;
    while((test == 1) && i < strlen(word)) {
        if(p->t[to_index(word[i])] == NULL) {
            test = 0;
        } else {
            p = p->t[to_index(word[i++])];
        }
    }
    if(i == strlen(word) && p->t[n-1] == p && test) {
        cout << "Slowo znalezione!\n";
    } else {
        cout << "Slowo nie zostalo znalezione w slowniku\n";
    }
}


1 użytkowników online, w tym zalogowanych: 0, gości: 1