Структуры, связные списки - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Пожалуйста помогите разобраться со структурами. Понял как их задавать и обращаться к ним. Интересует такая ситуация: 1) есть описание структуры
struct plt{
char name[20];
int age;
struct plt *next;
};
необходимо создать динамический связный список, т. е. подается на вход некое количество N, заранее неизвестное имен и возрастов, необходимо с помощью malloc выделить память, в предыдущую переменную (*next) структуры добавить указатель на ту которую создали. Так же очень интересно как malloc выделяет память для каждой структуры Если можно привидите исходный код (с комментариями) который можно скомпилировать и посмотреть работу. Заранее спасибо.

Решение задачи: «Структуры, связные списки»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct plt{
    char name[20];
    int age;
    struct plt *next;
};
 
int main(int argc, char *argv[]) {
    struct plt *tmp;       // для промежуточных действий
    struct plt *list_data; // сам список
    
    // преобразовать выходное значение malloc к указателю на структуру
    // входное значение для malloc размер самой структуры
    list_data = (struct plt *)malloc(sizeof(struct plt));
    
    // Задаем первый элемент списка
    strcpy(list_data->name, "Имя 1");
    list_data->age = 20;
    list_data->next = NULL; // Начальный элемент next указывает на NULL
    
    // Выделяем память для следующего элемента списка
    tmp = (struct plt *)malloc(sizeof(struct plt));
    
    strcpy(tmp->name, "Имя 2");
    tmp->age = 30;
    tmp->next = list_data; // next указывает на предыдущий элемент
    
    list_data = tmp; // list_data указывает на последний элемент списка
    
    // Добавить N элементов
    
    tmp = list_data; // для прохода по списку используем промежуточное значеине
                     // дабы не потерять связь с началом списка
    
    // дотех пор пока невстретим указатель на NULL просмотрим список
    while(tmp != NULL) {
        fprintf(stdout, "%s %d\n", tmp->name, tmp->age);
        tmp = tmp->next; // переход к следущему элементу списка
    }
    
    tmp = list_data; // Теперь очистим список
    
    list_data = tmp->next; // list_data указывает на предпоследний элемент списка 
    free(tmp);
    free(list_data);
    
    return EXIT_SUCCESS;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы для работы со связными списками и для работы с памятью
  2. Объявляем структуру plt, которая содержит информацию об элементе связного списка: имя (массив символов), возраст (целое число) и указатель на следующий элемент списка
  3. В функции main() объявляем указатель на структуру plt для промежуточных действий и сам список
  4. Выделяем память под первый элемент списка, используя malloc() и присваиваем ему имя и возраст
  5. Устанавливаем указатель next для первого элемента в NULL, так как он будет последним элементом списка
  6. Выделяем память под второй элемент списка, используя malloc() и присваиваем ему имя и возраст
  7. Устанавливаем указатель next для второго элемента в указатель на первый элемент списка
  8. Устанавливаем указатель list_data на второй элемент списка
  9. Повторяем шаги 4-8 для добавления N-1 элементов списка
  10. Проходим по списку, выводя на экран имя и возраст каждого элемента, используя цикл while и fprintf()
  11. Освобождаем память, выделенную под каждый элемент списка, используя функцию free()
  12. Возвращаем EXIT_SUCCESS из функции main()

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5
Похожие ответы