Структуры, связные списки - C (СИ)
Формулировка задачи:
Пожалуйста помогите разобраться со структурами.
Понял как их задавать и обращаться к ним.
Интересует такая ситуация:
1) есть описание структуры
необходимо создать динамический связный список, т. е. подается на вход некое количество N, заранее неизвестное имен и возрастов, необходимо с помощью malloc выделить память, в предыдущую переменную (*next) структуры добавить указатель на ту которую создали.
Так же очень интересно как malloc выделяет память для каждой структуры
Если можно привидите исходный код (с комментариями) который можно скомпилировать и посмотреть работу.
Заранее спасибо.
struct plt{ char name[20]; int age; struct plt *next; };
Решение задачи: «Структуры, связные списки»
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; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы со связными списками и для работы с памятью
- Объявляем структуру
plt
, которая содержит информацию об элементе связного списка: имя (массив символов), возраст (целое число) и указатель на следующий элемент списка - В функции main() объявляем указатель на структуру
plt
для промежуточных действий и сам список - Выделяем память под первый элемент списка, используя malloc() и присваиваем ему имя и возраст
- Устанавливаем указатель next для первого элемента в NULL, так как он будет последним элементом списка
- Выделяем память под второй элемент списка, используя malloc() и присваиваем ему имя и возраст
- Устанавливаем указатель next для второго элемента в указатель на первый элемент списка
- Устанавливаем указатель list_data на второй элемент списка
- Повторяем шаги 4-8 для добавления N-1 элементов списка
- Проходим по списку, выводя на экран имя и возраст каждого элемента, используя цикл while и fprintf()
- Освобождаем память, выделенную под каждый элемент списка, используя функцию free()
- Возвращаем EXIT_SUCCESS из функции main()
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д