Загрузка данных


#include <stdio.h>
#include <stdlib.h>

// Структура узла
typedef struct Node {
    int data;
    struct Node* next;
} Node;

// === Безопасный ввод целого числа (с проверкой) ===
int safe_input_int(const char* prompt) {
    int value, result;
    char ch;
    while (1) {
        printf("%s", prompt);
        result = scanf("%d", &value);
        // Очистка буфера после ввода
        while ((ch = getchar()) != '\n' && ch != EOF);
        if (result == 1) {
            return value;
        }
        printf("Ошибка: введите целое число.\n");
    }
}

// === Создание нового узла ===
Node* create_node(int value) {
    Node* new_node = (Node*)malloc(sizeof(Node));
    if (!new_node) {
        fprintf(stderr, "Ошибка выделения памяти!\n");
        exit(1);
    }
    new_node->data = value;
    new_node->next = NULL;
    return new_node;
}

// === Добавление в голову ===
void push_front(Node** head, int value) {
    Node* new_node = create_node(value);
    new_node->next = *head;
    *head = new_node;
}

// === Удаление головы ===
void pop_front(Node** head) {
    if (*head == NULL) {
        printf("Список пуст, удаление невозможно.\n");
        return;
    }
    Node* temp = *head;
    *head = (*head)->next;
    free(temp);
}

// === Поиск по значению (возвращает указатель на узел или NULL) ===
Node* find(Node* head, int value) {
    Node* cur = head;
    while (cur) {
        if (cur->data == value)
            return cur;
        cur = cur->next;
    }
    return NULL;
}

// === Печать списка ===
void print_list(Node* head) {
    if (head == NULL) {
        printf("Список пуст.\n");
        return;
    }
    printf("Список: ");
    for (Node* cur = head; cur; cur = cur->next) {
        printf("%d ", cur->data);
    }
    printf("\n");
}

// === Освобождение всей памяти ===
void free_list(Node** head) {
    Node* cur = *head;
    while (cur) {
        Node* next = cur->next;
        free(cur);
        cur = next;
    }
    *head = NULL;
}

// === ГЛАВНАЯ ФУНКЦИЯ (демонстрация) ===
int main() {
    Node* head = NULL;
    int choice, value;

    printf("=== ДЕМОНСТРАЦИЯ РАБОТЫ СПИСКА ===\n");

    // 1. Создание списка – ввод элементов с клавиатуры
    int n = safe_input_int("Введите количество элементов для создания списка: ");
    printf("Введите %d целых чисел:\n", n);
    for (int i = 0; i < n; i++) {
        char prompt[50];
        sprintf(prompt, "  Элемент %d: ", i + 1);
        int val = safe_input_int(prompt);
        push_front(&head, val);   // добавляем в голову (порядок будет обратным)
    }
    print_list(head);

    // 2. Добавление элемента в голову
    printf("\n--- Добавление элемента в голову ---\n");
    value = safe_input_int("Введите число для добавления в голову: ");
    push_front(&head, value);
    print_list(head);

    // 3. Удаление элемента из головы
    printf("\n--- Удаление элемента из головы ---\n");
    pop_front(&head);
    print_list(head);

    // 4. Поиск по значению
    printf("\n--- Поиск элемента ---\n");
    value = safe_input_int("Введите число для поиска: ");
    Node* found = find(head, value);
    if (found) {
        printf("Элемент %d найден (адрес узла: %p).\n", found->data, (void*)found);
    } else {
        printf("Элемент %d не найден.\n", value);
    }

    // 5. Освобождение памяти
    free_list(&head);
    printf("\nПамять освобождена. Программа завершена.\n");

    return 0;
}