Создать список "Человек": фамилия, возраст - C (СИ)
Формулировка задачи:
Добрый день! Сделала лабораторную работу по теме: списки. Задача была создать список "Человек": фамилия, возраст. Создать функции добавления, удаления и вывода элементов. Использовала массив фамилий. Преподаватель сказал решить задачу БЕЗ использования массивов. Подскажите, пожалуйста, как. Заранее, спасибо большое)
Решение задачи: «Создать список "Человек": фамилия, возраст»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> struct SList { char secondName[32]; int age; struct SList* next; }; struct SList* AddMan(struct SList* slist, const char* name, int age) { struct SList* newSList = (struct SList*)calloc(1, sizeof(struct SList)); newSList->age = age; strncpy(newSList->secondName, name, 31); if (slist) { newSList->next = slist->next; slist->next = newSList; return slist; } else return newSList; } void RemoveMan(struct SList* afterMe) { struct SList* nodeToRemove = afterMe->next; afterMe->next = nodeToRemove->next; free(nodeToRemove); } void PrintMen(struct SList* startSList) { for (; startSList != NULL; startSList = startSList->next) printf("%-12s %d\n", startSList->secondName, startSList->age); } void DestroySList(struct SList* startSList) { for (struct SList* node = startSList->next; startSList != NULL; startSList = node, node = node?node->next:NULL) free(startSList); } int main() { struct SList* menList = NULL; menList = AddMan(menList, "Fedor", 18); menList = AddMan(menList, "Alex", 33); menList = AddMan(menList, "Peter", 27); menList = AddMan(menList, "Matvey", 29); PrintMen(menList); // find and remove peter for (struct SList* man = menList; man->next != NULL; man = man->next) if (strncmp("Peter", man->next->secondName, 5) == 0) RemoveMan(man); puts("\n\nPeter is dead, sorry."); PrintMen(menList); DestroySList(menList); getchar(); }
Объяснение кода листинга программы
- Структура данных
Человек
определена внутри файла. Она содержит два поля: фамилию (secondName) и возраст (age). - Функция AddMan добавляет нового человека в список. Она принимает указатель на начало списка, имя и возраст человека. Выделяет память под нового человека, копирует имя и возраст в новый элемент списка, связывает новый элемент со старым элементом списка. Возвращает указатель на новый элемент списка.
- Функция RemoveMan удаляет указанного человека из списка. Она принимает указатель на элемент списка, следующий за удаляемым элементом. Устанавливает ссылку на следующий элемент списка для элемента перед удаляемым элементом. Освобождает память, выделенную под удаляемый элемент списка.
- Функция PrintMen выводит список людей на экран. Она принимает указатель на начало списка. В цикле, пока есть элементы в списке, выводит имя и возраст каждого элемента списка.
- Функция DestroySList уничтожает список. Она принимает указатель на начало списка. В цикле, пока есть элементы в списке, освобождает память, выделенную под текущий элемент списка. Устанавливает ссылку на следующий элемент списка для элемента перед удаляемым элементом.
- В функции main создается пустой список людей. Затем добавляются четыре человека с разными именами и возрастами. Выводится список людей. Затем находится и удаляется человек с именем
Peter
. Выводится обновленный список людей. Затем список уничтожается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д