#include <stdio.h>
typedef struct node {
char * slovo;
char ** preklad;
int prekladu;
int velikost;
struct node * l, * p;
} node;
/*tisk prvku stromu*/
int tisk_polozky(node * n)
{
int i;
printf("%s: ", n->slovo);
for (i = 0; i < n->prekladu - 1; i++)
printf("%s, ", n->preklad[i]);
printf("%s\n", n->preklad[n->prekladu - 1]);
}
/*prida slovo do slovniku*/
int pridej_slovo(node ** n, char * slovo, char ** preklad, int prekladu)
{
node * nn;
int v, i, j, x;
/* najdu kam se bude pridavat */
while (*n) {
v = strcmp(slovo, (*n)->slovo);
if (v < 0)
n = &(*n)->l;
else if (v > 0)
n = &(*n)->p;
else {
/* slovo jiz je ve slovniku, zkontroluju preklady */
x = (*n)->prekladu;
for (i = 0; i < prekladu; i++) {
v = 0;
/* zkontroluji jestli preklad je ve slovniku */
for (j = 0; j < x; j++)
if (!strcmp(preklad[i], (*n)->preklad[i]))
v = 1;
/* preklad neni ve slovniku, pridam ho */
if (!v) {
if ((*n)->prekladu == (*n)->velikost) { /* zvetsime pole prekladu */
(*n)->velikost *= 2;
if (!realloc((*n)->preklad, (*n)->velikost))
return 1;
}
(*n)->preklad[(*n)->prekladu] = preklad[i];
++(*n)->prekladu;
}
}
return 0;
}
}
nn = malloc(sizeof(node));
if (!nn)
return 1;
nn->slovo = slovo;
nn->preklad = preklad;
nn->prekladu = prekladu;
nn->velikost = 1024; /* jinou velikost pri puvodnim vstupu mit nemuze */
nn->l = nn->p = 0;
(*n) = nn;
return 0;
}
/*dotaz do slovniku*/
int hledej_slovo(node * n, char * slovo)
{
int v;
if (n) {
v = strcmp(slovo, n->slovo);
if (v == 0) {
tisk_polozky(n);
return 0;
}
else {
if (v < 0)
return hledej_slovo(n->l, slovo);
else
return hledej_slovo(n->p, slovo);
}
}
else
return 1;
}
/*inorder pruchod stromem a jeho tisk*/
int tisk_slovniku(node * n)
{
if (n) {
tisk_slovniku(n->l);
tisk_polozky(n);
tisk_slovniku(n->p);
}
}
/*postorder pruchod stromem ktery vymaze vsechny vrcholy*/
void vymaz_slovnik(node * n)
{
if (n) {
vymaz_slovnik(n->l);
vymaz_slovnik(n->p);
free(n);
}
}
int main()
{
char c, * slovo, * buffer, ** preklad;
node * slovnik;
int i, p, e;
slovnik = 0;
buffer = malloc(1024);
printf("> ");
while ((c = getc(stdin)) != '\n') {
switch(c) {
case '+':
i = 0;
while ((c = getc(stdin)) != ' ' && c != '\n')
buffer[i++] = c;
buffer[i] = '\0';
slovo = malloc(i + 1);
strcpy(slovo, buffer);
i = p = e = 0;
preklad = malloc(1024);
while ((c = getc(stdin)) != '\n') {
if (c == ',') {
buffer[i] = '\0';
preklad[p] = malloc(i + 1);
strcpy(preklad[p], buffer);
i = 0;
++p;
if (getc(stdin) != ' ') {
printf("neplatny prikaz\n");
e = 1;
}
}
else
buffer[i++] = c;
}
buffer[i] = '\0';
preklad[p] = malloc(i + 1);
strcpy(preklad[p], buffer);
if (!e && pridej_slovo(&slovnik, slovo, preklad, p + 1))
printf("nedostatek pameti\n");
break;
case '?':
i = 0;
while ((c = getc(stdin)) != ' ' && c != '\n')
buffer[i++] = c;
buffer[i] = '\0';
if (hledej_slovo(slovnik, buffer))
printf("slovo neni ve slovniku\n");
break;
case '!':
tisk_slovniku(slovnik);
break;
}
while (c != '\n')
c = getc(stdin);
printf("> ");
}
vymaz_slovnik(slovnik);
free(buffer);
return 0;
}