#include #include #include #include #include "tree.h" #define DELIMITERS " \t\n,.;:§!#%&/()=?@_£${[]}\\+-'*^\"0123456789<>|" #define ARRSIZE 10 typedef struct post{ char *word; int *pages; int pos; } Post; char* strtoupper(char *ch){ int i; for (i=0; ch[i]; ++i) ch[i] = toupper(ch[i]); return ch; } int postcomp(Post *element, Post *elementintree){ return strcmp(strtoupper(element->word), strtoupper(elementintree->word)); } void func(Post *ret){ printf("%s\n", ret->word); int i; for(i = 0;i < ret->pos + 1; i++) printf("%d ", *(ret->pages + i)); printf("\n\n"); } int addpage(Post *post, int page){ if ((post->pos + 1) % 10 == 0){ if((post->pages = realloc(post->pages, sizeof(int) * (post->pos + 1 + ARRSIZE)))){ *(post->pages + post->pos +1) = page; ++post->pos; return 1; } return 0; } else if (*(post->pages + post->pos) != page){ *(post->pages + post->pos +1) = page; ++post->pos; return 1; } return 1; } int main(void){ setlocale(LC_CTYPE, "sv_SE"); Binsearchtree bst = inittree((int(*)(void*, void*))postcomp); FILE *f; Post* new; Post* tmp; char line[BUFSIZ]; f = fopen("tree.c", "r"); char *words; int jos = 1; while (fgets(line, BUFSIZ, f)){ words = strtok(line, DELIMITERS); while(words){ new = malloc(sizeof(Post)); new->word = malloc((strlen(words)+1) * sizeof(char)); strcpy(new->word, words); new->pages = malloc(ARRSIZE * sizeof(int)); *new->pages = jos++; new->pos = 0; if ((tmp = find(bst, new))){ addpage(tmp, jos++); free(new->word); free(new->pages); free(new); } else inserttree(bst, new); words = strtok(NULL, DELIMITERS); } } doforall(bst, (void (*)(void*))func); return 0; }