Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stdlib.h>
- #include <Windows.h>
- using namespace std;
- struct BusInfo {
- int routeNum;
- string minute, hour, day, month, year;
- double cost;
- };
- struct Node
- {
- string busNum;
- BusInfo info;
- Node* prev;
- Node* next;
- };
- BusInfo createBus() {
- BusInfo info;
- cout << "Введите номер маршрута: ";
- cin >> info.routeNum;
- cout << "Введите дату отправления в формате дд.мм.гггг: ";
- string date;
- cin >> date;
- info.day = date.substr(0, 2);
- info.month = date.substr(3, 2);
- info.year = date.substr(6, 4);
- cout << "Введите время отправления в формате чч:мм: ";
- string time;
- cin >> time;
- info.hour = time.substr(0, 2);
- info.minute = time.substr(3, 2);
- cout << "Введите цену поездки: ";
- cin >> info.cost;
- return info;
- }
- void printNodeWithLabel(Node* cur) {
- cout << "Номер автобуса: " << cur->busNum << " Маршрут: " << cur->info.routeNum << " Дата отправления: "
- << cur->info.day << "." << cur->info.month << "." << cur->info.year << " Время отправления: "
- << cur->info.hour << ":" << cur->info.minute << " Цена поездки: " << cur->info.cost << "р" << endl;
- }
- void printNode(Node* cur) {
- cout << cur->busNum << "\t\t\t" << cur->info.routeNum << "\t\t"
- << cur->info.day << "." << cur->info.month << "." << cur->info.year << "\t\t"
- << cur->info.hour << ":" << cur->info.minute << "\t\t\t" << cur->info.cost << "р" << endl;
- }
- void printList(Node* head) {
- Node* current = head;
- if (head != NULL) {
- cout << "Номер автобуса:\t\t" << "Маршрут:\t" << "Дата отправления:\t"
- << "Время отправления:\t" << "Цена поездки:\t" << endl;
- }
- while (current != NULL) {
- printNode(current);
- current = current->next;
- }
- cout << endl;
- }
- void printReverseList(Node* tail) {
- Node* current = tail;
- if (tail != NULL) {
- cout << "Номер автобуса:\t\t" << "Маршрут:\t" << "Дата отправления:\t"
- << "Время отправления:\t" << "Цена поездки:\t" << endl;
- }
- while (current != NULL) {
- printNode(current);
- current = current->prev;
- }
- cout << endl;
- }
- void addAtFront(Node*& head, Node*& tail, string busNum, BusInfo info) {
- if (head == NULL && tail == NULL)
- {
- Node* temp = new Node;
- temp->busNum = busNum;
- temp->info = info;
- temp->next = NULL;
- temp->prev = NULL;
- head = temp;
- tail = temp;
- }
- else
- {
- Node* temp = new Node;
- temp->busNum = busNum;
- temp->info = info;
- temp->next = head;
- temp->prev = NULL;
- head->prev = temp;
- head = temp;
- }
- }
- void addAtBack(Node*& head, Node*& tail, string busNum, BusInfo info) {
- if (head == NULL && tail == NULL)
- {
- Node* temp = new Node;
- temp->busNum = busNum;
- temp->info = info;
- temp->next = NULL;
- temp->prev = NULL;
- head = temp;
- tail = temp;
- }
- else
- {
- Node* temp = new Node;
- temp->busNum = busNum;
- temp->info = info;
- temp->prev = tail;
- temp->next = NULL;
- tail->next = temp;
- tail = temp;
- }
- }
- void createList(Node*& head, Node*& tail, int n) {
- for (int i = 0; i < n; i++) {
- string busNum;
- cout << "Введите номер автобуса: ";
- cin >> busNum;
- addAtBack(head, tail, busNum, createBus());
- cout << endl;
- }
- }
- void addAfterLastWithValue(Node*& tail, string busNum) {
- Node* elem = tail;
- while (elem != NULL) {
- if (elem->busNum == busNum) {
- Node* newNode = new Node;
- cout << "Введите номер автобуса: ";
- cin >> newNode->busNum;
- newNode->info = createBus();
- cout << endl;
- newNode->next = elem->next;
- newNode->prev = elem;
- if (elem->next != NULL) {
- elem->next->prev = newNode;
- }
- elem->next = newNode;
- break;
- }
- elem = elem->prev;
- }
- }
- void delAllWithValue(Node*& head, string busNum) {
- Node* elem = head;
- while (elem != NULL) {
- if (elem->busNum == busNum) {
- if (elem->prev == NULL && elem->next == NULL) {
- head = NULL;
- break;
- }
- if (elem->prev != NULL) {
- elem->prev->next = elem->next;
- }
- if (elem->next != NULL) {
- elem->next->prev = elem->prev;
- }
- }
- elem = elem->next;
- }
- }
- int countWithValue(Node* head, string busNum, string date) {
- Node* elem = head;
- int count = 0;
- string day = date.substr(0, 2);
- string month = date.substr(3, 2);
- string year = date.substr(6, 4);
- while (elem != NULL) {
- if (elem->busNum == busNum && elem->info.day == day && elem->info.month == month && elem->info.year == year) {
- count++;
- }
- elem = elem->next;
- }
- return count;
- }
- Node* getNode(Node* head, string value) {
- Node* elem = head;
- while (elem != NULL) {
- if (elem->busNum == value) {
- break;
- }
- elem = elem->next;
- }
- return elem;
- }
- Node* getLastNode(Node* tail, string value) {
- Node* elem = tail;
- while (elem != NULL) {
- if (elem->busNum == value) {
- break;
- }
- elem = elem->prev;
- }
- return elem;
- }
- void menu() {
- Node* head = NULL;
- Node* tail = NULL;
- while (true) {
- MENU:
- cout << "Выберите действие:" << endl;
- cout << "1. Создать список рейсов" << endl;
- cout << "2. Добавить рейс в начало списка" << endl;
- cout << "3. Добавить рейс в конец списка" << endl;
- cout << "4. Добавить рейс в список после последнего рейса автобуса с заданным номером" << endl;
- cout << "5. Убрать из списка все рейсы автобуса с заданным номером" << endl;
- cout << "6. Подсчитать, сколько раз автобус с заданным номером выходил на маршрут в течении заданного дня" << endl;
- cout << "7. Вывести первый в списке рейс автобуса с заданным номером" << endl;
- cout << "8. Вывести последний в списке рейс автобуса с заданным номером" << endl;
- cout << "9. Вывести список" << endl;
- cout << "10. Вывести список в обратном порядке" << endl;
- cout << "0. Выход" << endl;
- int choice;
- string busNum;
- int num;
- string date;
- RETRY:
- cin >> choice;
- switch (choice)
- {
- case 1:
- cout << "Введите количество рейсов, которое вы хотите создать: ";
- cin >> num;
- createList(head, tail, num);
- goto MENU;
- case 2:
- cout << "Введите номер автобуса: ";
- cin >> busNum;
- addAtFront(head, tail, busNum, createBus());
- cout << endl;
- goto MENU;
- case 3:
- cout << "Введите номер автобуса: ";
- cin >> busNum;
- addAtBack(head, tail, busNum, createBus());
- cout << endl;
- goto MENU;
- case 4:
- cout << "Введите номер автобуса, после последнего рейса которого хотите добавить новый рейс: ";
- cin >> busNum;
- addAfterLastWithValue(tail, busNum);
- cout << endl;
- goto MENU;
- case 5:
- cout << "Введите номер автобуса: ";
- cin >> busNum;
- delAllWithValue(head, busNum);
- cout << endl;
- goto MENU;
- case 6:
- cout << "Введите номер автобуса: ";
- cin >> busNum;
- cout << "Введите дату в формате дд.мм.гггг: ";
- cin >> date;
- cout << "Автобус с номером " << busNum << " выходил " << date << " на маршрут " << countWithValue(head, busNum, date) << " раз" << endl;
- cout << endl;
- goto MENU;
- case 7:
- cout << "Введите номер автобуса: ";
- cin >> busNum;
- if (getNode(head, busNum) != NULL) {
- printNodeWithLabel(getNode(head, busNum));
- }
- else cout << "Автобуса с таким номером не существует!" << endl;
- cout << endl;
- goto MENU;
- case 8:
- cout << "Введите номер автобуса: ";
- cin >> busNum;
- if (getLastNode(tail, busNum) != NULL) {
- printNodeWithLabel(getLastNode(tail, busNum));
- }
- else cout << "Автобуса с таким номером не существует!" << endl;
- cout << endl;
- goto MENU;
- case 9:
- printList(head);
- cout << endl;
- goto MENU;
- case 10:
- printReverseList(tail);
- cout << endl;
- goto MENU;
- case 0:
- goto EXIT;
- default:
- cout << "Попробуй ещё раз)" << endl;
- goto RETRY;
- }
- }
- EXIT:
- return;
- }
- int main()
- {
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- menu();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement