usaa25/du5/a_station.c
2025-11-13 20:20:56 +01:00

90 lines
2.1 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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;i<s->track_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;i<s->track_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;i<s->track_count;i++){
struct car* c=s->tracks[i];
while(c!=NULL){sum+=c->capacity;c=c->next;}
}
return sum;
}