лаба_списки вариант 20
.docxБелорусский государственный университет информатики и радиоэлектроники
Кафедра экономический информатики
Основы алгоритмизации и программирования
Списки
Вариант 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)консоль