Реализовать в виде односвязного списка - 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.