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.