diff --git a/cv6/a_station.c b/cv6/a_station.c index 1024d9b..a15fd83 100644 --- a/cv6/a_station.c +++ b/cv6/a_station.c @@ -1,95 +1,95 @@ - -#include +#include "a_station.h" #include #include -#include "a_station.h" -// Функция для создания новой станции +// Создаёт пустую станцию struct station* create_station() { - struct station* station = calloc(1, sizeof(struct station)); - station->tracks = calloc(STATION_SIZE, sizeof(struct car*)); + 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) { - int hash = 0; - while (*target) { - hash += (unsigned char)(*target++); - } - return hash % station->track_count; -} - -// Функция для добавления записи о вместимости станции -void add_target_capacity(struct station* station, const char* target, int capacity) { - int track = select_track(station, target); - 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 = malloc(sizeof(struct car)); - new_car->capacity = capacity; - strcpy(new_car->value, target); - new_car->next = NULL; - - // Добавляем новый элемент в цепочку - if (prev == NULL) { - station->tracks[track] = new_car; - } else { - prev->next = new_car; - } -} - -// Функция для поиска вместимости станции по названию -int find_capacity(struct station* station, const char* target) { - int track = select_track(station, target); - struct car* current = station->tracks[track]; - - // Поиск элемента в цепочке - while (current != NULL) { - if (strcmp(current->value, target) == 0) { - return current->capacity; - } - current = current->next; - } - return -1; // Если станция не найдена, возвращаем -1 -} - -// Функция для освобождения памяти, выделенной для станции +// Освобождает всю память void destroy_station(struct station* station) { for (int i = 0; i < station->track_count; i++) { struct car* current = station->tracks[i]; - while (current != NULL) { - struct car* temp = current; + while (current) { + struct car* to_free = current; current = current->next; - free(temp); + free(to_free); } } free(station->tracks); free(station); } -// Функция для вывода информации о станции -void print_station(struct station* station) { - printf("station>>>\n"); +// Хеш-функция для выбора пути на основе названия конечной станции +int select_track(struct station* station, const char* target) { + int hash = 0; + for (int i = 0; target[i] != '\0'; i++) { + hash = (hash + target[i]) % station->track_count; + } + return hash; +} + +// Добавляет количество пассажиров для указанной станции +void add_target_capacity(struct station* station, const char* target, int capacity) { + int index = select_track(station, target); + struct car* current = station->tracks[index]; + + while (current) { + if (strcmp(current->value, target) == 0) { + current->capacity += capacity; + return; + } + current = current->next; + } + + struct car* new_car = (struct car*)malloc(sizeof(struct car)); + strncpy(new_car->value, target, TARGET_SIZE - 1); + new_car->value[TARGET_SIZE - 1] = '\0'; + new_car->capacity = capacity; + new_car->next = station->tracks[index]; + station->tracks[index] = new_car; +} + +// Получает количество пассажиров для указанной станции +int get_target_capacity(struct station* station, const char* target) { + int index = select_track(station, target); + struct car* current = station->tracks[index]; + + while (current) { + if (strcmp(current->value, target) == 0) { + return current->capacity; + } + current = current->next; + } + return 0; +} + +// Считает количество конечных станций +int count_targets(struct station* station) { + int count = 0; for (int i = 0; i < station->track_count; i++) { struct car* current = station->tracks[i]; - while (current != NULL) { - printf("%s %d -> ", current->value, current->capacity); + while (current) { + count++; current = current->next; } - printf("NULL\n"); } - printf("<<track_count; i++) { + struct car* current = station->tracks[i]; + while (current) { + total_capacity += current->capacity; + current = current->next; + } + } + return total_capacity; }