All pastes #810188 Raw Edit

Untitled

public text v1 · immutable
·published 2007-12-09 19:16 UTC
rendered paste body
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;
	}
}