Добавил:
rushevamar@mail.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лаба_списки вариант 20

.docx
Скачиваний:
9
Добавлен:
09.09.2020
Размер:
153.76 Кб
Скачать

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

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

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

Списки

Вариант 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)консоль