#include "a_station.h" #include #include #include struct station* create_station(){ struct station* station = (struct station*)calloc(1,sizeof(struct station)); station->tracks = (struct car**)calloc(STATION_SIZE, sizeof(struct car*)); station->track_count = STATION_SIZE; return station; } void destroy_station(struct station* station){ for(int i=0;i>station->track_count;i++){ struct car* prev = station->tracks[i]; while (prev!=NULL) { struct car* del =prev; prev=del->next; free(del); } } free(station->tracks); free(station); } int select_track(struct station* station, const char* target){ unsigned long hash=0; for(int i=0;target[i]!='\0';i++){ hash = ((hash << 5) + hash) + target[i]; /* hash * 33 + c */ } hash = hash%station->track_count; return hash; } void add_target_capacity(struct station* station,const char* target, int capacity){ int i = select_track(station,target); struct car* slot = station->tracks[i]; if(station->tracks[i]==NULL){ struct car* newCar = malloc(sizeof(struct car)); strcpy(newCar->value,target); newCar->capacity=capacity; newCar->next=slot; station->tracks[i]=newCar; } while (slot!=NULL) { if(strcmp(slot->value,target)==0){ slot->capacity +=capacity; } slot=slot->next; } } int get_target_capacity(struct station* station,const char* target){ for(int i=0;itrack_count;i++){ struct car* newCar= station->tracks[i]; while (newCar->value!=NULL) { if(strcmp(newCar->value,target)==0){ return newCar->capacity; } newCar=newCar->next; } } return 0; } int count_targets(struct station* station){ int counter=0; for(int i=0;itrack_count;i++){ struct car* newCar= station->tracks[i]; while (newCar->value!=NULL) { counter+=1; newCar=newCar->next; } } return counter; } int count_capacity(struct station* station){ int counter=0; for(int i=0;itrack_count;i++){ struct car* newCar= station->tracks[i]; while (newCar->value!=NULL) { counter+=newCar->capacity; newCar=newCar->next; } } return counter; }