void MergeSort(LinkedList* list, int (*comparator)(void* left, void* right)) { int size = LLSize(list); if ( size > 1 ) { int middle = size / 2; LinkedList* spliced = LLSplice(list, middle); MergeSort(list, comparator); MergeSort(spliced, comparator); Combine(list, spliced, comparator); LLDestroy(spliced); } }
static void Combine(LinkedList* l1, LinkedList* l2, int (*comparator)(void* left, void* right)) { LinkedList* ret = NULL; LLInit(&ret); Node* p1 = l1->head; Node* p2 = l2->head; while ( p1 && p2 ) { int cres = (*comparator)(p1->data, p2->data); if ( cres < 0 ) { LLInsert(ret, p1->data); p1 = p1->next; } else if ( !cres ) { LLInsert(ret, p1->data); LLInsert(ret, p2->data); p1 = p1->next; p2 = p2->next; } else { LLInsert(ret, p2->data); p2 = p2->next; } } while ( p1 ) { LLInsert(ret, p1->data); p1 = p1->next; } while ( p2 ) { LLInsert(ret, p2->data); p2 = p2->next; } LLCopy(l1, ret); LLDestroy(ret); }
int main(int argc, char *argv[]){ if(argc == 1){ printf("Please enter a index file \n"); printf("Usage: <name of compiled program> <option> <Memory Size> <Index File> \n"); } if(argc == 4){ FILE *fp; /***** CONVERT INPUTTED STRING TO MEMORY SIZE *******/ data *dataptr = (data *) malloc(sizeof(struct data_)); char *rawmemory = argv[2]; int num = 0; char *memory = rawmemory; int multiplier; while(isdigit(*rawmemory)){ num++; rawmemory++; } if(*rawmemory == 'K'){ multiplier = 1024; } if(*rawmemory == 'M'){ multiplier = 1024 * 1024; } if(*rawmemory == 'G'){ multiplier = 1024 * 1024 * 1024; } *rawmemory = '\0'; dataptr->maxmemory = atoi(memory) * multiplier; dataptr->currmemory = 0; /**************************************************/ char line[1000]; TokenizerT *tokenizer; char *token; word *newword; int memusage = 0; dataptr->file = argv[3]; fp = fopen(argv[3], "r"); if(fp == NULL){ fprintf(stderr, "file could not be opened \n"); } while(fgets(line, 1000, fp) != NULL){ tokenizer = TKCreate(line); token = TKGetNextToken(tokenizer); while (token != NULL){ checktoken(token); if(start == 1){ if (!(counter % 2)){ /* THIS IS WHERE I GET THE FILENAME STRING OF EACH WORD*/ LLInsert(newword->filelist, token); memusage = memusage + strlen(token); } counter++; } /*fprintf(fp2, "%s \n", token);*/ token = TKGetNextToken(tokenizer); if(var == 1){ newword = (word *)malloc(sizeof(struct words)); newword->string = token; newword->filelist = LLCreate(); memusage = memusage + strlen(token); var = 0; start = 1; counter++; } if(var2 == 1){ /* AFTER I HAVE ADDED ALL THE FILENAME INDEXES TO THE WORD THEN I INSERT IT INTO listwords array and print it out onto the console */ if(memusage + dataptr->currmemory > dataptr->maxmemory){ free(newword); break; } else{ listwords[lwsize] = newword; lwsize++; var2 = 0; dataptr->currmemory = dataptr->currmemory + memusage; newword->memory = memusage; memusage = 0; } } } if(memusage + dataptr->currmemory > dataptr->maxmemory) break; } var = 0; var2 = 0; start = 0; TKDestroy(tokenizer); fclose(fp); char str[100]; int x; for(; ;){ linkedListPtr searchlist = LLCreate(); linkedListPtr foundlist = LLCreate(); /* LOOPING USER INTERFACE */ printf("search> "); fgets(str, 100, stdin); x = strlen(str)-1; if(str[x] == '\n') str[x] = '\0'; token = strtok(str, " "); LLInsert(searchlist, token); while ((token = (strtok(NULL, " "))) != NULL){ LLInsert(searchlist, token); searchlist->size++; } if (strcmp(searchlist->head->filename, "q") == 0){ break; } if(strcmp(searchlist->head->filename, "so") == 0){ searchlist->head = searchlist->head->next; searchor(foundlist, searchlist, dataptr); } else if(strcmp(searchlist->head->filename, "sa") == 0){ searchlist->head = searchlist->head->next; searchand(foundlist, searchlist, dataptr); } LLDestroy(searchlist); LLDestroy(foundlist); } int i; for (i = 0; i < lwsize; i++){ LLDestroy(listwords[i]->filelist); free(listwords[i]->string); free(listwords[i]); } } }