Структуры, связные списки - 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()