Add cv6/a_station.c
This commit is contained in:
		
							parent
							
								
									98b60c7f4b
								
							
						
					
					
						commit
						eef93d38ac
					
				
							
								
								
									
										95
									
								
								cv6/a_station.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								cv6/a_station.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,95 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include "a_station.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Функция для создания новой станции
 | 
				
			||||||
 | 
					struct station* create_station() {
 | 
				
			||||||
 | 
					    struct station* station = calloc(1, sizeof(struct station));
 | 
				
			||||||
 | 
					    station->tracks = 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;
 | 
				
			||||||
 | 
					            current = current->next;
 | 
				
			||||||
 | 
					            free(temp);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    free(station->tracks);
 | 
				
			||||||
 | 
					    free(station);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Функция для вывода информации о станции
 | 
				
			||||||
 | 
					void print_station(struct station* station) {
 | 
				
			||||||
 | 
					    printf("station>>>\n");
 | 
				
			||||||
 | 
					    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);
 | 
				
			||||||
 | 
					            current = current->next;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        printf("NULL\n");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    printf("<<<station\n");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user