Napisati program koji čita datoteku ulaz.txt i na standardni izlaz ispisuje sve različite reči (niske do 20 karaktera koje pocinju slovom i ne sadrže blanko, tab, znak prelaza u novi red) koje se pojavljuju u datoteci, sa brojevima redova u kojima se pojavljuju. Reči ispisati u rastućem leksikografskom poretku. #include #include #include #include #define MAX 21 typedef struct drvo_CV drvo; /* BSP uredjeno po recima */ typedef struct redovi_CV redovi; /* lista rednih brojeva linija u kojima se pojavljuje jedna rec*/ struct drvo_CV { /* za svaku rec cuva se lista pojavnih redova r */ char rec[MAX]; redovi *r; drvo *levo,*desno; }; struct redovi_CV { /* cuvaju se redni brojevi linija pojava jedne reci */ int br; /* redni broj linije */ redovi *sl; }; char getWord(FILE *f, char *s); /* izdvaja rec s iz ulazne datoteke i vraca tekuci karakter ulaza*/ drvo * addTree(drvo*d, char *s, int br); /* unosi rec s koja se pojavila u redu br u BSP d*/ void printTree(drvo *); /* stampa reci (inorder) i redne brojeve linija u kojima su se pojavile bar jednom */ void freeTree(drvo *); /* oslobadja prostor */ main() { drvo *koren; char rec[MAX]; /* tekuca rec sa ulaza */ int brlinije; /* redni broj tekuce linije */ char c; /* tekuci karakter sa ulaza */ FILE *ul; /* inicijalizacije */ koren = NULL; brlinije = 1; ul = fopen("ulaz.txt","rt"); /* citanje sadrzaja datoteke i formiranje BSP-a*/ while(!feof(ul)) { c = getWord(ul, rec); if(strlen(rec) > 0) koren=addTree(koren, rec, brlinije); if(c=='\n') brlinije++; /* postavlja redni broj tekuceg reda */ } fclose(ul); printTree(koren); freeTree(koren); return 0; } char getWord(FILE *fin, char *word) { char c; /* tekuci karakter ulazne datotke */ int k; /* tekuca pozicija niske word koja se formira */ /*ignorisati karaktere kojima ne pocinje rec ili ne ulaze u sastav reci*/ while(!isalpha(c = fgetc(fin)) && c!='\n' && !feof(fin)) ; /*formiranje niske word */ k = 0; while(c!=' ' && c!= '\t' && c!='\n' && !feof(fin)) { word[k++] = c; c = fgetc(fin); } word[k] = '\0'; return c; } /* izdvojrec */ drvo * addTree(drvo *d, char *w, int br) { redovi *tek, *pom; if(d == NULL) /* rec se prvi put pojavila */ { d = (drvo *)malloc(sizeof(drvo)); strcpy(d->rec, w); d->levo = NULL; d->desno = NULL; /*ubacivanje u listu rednog broja tekuceg reda u kom se rec pojavila*/ d->r = (redovi *)malloc(sizeof(redovi)); d->r->br = br; d->r->sl = NULL; } else /*rec se opet pojavila*/ if(strcmp(w, d->rec) == 0) { for(tek=d->r; tek->sl!=NULL; tek=tek->sl) if(br == tek->br) break; /*ako se rec vec pojavila u istom redu, njegov redni broj se ne ubacuje u listu */ if(br != tek->br) { /* ako se rec 1. put pojavila u tekucem redu, onda dodati taj red */ tek->sl = (redovi *)malloc(sizeof(redovi)); tek = tek->sl; tek->br = br; tek->sl = NULL; } } else if(strcmp(w, d->rec) < 0) d->levo=addTree( d->levo, w, br); else d->desno=addTree(d->desno, w, br); return d; } void freeTree(drvo *d) { if(d != NULL) { freeTree(d->levo); freeTree(d->desno); free(d); } } void printTree(drvo *d) { redovi *tekuci; if(d != NULL) { printTree(d->levo); /* stampati sadrzaj reci*/ printf("%s ",d->rec); /* stampati listu rednih brojeva linija u kojima se pojavila rec bar jednom*/ for(tekuci=d->r; tekuci!=NULL; tekuci=tekuci->sl) printf("%d ",tekuci->br); printf("\n"); printTree(d->desno); } }