#include 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; }