Как внести все данные из текстового файла в односвязный список Си?

Чтение данных из текстового файла и занесение их в односвязный список в языке программирования C можно реализовать следующим образом:

1. Создание структуры, которая будет использоваться для хранения данных в списке. Например, если у нас есть файл, содержащий строки с именами и возрастами, мы можем создать структуру, включающую два поля: имя (строка) и возраст (целое число).

typedef struct Node {
    char name[50];
    int age;
    struct Node* next;
} Node;

2. Открытие файла для чтения и проверка, удалось ли открыть файл:

FILE* file = fopen("data.txt", "r");
if (file == NULL) {
    printf("Ошибка при открытии файла");
    return;
}

3. Инициализация указателя на голову списка:

Node* head = NULL;

4. Создание функции для добавления элементов в список. Функция принимает указатель на указатель головного узла списка и данные, которые нужно добавить:

void addNode(Node** head, char name[], int age) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    strcpy(newNode->name, name);
    newNode->age = age;
    newNode->next = NULL;
    
    if (*head == NULL) {
        *head = newNode;
    } else {
        Node* current = *head;
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = newNode;
    }
}

5. Создание цикла для чтения данных из файла. Мы будем использовать fscanf для чтения строк и чисел из файла и передавать их в функцию addNode:

char name[50];
int age;
while (fscanf(file, "%49s %d", name, &age) == 2) {
    addNode(&head, name, age);
}

Обратите внимание, что в fscanf использовано "%49s" для чтения строки с длиной не более 49 символов. Это предотвращает переполнение буфера при чтении длинных строк.

6. Закрытие файла после завершения чтения:

fclose(file);

7. После завершения цикла, весь файл будет прочитан и данные будут храниться в односвязном списке. Мы можем использовать цикл для вывода данных:

Node* current = head;
while (current != NULL) {
    printf("Имя: %s, Возраст: %dn", current->name, current->age);
    current = current->next;
}

В результате выполнения этих шагов, все данные из текстового файла будут соответствующим образом добавлены в односвязный список и отображены на экране.