Реализовать в виде односвязного списка - C (СИ)
Формулировка задачи:
Туристическое агентство содержит список клиентов. Создайте массив структур «Клиенты», структура содержит идентификационный номер клиента, ФИО, стоимость путевки, место отдыха (реализовать в виде односвязного списка)
Решение задачи: «Реализовать в виде односвязного списка»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #define MAX_LOCATION_LENGTH 128 #define MAX_PERSON_NAME_LENGTH 64 struct Voucher { double price; char location[MAX_LOCATION_LENGTH + 1]; }; struct Client { unsigned int id; char surname[MAX_PERSON_NAME_LENGTH + 1]; char name[MAX_PERSON_NAME_LENGTH + 1]; struct Voucher voucher; }; struct OneWayList { struct Client clientData; struct OneWayList* next; }; void AddToList(struct OneWayList** const rootPtr, const struct Client client) { if (*rootPtr == NULL) { *rootPtr = malloc(sizeof(**rootPtr)); (*rootPtr)->clientData = client; (*rootPtr)->next = NULL; } else { struct OneWayList* p = *rootPtr; while (p->next != NULL) p = p->next; p->next = malloc(sizeof(*p)); p->next->clientData = client; p->next->next = NULL; } } void PrintList(const struct OneWayList* const root) { const struct OneWayList* p = root; int i = 0; printf("===== List values: =====\n"); while (p != NULL) { printf("Client %3d:\n" " ID: %u\n" " Name: %s\n" " Surname: %s\n" " Voucher data:\n" " location: %s\n" " price: %f\n", ++i, p->clientData.id, p->clientData.name, p->clientData.surname, p->clientData.voucher.location, p->clientData.voucher.price); p = p->next; } } void ClearList(struct OneWayList** rootPtr) { while (*rootPtr != NULL) { struct OneWayList* p = (*rootPtr)->next; free(*rootPtr); *rootPtr = p; } } int main(void) { struct OneWayList* clientListRoot = NULL; struct Client clientIvanov = { .id = 119, .surname = "Ivanov", .name = "Ivan", .voucher.price = 12.45, .voucher.location = "Thailand" }; struct Client clientPetrov = { .id = 187256, .surname = "Petrov", .name = "Sergey", .voucher.price = 9.5, .voucher.location = "India" }; struct Client clientSidorov = { .id = 11223, .surname = "Sidorov", .name = "Oleg", .voucher.price = 112.99, .voucher.location = "Florida, USA" }; struct Client clientSokolova = { .id = 998, .surname = "Sokolova", .name = "Oksana", .voucher.price = 229.99, .voucher.location = "Mallorca" }; AddToList(&clientListRoot, clientIvanov); AddToList(&clientListRoot, clientPetrov); AddToList(&clientListRoot, clientSidorov); AddToList(&clientListRoot, clientSokolova); PrintList(clientListRoot); ClearList(&clientListRoot); return 0; }
Объяснение кода листинга программы
- В начале кода определяются две структуры:
Client
иVoucher
. - Структура
Client
содержит поля:id
,surname
,name
иvoucher
. - Структура
Voucher
содержит поля:price
иlocation
. - Определяется структура
OneWayList
, которая содержит поля:clientData
(содержащее структуруClient
) иnext
(указатель на следующий элемент списка). - Функция
AddToList
добавляет новый элемент в список. Если список пуст, выделяется память под новый элемент списка. Если список не пуст, новый элемент добавляется в конец списка. - Функция
PrintList
выводит на экран все элементы списка. - Функция
ClearList
освобождает память, выделенную под каждый элемент списка, начиная с его головы. - В функции
main
создаются несколько структурClient
с данными о клиентах. - Создается указатель на голову списка
clientListRoot
. - С помощью функции
AddToList
каждому клиенту создается запись в списке. - С помощью функции
PrintList
выводятся данные всех клиентов. - С помощью функции
ClearList
освобождается память, выделенная под списком. - Программа завершается возвратом значения 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д