From 037734be1728256e7991e1483056c39ac2525260 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 14 Nov 2025 10:53:17 +0100 Subject: [PATCH] funguje --- du5/a_station.c | 165 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 145 insertions(+), 20 deletions(-) diff --git a/du5/a_station.c b/du5/a_station.c index a17daa0..6e50eb1 100644 --- a/du5/a_station.c +++ b/du5/a_station.c @@ -1,34 +1,159 @@ #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; +int select_track(struct station* station, const char* target) +{ + if (station==NULL || target==NULL) + { + return 0; + } + unsigned long hash=5381; + int c; + while ((c=*target++)) + { + hash=((hash<<5)+hash)+c; + } + return (int)(hash % station->track_count); } -void destroy_station(struct station* station){ +struct station* create_station() +{ + struct station* station=(struct station*)malloc(sizeof(struct station)); + if (station==NULL) + { + return NULL; + } + station->tracks=(struct car**)calloc(STATION_SIZE, sizeof(struct car*)); + if (station->tracks==NULL) + { + free(station); + return NULL; + } + station->track_count=STATION_SIZE; + return station; } -int select_track(struct station* station, const char* target){ +void destroy_station(struct station* station) +{ + if (station==NULL) + { + return; + } + for (int i = 0; i < station->track_count; i++) + { + struct car* current=station->tracks[i]; + while (current!=NULL) + { + struct car* next=current->next; + free(current); + current=next; + } + } + free(station->tracks); + free(station); +} + +void add_target_capacity(struct station* station, const char* target, int capacity) +{ + if (station==NULL || target==NULL) + { + return; + } + int track=select_track(station, target); + if (track<0 || track>=station->track_count) + { + return; + } + struct car* current=station->tracks[track]; + struct car* prev=NULL; + while (current!=NULL) + { + if (strcmp(current->value, target)==0) + { + current->capacity+=capacity; + return; + } + prev=current; + current=current->next; + } + struct car* new_car=(struct car*)malloc(sizeof(struct car)); + if (new_car==NULL) + { + return; + } + new_car->capacity=capacity; + strncpy(new_car->value, target, TARGET_SIZE-1); + new_car->value[TARGET_SIZE-1]='\0'; + new_car->next=NULL; + if (prev==NULL) + { + station->tracks[track]=new_car; + } + else + { + prev->next=new_car; + } +} + +int get_target_capacity(struct station* station, const char* target) +{ + if (station==NULL || target==NULL) + { + return 0; + } + int track=select_track(station, target); + if (track<0 || track>=station->track_count) + { + return 0; + } + struct car* current=station->tracks[track]; + while (current!=NULL) + { + if (strcmp(current->value, target)==0) + { + return current->capacity; + } + current=current->next; + } return 0; } -void add_target_capacity(struct station* station,const char* target, int capacity){ +int count_targets(struct station* station) +{ + if (station==NULL) + { + return 0; + } + int count=0; + for (int i = 0; i < station->track_count; i++) + { + struct car* current=station->tracks[i]; + while (current!=NULL) + { + count++; + current=current->next; + } + } + return count; } -int get_target_capacity(struct station* station,const char* target){ - return 0; +int count_capacity(struct station* station) +{ + if (station==NULL) + { + return 0; + } + int total=0; + for (int i = 0; i < station->track_count; i++) + { + struct car* current=station->tracks[i]; + while (current!=NULL) + { + total+=current->capacity; + current=current->next; + } + } + return total; } - -int count_targets(struct station* station){ - return 0; -} - -int count_capacity(struct station* station){ - return 0; -} - -