void listClean(struct entityList *list) { if(list->next != NULL){ listClean(list->next); } free(list); }
void cleanUp(Firm ** firm, Employee ** employees, Employee *** sortedEmployees) { Employee * employeesList = *employees; const int sortedListArrayListSize = listGetSize((*firm)->skills, sizeof(Skill)); /* Clean up the employeesList lists */ while(employeesList) { listClean((void **) &(employeesList->wishes), sizeof(Wish)); employeesList = employeesList->nextEmployee; } listClean((void **) employees, sizeof(Employee)); /* Clean sorted ArrayList of Employees */ int sortedEmployessCounter = 0; for(; sortedEmployessCounter < sortedListArrayListSize; sortedEmployessCounter++) { listClean((void **) *sortedEmployees + sortedEmployessCounter, sizeof(Skill)); } free(*sortedEmployees); *sortedEmployees = NULL; /* Clean firm */ listClean((void **) &((*firm)->emptySchedule), sizeof(Shift)); listClean((void **) &((*firm)->ranks), sizeof(Rank)); listClean((void **) &((*firm)->skills), sizeof(Skill)); free(*firm); *firm = NULL; }
int main(int argc, char *argv[]) { /* Save start time of program for later use */ const time_t startTime = time(NULL); srand(startTime); /* Create pointers to manipulate with */ Firm * firm = (Firm *) calloc(1, sizeof(Firm)); Employee* employees = NULL; Employee ** sortedEmployes; /* Loads data from the file in the correct file in the correct directory */ char runPath[strlen(argv[0]) + 20]; getRunPath(argv[0], runPath); loadDataFromFile(firm, &employees, runPath); sortedEmployes = sortEmployeesBy(employees, firm->skills); int validCounter = 0; int randomCounter; float highestScore = 0; firm->bestSchedule = generateBestRandomSchedule(firm, employees, sortedEmployes, &randomCounter, &validCounter); if(!firm->bestSchedule) { printf("Error, no result from random generation\n"); exit(-1); } highestScore = genScore(firm, firm->bestSchedule, employees); //int swapsTries; /** * findBestRoughSwap */ firm->bestSchedule = findBestRoughSwap(firm, firm->bestSchedule, employees, &highestScore); /** * fineSwap */ findBestFineSwap(firm, &(firm->bestSchedule), employees, &highestScore); Shift * tmpShift = listCopy((void*) firm->bestSchedule, sizeof(Shift)); Employee * unassignedEmployeeList = generateUnassignedEmployeeList(tmpShift, employees); assignEmployeeListRandomly(tmpShift, employees, &unassignedEmployeeList); tmpShift = findBestRoughSwap(firm, tmpShift, employees, &highestScore); findBestFineSwap(firm, &tmpShift, employees, &highestScore); if(isValid(tmpShift, employees) && genScore(firm, firm->bestSchedule, employees) < highestScore) { listClean((void **) &(firm->bestSchedule), sizeof(Shift)); firm->bestSchedule = tmpShift; } else { listClean((void **) &tmpShift, sizeof(Shift)); } printHLine(129); printf("PRINTING BEST SCHEDULE (THAT I FOUND) - BY THE WAY, THE BEST SCORE WAS: %f\n", highestScore); printHLine(129); if(printScheduleHeadline("")) { printSchedule(firm->bestSchedule, employees); } printHLine(129); /** * TODO: Clean bedstscore osv. */ cleanUp(&firm, &employees, &sortedEmployes); return EXIT_SUCCESS; }