#include #include #include #include #include "structs.h" #include "common.h" #define RAND_MAX 1 struct data * input(char fp[]){ int i,j; FILE *f; struct data * d = (struct data *)malloc(sizeof(struct data)); f = fopen(fp,"r"); j = fscanf(f,"%ld",&(d->N)); if(j!=1){ printf("Error reading data\n"); exit(0); } d->items = (struct item *)malloc(d->N*sizeof(struct item)); for(i=0;iN;++i){ j = fscanf(f,"%lf %lf",&(d->items[i].p),&(d->items[i].w)); d->allp += d->items[i].p; d->allw += d->items[i].w; } fclose(f); return d; } int cmp_items_ratio(const void * a, const void * b){ struct item c = *(struct item *)a; struct item d = *(struct item *)b; if(c.p / c.w < d.p / d.w){ return 1; } return -1; } int cmp_items_random(const void *a, const void *b) { struct item c = *(struct item *)a; struct item d = *(struct item *)b; if(rand() > 0.5){ return 1; } return -1; } void print_data(struct data * d){ int i; printf("### PRINTING DATA - BEGINNING ###\n"); printf("N:\t%ld\n\n",d->N); printf("Profit\tWeight\n"); for(i=0;iN;++i){ printf("%.02f\t%.02f\n",d->items[i].p,d->items[i].w); } printf("### PRINTING DATA - ENDING ###\n"); } void print_front(struct front_item * b){ struct front_item * beg = b; printf("Profit, Weight, Time\n"); while(b!=NULL){ clock_t t = b->time - beg->time; printf("%.02f,%.02f,%f\n", b->i.p, b->i.w, ((double)t)/CLOCKS_PER_SEC); b = b->next; } } void free_data(struct data * d){ free(d->items); free(d); } void free_front(struct front_item * b){ struct front_item * tmp; for(;b!=NULL;){ tmp = b; b = b->next; free(tmp); } } struct front_item * new_front_item(double p, double w, struct front_item * prev, struct front_item * next){ struct front_item * f = (struct front_item *)malloc(sizeof(struct front_item)); f->i.p = p; f->i.w = w; f->next = next; f->prev = prev; f->time = clock(); return f; } double dist_items(struct item * a, struct item * b){ return sqrt((a->p - b->p)*(a->p - b->p) + (a->w - b->w)*(a->w - b->w)); } int len_front(struct front_item * f){ int N; for(N=0;f!=NULL;f=f->next,N++); return N; }