summaryrefslogblamecommitdiffstats
path: root/src/common.c
blob: 92bd467b89d4ecfc3ee9365ab0d41c406ae09fe0 (plain) (tree)























































































                                                                                                           
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "structs.h"
#include "common.h"

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;i<d->N;++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;
}

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;i<d->N;++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){
	while(b!=NULL){
		printf("%.02f\t%.02f\n",b->i.p,b->i.w);
		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;

	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;
}