typedef 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; } }