usaa24/cv4/a_train.c

75 lines
2.7 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "a_train.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Функция для добавления нового вагона в конец поезда
struct car* add_car(struct car* first, const char* target) {
struct car* new_car = (struct car*)malloc(sizeof(struct car));
if (!new_car) {
return first; // В случае ошибки выделения памяти, возвращаем исходный поезд
}
// Копируем название станции
strncpy(new_car->value, target, SIZE);
new_car->value[SIZE - 1] = '\0'; // Защита от переполнения строки
new_car->next = NULL; // Новый вагон всегда идет в конец, поэтому его next = NULL
if (!first) {
// Если поезд пуст, новый вагон становится первым
return new_car;
}
// Если поезд уже существует, находим последний вагон
struct car* temp = first;
while (temp->next) {
temp = temp->next;
}
temp->next = new_car; // Присоединяем новый вагон в конец
return first;
}
// Функция для вывода всех вагонов поезда
void print_train(struct car* first) {
struct car* temp = first;
while (temp) {
printf("Вагон: %s\n", temp->value);
temp = temp->next;
}
}
// Функция для удаления всех вагонов
void cancel_train(struct car* first) {
struct car* temp = first;
while (temp) {
struct car* next = temp->next;
free(temp); // Освобождаем память для каждого вагона
temp = next;
}
}
// Функция для удаления вагонов с определенной целевой станцией
struct car* clear_train(struct car* first, const char* target) {
struct car* temp = first;
struct car* prev = NULL;
// Идем по списку вагонов
while (temp) {
if (strcmp(temp->value, target) == 0) {
// Если название станции совпадает, удаляем вагон
if (prev) {
prev->next = temp->next;
} else {
first = temp->next; // Если удаляем первый вагон
}
struct car* to_delete = temp;
temp = temp->next;
free(to_delete);
} else {
prev = temp;
temp = temp->next;
}
}
return first; // Возвращаем новый указатель на первый вагон
}