/* Pomocu binarnih uredjenih stabala potrebno je realizirati datoteku s vise kljuceva. Na magnetskom disku nalazi se slijedna datoteka 'ulaz' (formatirana vi-editorom) u kojoj se u svakom zapisu nalaze slijedeci podaci: maticni broj (8+1 znakova) prezime i ime (30+1 znakova) datum rodjenja (u formatu dd.mm.gggg) proizvoljan tekst (najvise 100 +1 znakova) Formirati skup datoteka koji ce omoguciti brz dohvat zapisa po maticnom broju, prezimenu i imenu, te datumu rodjenja. Spremanje podataka u bilo koje indeksno stablo treba ostvariti zajednickim potprogramom spremanje. Naciniti program koji ce s tipkovnice ucitavati parove 'naziv kljuca - vrijednost kljuca' (npr. DATUM 01.01.1995) i ispisivati sve zapise sa zadanom vrijednosti kljuca. Program treba zavrsiti kad se na mjestu naziva kljuca zada rijec KRAJ. Dohvat i ispis po bilo kojem kljucu treba ostvariti zajednickim potprogramom 'ispis'. */ /* nisam dovrsio jer zadatak nema smisla. datoteka s vishe kljuceva?? vishe * datoteka s jednim kljucem?? a prezime i ime te datum rodjenja ne mogu biti * kljucevi jer se _mogu_ i _smiju_ ponavljati i samim time je sve to malo * `fishy' jer bin. stablo ne moze imati ponavljajuce podatke! moze biti da su * zadatak nabrzinu zadavali, ali uglavnom ovako zadanog ga je glupo uopce * rjesavati.. uglavnom gubljenje vremena.. mastodontski program bez svrhe.. * */ #include #include #include #include #define INPUT_FILE "ulaz" #define OUTPUT_DATE "datum.bin" #define OUTPUT_NAME "ime.bin" #define OUTPUT_ID "id.bin" #define DATE_SIZE 11 #define MEMO_SIZE 101 #define BUFLEN_SIZE 512 #define ID_SIZE 9 #define NAME_SIZE 31 #define DEBUG #define COMMON_TREE_SAVE(node_direction) \ { \ if (!elem_output.node_direction) \ { \ long pos_cur, pos_end; \ pos_cur=ftell(output)-(long)sizeof(node_t); \ fseek(output, 0L, SEEK_END); \ pos_end=ftell(output); \ fwrite(&elem_input, sizeof(node_t), 1, output); \ fseek(output, pos_cur, SEEK_SET); \ elem_output.node_direction=pos_end; \ fwrite(&elem_output, sizeof(node_t), 1, output); \ break; \ } else fseek(output, elem_output.node_direction, SEEK_SET); \ } #define CHECK_DIRECTION(a, off_a, b, off_b) \ { \ dir=strcmp((char *)(&a+off_a), \ (char *)(&b+off_b)); \ } typedef struct { char maticni_broj[ID_SIZE], prez_ime[NAME_SIZE], datum[DATE_SIZE], memo[MEMO_SIZE]; long left,right; } node_t; void fatal(const char *mesg) { puts(mesg); exit(EXIT_FAILURE); } void spremanje(FILE *output, node_t elem_input, const int off) { node_t elem_output; int dir; rewind(output); for(;;) { elem_input.left=elem_input.right=0; if (fread(&elem_output, sizeof(node_t), 1, output)<1) { fwrite(&elem_input, sizeof(node_t), 1, output); break; } if ((CHECK_DIRECTION(elem_input, off, elem_output, off))>0) { COMMON_TREE_SAVE(right); } else if (dir<0) { COMMON_TREE_SAVE(left); } else break; } } #ifdef DEBUG void display_tree(FILE *input, long pos) { node_t tmp; char printf_mask[]="%s\n%s\n%s\n%s\n\n"; fseek(input, pos, SEEK_SET); if (fread(&tmp, sizeof(node_t), 1, input)) { if (tmp.left) display_tree(input, tmp.left); printf(printf_mask, tmp.maticni_broj, tmp.prez_ime, tmp.datum, tmp.memo); if (tmp.right) display_tree(input, tmp.right); } } #endif void ispis(FILE *input, const int off, char *key) { node_t tmp; int dir; char printf_mask[]="%s\n%s\n%s\n%s\n\n"; rewind(input); for(;;) { if (fread(&tmp,sizeof(node_t),1,input)<1) break; if ((CHECK_DIRECTION(key, 0, tmp, off))>1 && tmp.right) fseek(input,tmp.right,SEEK_SET); else if (!dir) { printf(printf_mask, tmp.maticni_broj, tmp.prez_ime, tmp.datum, tmp.memo); break; } else fseek(input,tmp.left,SEEK_SET); } } void ucitaj_kbd(void) { char linebuf[BUFLEN_SIZE]; memset(linebuf, 0, sizeof(linebuf)); for(;;) { fgets(linebuf, sizeof(linebuf), stdin); if (!strncasecmp(linebuf, "DATUM", 5)) {} else if (!strncasecmp(linebuf, "PREZ_IME", 8)) {} else if (!strncasecmp(linebuf, "ID", 2)) {} else if } } void ucitaj_datoteku() { /* blabla .. */ } int main(void) { return EXIT_SUCCESS; }