usaa24/cv4/a_train.c

91 lines
3.3 KiB
C
Raw 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* newcar = (struct car*)calloc(1, sizeof(struct car)); // Выделение памяти для нового вагона
if (newcar == NULL) {
printf("Ошибка: не удалось выделить память.\n"); // Проверка на ошибки выделения памяти
exit(1);
}
strcpy(newcar->value, target); // Копируем значение в новый вагон
newcar->next = NULL; // Устанавливаем следующий элемент как NULL
// Если поезд пустой, возвращаем новый вагон как первый
if (first == NULL) {
return newcar;
}
struct car* current = first;
// Проходим по всему поезду до последнего вагона
while (current->next != NULL) {
current = current->next;
}
// Добавляем новый вагон в конец поезда
current->next = newcar;
return first;
}
// Функция для вывода всех вагонов поезда
void print_train(struct car* first) {
struct car* current = first;
// Проверка на пустой поезд
if (current == NULL) {
printf("Поезд пустой.\n");
return;
}
// Выводим значение каждого вагона
while (current != NULL) {
printf("%s\n", current->value);
current = current->next;
}
}
// Функция для отмены (освобождения) памяти поезда
void cancel_train(struct car* first) {
if (first == NULL) {
return; // Если поезд пустой, ничего не делаем
}
// Рекурсивно освобождаем память
cancel_train(first->next);
free(first); // Освобождаем текущий вагон
}
// Функция для удаления вагонов с заданным значением
struct car* clear_train(struct car* first, const char* target) {
struct car* prev = NULL;
struct car* current = first;
// Проходим по всем вагонам поезда
while (current != NULL) {
// Если значение вагона совпадает с заданным
if (strcmp(current->value, target) == 0) {
if (prev == NULL) {
// Если это первый вагон
struct car* temp = current->next;
free(current);
current = temp;
first = current; // Обновляем первый вагон
} else {
// Если это не первый вагон
prev->next = current->next;
free(current);
current = prev->next;
}
} else {
// Если значение не совпадает, продолжаем
prev = current;
current = current->next;
}
}
return first; // Возвращаем обновленный поезд
}