#include #include #include #include "a_station.h" static unsigned long hash_string(const char* t){ unsigned long h=0;int c; while((c=*t++)){h=h*31+c;} return h; } struct station* create_station(){ struct station* s=malloc(sizeof(struct station)); if(s==NULL)return NULL; s->tracks=calloc(STATION_SIZE,sizeof(struct car*)); if(s->tracks==NULL){free(s);return NULL;} s->track_count=STATION_SIZE; return s; } void destroy_station(struct station* s){ if(s==NULL)return; for(int i=0;itrack_count;i++){ struct car* c=s->tracks[i]; while(c!=NULL){ struct car* n=c->next; free(c); c=n; } } free(s->tracks); free(s); } int select_track(struct station* s,const char* t){ if(s==NULL||t==NULL)return 0; unsigned long h=hash_string(t); return (int)(h%s->track_count); } void add_target_capacity(struct station* s,const char* t,int cap){ if(s==NULL||t==NULL)return; int tr=select_track(s,t); struct car* c=s->tracks[tr]; struct car* p=NULL; while(c!=NULL){ if(strcmp(c->value,t)==0){c->capacity+=cap;return;} p=c;c=c->next; } struct car* n=malloc(sizeof(struct car)); if(n==NULL)return; strncpy(n->value,t,TARGET_SIZE-1); n->value[TARGET_SIZE-1]='\0'; n->capacity=cap; n->next=NULL; if(p==NULL)s->tracks[tr]=n;else p->next=n; } int get_target_capacity(struct station* s,const char* t){ if(s==NULL||t==NULL)return 0; int tr=select_track(s,t); struct car* c=s->tracks[tr]; while(c!=NULL){ if(strcmp(c->value,t)==0)return c->capacity; c=c->next; } return 0; } int count_targets(struct station* s){ if(s==NULL)return 0; int cnt=0; for(int i=0;itrack_count;i++){ struct car* c=s->tracks[i]; while(c!=NULL){cnt++;c=c->next;} } return cnt; } int count_capacity(struct station* s){ if(s==NULL)return 0; int sum=0; for(int i=0;itrack_count;i++){ struct car* c=s->tracks[i]; while(c!=NULL){sum+=c->capacity;c=c->next;} } return sum; }