Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // окончательный вариант.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include <stdlib.h>
- #include <cstdio>
- #include "locale.h"
- #include <cstdlib>
- #include <Windows.h>
- #pragma warning (disable:4996)
- typedef struct R
- {
- char name[25];//название книги
- char writer[50];//имя автора
- char *genre;//жанр
- int data;//год издания
- }Books;
- typedef struct T
- {
- Books *book;//указатель на информационные поля
- struct T *next;//указатель на следующий элемент
- }List;
- int Menu();//вывод главного меню
- int Menu1();//вывод подменю для добавления элемента
- int Menu2();//вывод подменю для удаления элемента
- List* InputOne();//ввод элемента списка
- char* InputGenre();//ввод поля "жанр"
- void OutputList(List*);//вывод списка на экран
- List* NewBegin(List*);//добавление элемента в начало списка
- void NewPlace(List*);//добавление элемента в место, указанное пользователем
- void NewEnd(List*);//добавление элемента в конец списка
- List* DeleteBegin(List*);//удаление первого элемента списка
- void DeletePlace(List*);//удаление элемента, указанного пользователем
- void DeleteEnd(List*);//удаление последнего элемента
- void Free(List*);//освобождение памяти
- List* NewList(List*);//формирование нового списка
- void main()
- {
- List *first = NULL, *second = NULL;
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- int S, s;
- bool A = false, B = false;
- do
- {
- system("cls");
- S = Menu();
- switch (S)
- {
- // добавление элементов
- case 1:
- system("cls");
- if (A == false)
- {
- first = InputOne();
- A = true;
- }
- else
- {
- s = Menu1();
- switch (s)
- {
- // в начало
- case 1:
- system("cls");
- first = NewBegin(first);
- break;
- // после выбранного
- case 2:
- system("cls");
- NewPlace(first);
- break;
- // в конец
- case 3:
- system("cls");
- NewEnd(first);
- break;
- case 0:
- break;
- default:
- puts("Ошибка. Выберите один из пунктов меню");
- break;
- }
- }
- break;
- //удаление элементов
- case 2:
- if (A == false)
- {
- system("cls");
- puts("Список еще не введен");
- system("pause");
- }
- else
- {
- system("cls");
- s = Menu2();
- switch (s)
- {
- // первый элемент
- case 1:
- system("cls");
- first = DeleteBegin(first);
- puts("Элемент удален");
- system("pause");
- break;
- // выбранный элемент
- case 2:
- system("cls");
- DeletePlace(first);
- puts("Элемент удален");
- system("pause");
- break;
- // последний элемент
- case 3:
- system("cls");
- DeleteEnd(first);
- puts("Элемент удален");
- system("pause");
- break;
- case 0:
- break;
- default:
- puts("Ошибка. Выберите один из пунктов меню");
- break;
- }
- }
- break;
- case 3:
- system("cls");
- second = NewList(first);
- if (second == NULL)
- puts("В исходном списке нет элементов, удовлетворяющих условию");
- else
- {
- puts("Список сформирован");
- B = true;
- }
- system("pause");
- break;
- case 4:
- system("cls");
- if (A == true && B == true)
- {
- puts("Выберите один из пунктов меню");
- puts("1.Показать исходный список");
- puts("2.Показать сформированный список");
- puts("0.Вернуться в главное меню");
- scanf_s("%d", &s);
- switch (s)
- {
- case 1:
- system("cls");
- OutputList(first);
- system("pause");
- break;
- case 2:
- system("cls");
- OutputList(second);
- system("pause");
- break;
- case 3:
- break;
- default:
- puts("Ошибка. Выберите один из пунктов меню");
- }
- }
- else
- {
- system("cls");
- OutputList(first);
- system("pause");
- }
- break;
- case 0:
- if (A == true)
- Free(first);
- if (B == true)
- Free(second);
- break;
- default:
- puts("Ошибка. Выберите один из пунктов меню");
- break;
- }
- } while (S != 0);
- }
- //вывод главного меню
- int Menu()
- {
- int S;
- puts("Выберите один из пунктов меню");
- puts("1.Добавление элементов в список");
- puts("2.Удаление элементов из списка");
- puts("3.Формирование нового списка");
- puts("4.Вывод списка");
- puts("0.Выход из программы");
- scanf_s("%d", &S);
- return S;
- }
- //вывод подменю для добавления элемента
- int Menu1()
- {
- int s;
- puts("1.Добавить элемент в начало");
- puts("2.Добавить элемент после выбранного элемента");
- puts("3.Добавить элемент в конец");
- puts("0.Вернуться в главное меню");
- scanf_s("%d", &s);
- return s;
- }
- //вывод подменю для добавления элемента
- int Menu2()
- {
- int s;
- puts("1.Удалить первый элемент");
- puts("2.Удалить выбранный элемент");
- puts("3.Удалить последний элемент");
- puts("0.Вернуться в главное меню");
- scanf_s("%d", &s);
- return s;
- }
- //ввод элемента списка
- List* InputOne()
- {
- List *N = NULL;
- N = (List*)malloc(sizeof(List));
- N->book = (Books*)malloc(sizeof(Books));
- N->next = NULL;
- do
- {
- printf("Введите название книги(не более 25 символов):");
- fflush(stdin);
- fgets((N->book->name), 30, stdin);
- if (strlen(N->book->name) > 25)
- puts("Извините, поле превышает 25 символов. Повторите ввод.");
- if (*(N->book->name) == '\n')
- puts("Извините, поле пустое. Повторите ввод.");
- } while ((strlen(N->book->name) > 25) || (*(N->book->name) == '\n'));
- do
- {
- printf("\nВведите автора книги(не более 25 символов):");
- fflush(stdin);
- fgets(N->book->writer, 55, stdin);
- if (strlen(N->book->writer) > 50)
- puts("Извините, поле превышает 50 символов. Повторите ввод.");
- if (*(N->book->writer) == '\n')
- puts("Извините, поле пустое. Повторите ввод.");
- } while ((strlen(N->book->writer) > 50) || (*(N->book->writer) == '\n'));
- N->book->genre = InputGenre();
- do
- {
- printf("\nВведите год издания:");
- fflush(stdin);
- scanf_s("%d", &(N->book->data));
- if ((N->book->data) > 2016)
- puts("Извините, книга не может быть выпущена после 2016 года. Повторите ввод.");
- if ((N->book->data) <1600)
- puts("Извините, книга не может быть выпущена раньше 1600 года. Повторите ввод.");
- } while ((((N->book->data) > 2016) || ((N->book->data) < 1600)));
- return N;
- }
- //ввод поля "жанр"
- char* InputGenre()
- {
- int a;
- puts("\nВыберите жанр книги:");
- puts("1.Биография");
- puts("2.Детектив");
- puts("3.Детская литература");
- puts("4.Историческая литература");
- puts("5.Научная литература:");
- puts("6.Повесть");
- puts("7.Поэзия");
- puts("8.Роман");
- puts("9.Фантастика");
- scanf_s("%d", &a);
- switch (a)
- {
- case 1:
- return "Биография";
- break;
- case 2:
- return "Детектив";
- break;
- case 3:
- return "Детская литература";
- break;
- case 4:
- return "Историческая литература";
- break;
- case 5:
- return "Научная литература";
- break;
- case 6:
- return "Повесть";
- break;
- case 7:
- return "Поэзия";
- break;
- case 8:
- return "Роман";
- break;
- case 9:
- return "Фантастика";
- break;
- default:
- return ("Жанр не указан");
- break;
- }
- }
- //добавление элемента в начало списка
- List* NewBegin(List *N)
- {
- List* H;
- H = InputOne();
- H->next = N;
- return H;
- }
- //вывод списка на экран
- void OutputList(List *N)
- {
- if (N != NULL)
- {
- while (N->next != NULL)
- {
- printf("\nНазвание книги: %s", N->book->name);
- printf("Автор книги: %s", N->book->writer);
- printf("Жанр: %s\n", N->book->genre);
- printf("Год выпуска: %d\n", N->book->data);
- N = N->next;
- }
- printf("\nНазвание книги: %s", N->book->name);
- printf("Автор книги: %s", N->book->writer);
- printf("Жанр: %s\n", N->book->genre);
- printf("Год выпуска: %d\n", (N->book->data));
- }
- else
- {
- puts("В списке нет элементов");
- system("pause");
- }
- }
- //добавление элемента в конец списка
- void NewEnd(List *N)
- {
- List* H;
- H = InputOne();
- while (N->next != NULL)
- N = N->next;
- N->next = H;
- }
- //удаление первго элемента списка
- List* DeleteBegin(List* N)
- {
- List* H;
- H = N->next;
- free(N->book);
- free(N);
- return H;
- }
- //удаление последнего элемента списка
- void DeleteEnd(List* N)
- {
- List* K, *H;
- H = N;
- while (H->next != NULL)
- H = H->next;
- K = H;
- free(K->book);
- free(K);
- }
- //добавление элемента в место, указанное пользователем
- void NewPlace(List* N)
- {
- List* K;
- int data;
- do
- {
- printf("\nВведите год, после которого Вы хотите вставить элемент:");
- scanf_s("%d", &data);
- if (data > 2016)
- puts("Извините, книга не может быть выпущена после 2016 года. Повторите ввод.");
- if (data <1600)
- puts("Извините, книга не может быть выпущена раньше 1600 года. Повторите ввод.");
- } while (((data > 2016) || (data < 1600)));
- while (N->book->data != data && N->next != NULL)
- {
- N = N->next;
- }
- if (N->next == NULL && N->book->data != data)
- {
- puts("Такого элемента нет");
- system("pause");
- }
- else
- {
- K = InputOne();
- K->next = N->next;
- N->next = K;
- }
- }
- //удаление элемента, указанного пользователем
- void DeletePlace(List* N)
- {
- List* H, *K;
- int data;
- do
- {
- printf("\nВведите год элемента, который вы хотите удалить:");
- scanf_s("%d", &data);
- if (data > 2016)
- puts("Извините, книга не может быть выпущена после 2016 года. Повторите ввод.");
- if (data <1600)
- puts("Извините, книга не может быть выпущена раньше 1600 года. Повторите ввод.");
- } while (((data > 2016) || (data < 1600)));
- while ((N->next)->book->data != data && N->next->next!= NULL)
- N = N->next;
- if (N->next->next == NULL && N->book->data != data)
- {
- puts("Такого элемента нет");
- system("pause");
- }
- else
- {
- K = N->next;
- N->next = N->next->next;
- free(K->book);
- free(K);
- }
- }
- //освобождение памяти
- void Free(List* N)
- {
- if (N != NULL)
- {
- List* H, *K = NULL;
- Books* M;
- while (N->next != NULL)
- {
- H = N->next;
- K = N;
- free(N->book->genre);
- M = N->book;
- free(M);
- free(K);
- if (H != NULL)
- N = H;
- }
- free(N->book);
- free(N);
- }
- }
- //формирование нового списка
- List* NewList(List* N)
- {
- List* NN = NULL, *B;
- int data;
- do
- {
- printf("\nВведите год, начиная с которого Вы хотите сформировать список:");
- scanf_s("%d", &data);
- if (data > 2016)
- puts("Извините, книга не может быть выпущена после 2016 года. Повторите ввод.");
- if (data <1600)
- puts("Извините, книга не может быть выпущена раньше 1600 года. Повторите ввод.");
- } while (((data > 2016) || (data < 1600)));
- do
- {
- if (N->book->data >= data)
- {
- B = (List*)malloc(sizeof(List));
- B->book = N->book;
- B->next = NULL;
- if (NN != NULL)
- NN->next = B;
- else
- NN = B;
- }
- N = N->next;
- } while (N != NULL);
- return NN;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement