Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include "stdlib.h"
- #include "locale.h"
- #include <string.h>
- #include <windows.h>
- typedef struct r
- {
- char name[25]; // название моста
- char designer[50]; //проектировщик
- char country[25]; //страна, в которой мост расположен
- int data; //дата открытия моста
- } Bridges;
- typedef struct t
- {
- Bridges *bridge; //инф. поля
- struct t *next; //указатель на следующий элемент
- } LIST;
- LIST* InPut();
- Bridges* INPUT2();
- void TAKEIN(LIST*);
- void FREE(LIST*);
- Bridges *FREE2(Bridges*);
- LIST* INPUTLIST(LIST*);
- LIST* SEARCH(LIST*, int);
- LIST* SEARCHLAST(LIST*);
- LIST* DELETLIST(LIST*);
- LIST* NEWLIST(LIST*, int);
- LIST* NEWBEGIN(LIST*,LIST*, int);
- void NEWEND(LIST*);
- void NEWMIDDLE(LIST*, int);
- LIST* DELETBEGIN(LIST*);
- void DELETMIDDLE(LIST*, int);
- void DELETEND(LIST*);
- int main()
- {
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- setlocale(LC_ALL, "rus");
- LIST *h = NULL;
- LIST *p;
- int q, y,e;
- bool A = false, B= false;
- do
- {
- puts("1. Ввод");
- puts("2. Вывод");
- puts("3. Сортировка");
- puts("4. Справка");
- puts("5. Выход");
- scanf("%d", &q);
- switch (q)
- {
- case 1: //ввод
- system("cls");
- h = INPUTLIST(h);
- A = true;
- system("pause");
- break;
- case 2: //вывод
- system("cls");
- puts("1.Вывод исходного списка");
- puts("2.Вывод нового списка");
- puts("3.Выход в главное меню");
- scanf("%d", &e);
- switch (e)
- {
- case 1: //вывод 1 списка
- if (A)
- {
- TAKEIN(h);
- }
- else
- puts("Для начала введите элементы списка.");
- break;
- case 2:// вывод 2 списка
- if (B)
- {
- TAKEIN(p);
- }
- else
- puts("Новый список не сформирован.");
- break;
- case 3: //выход в главное меню
- break;
- default:
- puts("Такого пункта нет в меню.");
- break;
- }
- system("pause");
- break;
- case 3://сортировка + удаление
- puts("1. Формирование нового списка по заданному параметру");
- puts("2. Удаление элементов");
- puts("3. Выход в главное меню");
- scanf("%d", &e);
- switch (e)
- {
- case 1://обработка
- do
- {
- puts("С какого года начать формировать список.");
- scanf("%d", &y);
- if (y > 2016)
- puts("Извините.Год не может быть больше 2015.");
- puts(“Повторите ввод”);
- if (y < 1565)
- puts("Извините.Год не может быть меньше 1500.");
- puts(“Повторите ввод”);
- } while ((y > 2016) || (y < 1500));
- p = NEWLIST(h, y);
- B = true;
- if (p == NULL)
- {
- puts("Список не сформирован, не удалось найти элементы ");
- puts("удовлетворяющие условию.");
- B = false;
- }
- break;
- case 2:
- if (A)
- h = DELETLIST(h);
- else
- puts("Список не создан");
- break;
- case 3:
- break;
- }
- system("pause");
- break;
- case 4://справка
- break;
- case 5:
- if (A)
- FREE(h);
- if (B)
- FREE(p);
- break;
- default:
- puts("Такого пункта нет в меню.");
- break;
- }
- } while (q != 5);
- system("pause");
- }
- //список
- LIST *InPut()
- {
- LIST *H;
- H = (LIST*)malloc(sizeof(LIST));
- H->bridge = INPUT2();
- H->next = NULL;
- return H;
- }
- //инф поля
- Bridges *INPUT2()
- {
- Bridges *P;
- P = (Bridges*)malloc(sizeof(Bridges));
- do // Страна
- {
- puts("Введите страну, в которой находится мост (поле не должно превышать 50 символов):");
- fflush(stdin);
- fgets(P->country, 51, stdin);
- if (strlen(P->country) > 50)
- puts("Извините, поле не должно превышать 50 символов. Повторите ввод");
- if (*(P->country) == '\n')
- puts("Поле со страной не может быть пустым.");
- } while ((*(P->country) == '\n') || (strlen(P->country) > 50));
- do // название моста
- {
- puts("Введите название моста(поле не должно превышать 50 символов):");
- fflush(stdin);
- fgets(P->name, 51, stdin);
- if (strlen(P->name) > 50)
- puts("Извините, поле не должно превышать 50 символов. Повторите ввод");
- if (*(P->name) == '\n')
- puts("Поле с названием моста не может быть пустым.");
- } while ((*(P->name) == '\n') || (strlen(P->name) > 50));
- do // год
- {
- puts("Введите год открытия моста:");
- fflush(stdin);
- scanf("%d", &(P->data));
- if (P->data > 2016)
- puts("Извините. Год не может быть больше 2015. Повторите ввод");
- if (P->data < 1500)
- puts("Извините. Год не может быть меньше 1500.Повторите ввод");
- } while ((P->data > 2016) || (P->data <1565));
- do//проектировщик
- {
- puts("Введите Имя проектировщика");
- fflush(stdin);
- fgets(P->designer, 51, stdin);
- if (strlen(P->designer) > 50)
- puts("Извините, имя проектировщика не может превышать 50 символов.Повторите ввод.");
- if (*(P->designer) == '\n')
- puts("Поле c именем проектировщика не может быть пустым.");
- } while ((*(P->designer) == '\n') || (strlen(P->designer) > 50));
- return P;
- }
- //вывод
- void TAKEIN(LIST *H)
- {
- while (H->next != NULL)
- {
- puts("\n");
- printf("Страна:\n%s", H->bridge->country);
- printf("Название:\n%s", H->bridge->name);
- printf("Год открытия %d\n", H->bridge->data);
- printf("Проектировщик %d\n", H->bridge->designer);
- H = H->next;
- }
- printf("Страна:\n%s", H->bridge->country);
- printf("Название:\n%s", H->bridge->name);
- printf("Год открытия %d\n", H->bridge->data);
- printf("Проектировщик :\n%s", H->bridge->designer);
- }
- //освобождение пямяти
- void FREE(LIST *H)
- {
- LIST *P, *L;
- Bridges *E;
- do
- {
- P = H->next;
- L = H;
- E = H->bridge;
- E = FREE2(E);
- free(L);
- if (P != NULL)
- H = P;
- } while (P != NULL);
- }
- // вспомогательная для освобождения памяти
- Bridges *FREE2(Bridges *H)
- {
- free(H);
- return NULL;
- }
- //создание списка
- LIST *INPUTLIST(LIST *H)
- {
- LIST *T= NULL;
- int y;
- int e;
- do
- {
- puts("1.Добавление в начало");
- puts("2.Добавление после выбранного элемента");
- puts("3.Добавление в конец");
- puts("4.Выход в главное меню");
- scanf("%d", &e);
- switch (e)
- {
- case 1:
- T = NEWBEGIN (H , NULL, 0);
- H = T;
- break;
- case 2:
- do
- {
- puts("После какого года добавить мост?.");
- scanf("%d", &y);
- if (y > 2016)
- puts("Извините.Год не может быть больше 2015. Повторите ввод");
- if (y < 1500)
- puts("Извините.Год не может быть меньше 1500.Повторите ввод");
- } while ((y > 2016) || (y < 1500));
- NEWMIDDLE(H, y);
- break;
- case 3:
- NEWEND(H);
- break;
- default:
- break;
- }
- } while (e != 4);
- return H;
- }
- //поиск
- LIST *SEARCH(LIST *H, int q)
- {
- LIST *P;
- P = H;
- do
- {
- if (P->bridge->data == q)
- return P;
- P = P->next;
- } while (P != NULL);
- return NULL;
- }
- //поиск последнего элемента
- LIST *SEARCHLAST(LIST *H)
- {
- LIST *R;
- R = H;
- while ((R->next)->next != NULL)
- R = R->next;
- return R;
- }
- //Удаление
- LIST *DELETLIST(LIST *H)
- {
- int q, y;
- do
- {
- puts("1.Удаление первого элемента списка");
- puts("2.Удаление после выбранного элемента");
- puts("3.Удаление последнего элемента списка");
- puts("4.Возврат в главное меню");
- scanf("%d", &q);
- switch (q)
- {
- case 1:
- H = DELETBEGIN(H);
- break;
- case 2:
- do
- {
- puts("После какого года удалить мост?");
- scanf("%d", &y);
- if (y > 2016)
- puts("Извините.Год не может быть больше 2015. Повторите ввод");
- if (y < 1500)
- puts("Извините.Год не может быть меньше 1565.Повторите ввод");
- } while ((y > 2016) || (y < 1500));
- DELETMIDDLE(H, y);
- break;
- case 3:
- DELETEND(H);
- break;
- default:
- break;
- }
- } while (q != 4);
- return H;
- }
- //сортировка
- LIST *NEWLIST(LIST *P, int y)
- {
- LIST *B, *O, *Q;
- Q = NULL;
- O = NULL;
- do
- {
- if (P->bridge->data >= y)
- {
- B = NEWBEGIN(P, Q, 1);
- if (O == NULL)
- {
- O = B;
- B->next = NULL;
- }
- Q = B;
- }
- P = P->next;
- } while (P != NULL);
- return Q;
- }
- //Добавление в начало
- LIST *NEWBEGIN(LIST *H, LIST *Q, int y)
- {
- LIST *P;
- if (y == 0)
- {
- P = InPut();
- P->next = H;
- }
- else
- {
- P = (LIST*)malloc(sizeof(LIST));
- P->bridge = H->bridge;
- if (Q != NULL)
- Q->next = P;
- else
- {
- Q = P;
- Q->next = NULL;
- return Q;
- }
- }return P;
- }
- //добавление в конец
- void NEWEND(LIST *H)
- {
- LIST *P, *R;
- P = SEARCHLAST(H);
- R = InPut();
- (P->next)->next = R;
- }
- //Добавление после указанного элемента
- void NEWMIDDLE(LIST *H, int y)
- {
- LIST *P, *R;
- P = SEARCH(H, y);
- if (P != NULL)
- {
- R = InPut();
- R->next = P->next;
- P->next = R;
- }
- else
- puts("Такой даты нет в списке.");
- }
- //удаление первого элемента
- LIST *DELETBEGIN(LIST *H)
- {
- LIST *P;
- P = H->next;
- free(H->bridge);
- free(H);
- return P;
- }
- //удаление после указанного элемента
- void DELETMIDDLE(LIST* H, int y)
- {
- LIST *P, *Q;
- P = SEARCH(H, y);
- if (P != NULL)
- {
- Q = P->next;
- P->next = P->next->next;
- free(Q->bridge);
- free(Q);
- }
- else
- puts("Год не был найден");
- }
- //удаление последнего
- void DELETEND(LIST* H)
- {
- LIST *P, *Q;
- P = SEARCHLAST(H);
- Q = P->next;
- P->next = NULL;
- free(Q->bridge);
- free(Q);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement