struktura słownikowa c++

0

Witam,
Właśnie zastanawiam się nad programem Uniwersalnej Struktury Słownikowej. Mam pytanie w jaki sposób można wypisywać wszystkie wyrazy które znajdują się w słowniku, tak żeby otrzymać całe wyrazy, a nie podzielone na litery?
Np. kiedy wpiszę do słownika wyrazy: ADAM i ADAMIAKOWA, po wypisaniu zawartości słownika przez metodę pisz_slownik1 otrzymuję:
ADAM
IAKOWA

A niestety, chciałbym aby pokazały się oba wyrazy. Moje pomysły się wyczerpały dlatego proszę o pomoc.

 
#include <iostream>
#include <cctype>
#include <cstring>

using namespace std;

const int n=29;

class slownik
{
	public: slownik *t[n];
};

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

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

void zapisz(char *slowo,slownik *p)
{
	slownik *q;
	int pos;
	for(int i=1; i<=strlen(slowo); i++)
	{
		pos=do_indeksu(slowo[i-1]);
		if(p->t[pos] != 0) p=p->t[pos];
		else
		{
			q=new slownik;
			p->t[pos]=q;
			for(int k=0; k<n; q->t[k++]=0);
			p=q;
		}
	}
	p->t[n-1]=p;
}

void pisz_slownik(slownik *p)
{
	for(int i=0; i<26; i++)
		if(p->t[i] != 0)
		{
			if((p->t[i])->t[n-1]==p->t[i])
				cout << z_indeksu(i) << endl << " ";
			else
				cout << z_indeksu(i);

			cout << "-";
			pisz_slownik(p->t[i]);
		}
}

void pisz_slownik1(slownik *p)
{
	for(int i=0; i<26; i++)
		if(p->t[i] != 0)
		{
			if((p->t[i])->t[n-1]==p->t[i])
			{
				cout << z_indeksu(i) << "" << endl;				
			}
			else			
			{
				cout << z_indeksu(i);
			}
			
			cout << "";
			pisz_slownik1(p->t[i]);		
		}
}

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

void main()
{
	int i;
	char tresc[100];
	slownik *p=new slownik;
	for (i=0; i<n; p->t[i++]=0);
	
	char c='x';
	
	cout<<"-- podaj slowo ktore mam umiescic w slowniku: p, \n";
	cout<<"-- podaj slowo ktore mam poszukac w slowniku: s, \n";
	cout<<"-- wypisujemy slownik w, \n";

	while (c!='k')
	{
		cin>>c;
		switch (c)
		{
		case 'p':
			cout << "Podaj slowo ktore mam umiescic w slowniku: ";
			cin >> tresc;
			zapisz(tresc,p);
			break; 		
		
		case 's':
			cout << "Podaj slowo ktore mam poszukac w slowniku: ";
			cin >> tresc;
			szukaj(tresc,p);
			break; 
		
		case 'w':
			cout<<"***********************slownik1*******************\n";
			pisz_slownik1(p);
			cout<<"*************************************************\n";
			cout<<"***********************slownik*******************\n";
			pisz_slownik(p);
			cout << endl;
			cout<<"*************************************************\n";
			break; 
			
		default:
			break;
		}
	}
}
0

Można to rozwiązać przekazując dodatkowy bufor oraz wskaźnik na jego początek:

pisz_slownik2(p,tresc,tresc); // to wywołanie

void pisz_slownik2(slownik *p,char *bufor,char *ptr) // to sama funkcja
  {
   for(int i=0;i<28;++i)
     {
      if(p->t[i])
        {
         *ptr=z_indeksu(i);
         if(p->t[i]->t[n-1])
           {
            *(ptr+1)=0;
            cout<<bufor<<endl;
           }
         pisz_slownik2(p->t[i],bufor,ptr+1);
        }
     }
  }
0

Mógłbyś troszkę to wyjaśnić? Bo nie za bardzo potrafię sobie z tym poradzić.. Próbowałem to jakoś przerobić ale miliard błędów.

0

Dzięki wielkie!

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