rendered paste bodytypedef struct BST
{
char Slowo[50];
struct BST *Lewy;
struct BST *Prawy;
struct BST *Tlumaczenie;
} SWezel, *Drzewo;
// k1 - drzewo eng, k2 - drzewo pl
Drzewo k1 = NULL, k2 = NULL;
// funkcja wykorzystywana przez inna
Drzewo Wezel(char *Slowo)
{
Drzewo tmp = (Drzewo)malloc(sizeof(SWezel));
strcpy(tmp -> Slowo, Slowo);
tmp -> Lewy = NULL;
tmp -> Prawy = NULL;
tmp -> Tlumaczenie = NULL;
return tmp;
}
// funkcja wstawiajaca wyraz do danego drzewa
// np. Wstaw(&k1, "dupa")
// wstawiajac do jednego drzewa musisz dodawac do drugiego (patrz funkcja wczytaj)
void Wstaw(Drzewo *korzen, char *Slowo)
{
if (*korzen == NULL)
{
*korzen = Wezel(Slowo);
}
else
{
if (strcmp((*korzen) -> Slowo, Slowo) > 0)
{
Wstaw(&(*korzen) -> Lewy, Slowo);
}
else if (strcmp((*korzen) -> Slowo, Slowo) < 0)
{
Wstaw(&(*korzen) -> Prawy, Slowo);
}
}
}
// funkcja szukajaca danego wyrazu na drzewie
Drzewo Szukaj(Drzewo korzen, char *Slowo)
{
if (korzen != NULL)
{
if (strcmp(korzen -> Slowo, Slowo) == 0) return korzen;
if (strcmp(korzen -> Slowo, Slowo) > 0) return Szukaj(korzen -> Lewy, Slowo);
return Szukaj(korzen -> Prawy, Slowo);
}
else
{
return korzen;
}
}
// ustawia wskaznik na tlumaczenie w danym wezlie
// np. Tlumacz(&k2, "dupa", &k1, "ass");
void Tlumacz(Drzewo *k1, char *Pl, Drzewo *k2, char *En)
{
Drzewo pltmp, entmp;
if ((pltmp = Szukaj(*k1, Pl)) != NULL && (entmp = Szukaj(*k2, En)) != NULL)
{
pltmp -> Tlumaczenie = entmp;
entmp -> Tlumaczenie = pltmp;
}
}
// KLP wykorzystywane przez zapisz()
void klp(Drzewo korzen, FILE *plik)
{
if (korzen != NULL)
{
fprintf(plik, "%s %s\n", korzen -> Slowo, korzen -> Tlumaczenie -> Slowo);
klp(korzen -> Lewy, plik);
klp(korzen -> Prawy, plik);
}
}
// funkcja zapisujaca drzewo do pliku slownik.txt
void Zapisz(Drzewo korzen)
{
FILE *wy;
wy = fopen("slownik.txt", "w");
klp(korzen, wy);
fclose(wy);
}
void _Usun(Drzewo *k1, Drzewo *k2)
{
Drzewo tmp;
if ((*k1) -> Prawy)
{
_Usun(&(*k1) -> Prawy, &(*k2));
}
else
{
strcpy((*k2) -> Slowo, (*k1) -> Slowo);
tmp = (*k1);
(*k1) = (*k1) -> Lewy;
free(tmp);
}
}
// funkcja usuwajaca slowo z danego drzewa (usuwajaca z jednego drzewa musisz usunac
// wyraz takze z drugiego dzrwa :P (wczesniej znajdz wskaznik przez szukaj())
void Usun(Drzewo *korzen, char *Slowo)
{
Drzewo tmp;
if (*korzen)
{
if (strcmp((*korzen) -> Slowo, Slowo) > 0)
{
Usun(&(*korzen) -> Lewy, Slowo);
}
else if (strcmp((*korzen) -> Slowo, Slowo) < 0)
{
Usun(&(*korzen) -> Prawy, Slowo);
}
else
{
tmp = (*korzen);
if (!tmp -> Lewy)
{
(*korzen) = (*korzen) -> Prawy;
free(tmp);
}
else if (!tmp -> Prawy)
{
(*korzen) = (*korzen) -> Lewy;
free(tmp);
}
else
{
_Usun(&tmp -> Lewy, &(*korzen));
}
}
}
}
// funkcja zwalniajaca pamiec zamowana przez drzewo
void Zwolnij(Drzewo *korzen)
{
if (*korzen != NULL)
{
if ((*korzen) -> Lewy != NULL) Zwolnij(&(*korzen) -> Lewy);
if ((*korzen) -> Prawy != NULL) Zwolnij(&(*korzen) -> Prawy);
free(*korzen);
*korzen = NULL;
}
}
int Wczytaj(Drzewo *k1, Drzewo *k2)
{
FILE *we;
char pl[50], en[50];
if (we = fopen("slownik.txt", "r"))
{
while (!feof(we))
{
fscanf(we, "%s %s", &en, &pl);
Wstaw(&(*k1), en);
Wstaw(&(*k2), pl);
Tlumacz(k2, pl, k1, en);
}
fclose(we);
return 1;
}
else
{
return 0;
}
}