Вы находитесь на странице: 1из 9

Белорусский государственный университет информатики и

радиоэлектроники

Кафедра экономический информатики

Основы алгоритмизации и программирования

Списки

Вариант 20

Студент Рушева М.В.


Группа 972304

Минск,2020
1)задание
1)создает пустой список
2)добавляет элементы в список
3)удаляет элементы списка
4)выполняет функции по вариантам
5)выводит список на экран
6)выход

countList - Функцию подсчета числа элементов;


findMax - Функцию поиска максимального элемента списка;
findMin - Функцию поиска минимального элемента списка;
deleteDouble - Функцию удаления повторяющихся элементов;
DeleteList -Функцию удаления всего списка.

список "читатель" - фио, номер чит билета, название книги, срок возврата

2)код
Файл “Margo.h”

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct {
size_t day;
size_t month;
size_t year;
} Date;

typedef struct {
char fio[45];
size_t ID;
char title[50];
char giveBack[11];
} Reader;

typedef struct _node {


Reader reader;
struct _node* next;
} Node;

typedef struct {
Node* first;
Node* last;
size_t count;
} List;

void initReader(Reader* reader)


{
printf_s("Введите ФИО: ");
scanf_s("%s", reader->fio, sizeof(reader->fio));

printf_s("Введите № читательского билета: ");


scanf_s("%zu", &reader->ID);

printf_s("Введите название книги: ");


scanf_s("%s", reader->title, sizeof(reader->title));

printf_s("Введите дату возврата книги: ");


scanf_s("%s", reader->giveBack, sizeof(reader->giveBack));
}

void printReader(Reader* reader)


{
printf_s("ФИО: %s\n", reader->fio);
printf_s("№Билета: %zu\n", reader->ID);
printf_s("Название книги: %s\n", reader->title);
printf_s("Дата возврата: %s\n", reader->giveBack);
puts("------------------------------");
}

List* createList()
{
List* list = (List*)calloc(1, sizeof(Node));
list->count = 0;
list->first = list->last = NULL;

return list;
}

void printList(List* list)


{
if (list)
{
size_t n = 0;
Node* node = list->first;
if (!node)
{
puts("Список пуст!");
}
while (node)
{
printf_s("%zu).", ++n);
printReader(&node->reader);
node = node->next;
}
}
else
puts("Списка нет!");
}

Node* prepend(List** list)


{

if ((*list) == NULL)
{
(*list) = (List*)calloc(1, sizeof(List));
(*list)->count = 0;
(*list)->first = (*list)->last = NULL;
}

Node* node = (Node*)calloc(1, sizeof(Node));


initReader(&node->reader);

if ((*list)->count == 0)
{
(*list)->first = (*list)->last = node;
}
else
{
node->next = (*list)->first;
(*list)->first = node;
}
++(*list)->count;
return (*list)->first;
}

Node* append(List** list)


{
if ((*list) == NULL)
{
(*list) = (List*)calloc(1, sizeof(List));
(*list)->count = 0;
(*list)->first = (*list)->last = NULL;
}

Node* node = (Node*)calloc(1, sizeof(Node));


initReader(&node->reader);

if ((*list)->count == 0)
{
(*list)->first = (*list)->last = node;
}
else
{
(*list)->last->next = node;
(*list)->last = (*list)->last->next;
}
++(*list)->count;
return (*list)->last;
}

size_t countList(List* list)


{
size_t n = 0;

if (!list)
{
puts("Список не создан!");
}
else if (list->first == NULL)
{
puts("Список пуст!");
}

else
{
Node* node = list->first;

while (node)
{
++n;
node = node->next;
}
}

return n;
}

void removeItem(List* list)


{
if (list && list->count)
{
size_t n;

printList(list);
printf_s("Введите номер записи для удаления: ");
scanf_s("%zu", &n);

if (0 > n || n > list->count)


{
puts("Неорректный ввод!");
return;
}

Node* node = list->first, * trail = NULL;

for (size_t i = 1; i < n; i++)


{
trail = node;
node = node->next;
}

if (trail)
{
trail = list->first;
list->first = list->first->next;

if (trail == list->last)
list->last = NULL;
free(trail);
}
else
{
trail-> next = node->next;
if (node == list->last)
list->last = trail;
free(node);
}
--list->count;
}
else
puts("Список не существует либо пуст!");
}

int deleteList(List** list)


{
if (*list)
{
Node* tmp = NULL;
while ((*list)->first)
{
tmp = (*list)->first;
(*list)->first = (*list)->first->next;
free(tmp);
}
(*list)->last = NULL;

(*list)->count = 0;

free(*list);
*list = NULL;
return 1;
}
else
{
puts("Невозможно удалить несуществующий список!");
return 0;
}
}

int compareReaders(Reader* r1, Reader* r2)


{
if (!strcmp(r1->fio, r2->fio) && !strcmp(r1->title, r2->title) && r1->ID == r2-
>ID)
return 1;
return 0;
}

void deleteDuplicates(List* list)


{
if (list)
{
Node* tmp = list->first, * trail = tmp, * del = trail->next;

while (tmp)
{
while (del)
{
if (compareReaders(&tmp->reader, &del->reader))
{
while (trail->next != del)
{
trail = trail->next;
}

trail->next = del->next;
if (del == list->last)
list->last = trail;
free(del);
del = trail->next;
--list->count;
}
else
del = del->next;
}
tmp = tmp->next;
trail = tmp;
if (trail)
del = trail->next;
}
}
else
puts("Список не создан!");
}

Файл “main.c”
#include "Margo.h"

int main()
{
system("chcp 1251 & cls");

List* list = NULL;


size_t ch = 0;

while (1)
{
puts("добро пожаловать");
puts("1.создать пустой список");
puts("2.добавить элемент в список");
puts("3.удалить элемент из списка");
puts("4.выполнить функции по вариантам");
puts("5.вывести список в консоль");
puts("6.выход");

printf_s(">> ");
scanf_s("%zu", &ch);

switch (ch)
{

case 1:
list = createList();
break;

case 2:

puts("1.добавить в начало списка");


puts("2.добавить в конец списка");
printf_s(">> ");
scanf_s("%zu", &ch);

switch (ch)
{

case 1:
prepend(&list);
break;

case 2:
append(&list);
break;
default:
puts("Некорректный ввод!");
break;
}
break;
case 3:
removeItem(list);
break;
case 4:
puts("\t1.подсчитать кол-во элементов");
puts("\t2.удалить повторяющиеся элементы");
puts("\t3.полностью удалить список");

printf_s("\t>> ");
scanf_s("%zu", &ch);
switch (ch)
{
case 1:
{
size_t length = countList(list);
printf_s("\tКол-во элементов в списке: %zu\n", length);
}
break;
case 2:
deleteDuplicates(list);
printList(list);
break;
case 3:
if (deleteList(&list))
puts("Список удалён.");
break;
default:
puts("Некорректный ввод!");
break;
}
break;
case 5:
printList(list);
break;
default:
break;
}

if (ch == 6) break;
puts("------------------------------");
}

deleteList(&list);

return EXIT_SUCCESS;
}

3)консоль