#include #include #include #include using namespace std; class List { public: List(); ~List(); //удаление первого элемента в списке void pop_front(); //добавление элемента в конец списка void push_back(string part_number, string name, int price, int weight); // очистить список void clear(); // получить количество элементов в списке int GetSize() { return Size; } // вывод детали int number(const int index, string str); //добавление элемента в начало списка void push_front(string part_number, string name, int price, int weight); //удаление элемента в списке по указанному индексу void removeAt(int index); //удаление последнего элемента в списке void pop_back(); // Возвращение номера детали или наименования string str(const int index, string str); private: class Node { public: Node* pNext; Node* pPrev; int price = 0, weight = 0; string part_number = "", name = ""; Node(string part_number, string name, int price, int weight, Node* pNext = nullptr, Node* pPrev = nullptr) { this->part_number = part_number; this->name = name; this->price = price; this->weight = weight; this->pNext = pNext; this->pPrev = pPrev; } }; int Size; Node* head; Node* tail; }; List::List() { Size = 0; head = nullptr; tail = nullptr; } List::~List() { clear(); } void List::pop_front() { Node* temp = head; if (head->pNext == nullptr) { delete temp; Size--; } else { head = head->pNext; head->pPrev = temp->pPrev; delete temp; Size--; } } void List::push_back(string part_number, string name, int price, int weight) { if (head == nullptr) { head = new Node(part_number, name, price, weight); tail = head; } else { Node* temp = tail; tail = new Node(part_number, name, price, weight, nullptr, temp); temp->pNext = tail; } Size++; } void List::clear() { while (Size) { pop_back(); } } int List::number(const int index, string str) { int counter = 0; Node* current = this->head; while (current != nullptr) { if (counter == index) { if (str == "price") return current->price; if (str == "weight") return current->weight; } current = current->pNext; counter++; } return 0; } void List::push_front(string part_number, string name, int price, int weight) { if (head == nullptr) { head = new Node(part_number, name, price, weight); tail = head; } else { Node* temp = head; head = new Node(part_number, name, price, weight); head->pNext = temp; temp->pPrev = head; } Size++; } void List::removeAt(int index) { if (index == 0) { pop_front(); } else { if (index == Size - 1) { pop_back(); } else { if (index + 1 <= Size / 2) { Node* previous = this->head; for (int i = 0; i < index - 1; i++) { previous = previous->pNext; } Node* toDelete = previous->pNext; previous->pNext = toDelete->pNext; previous = toDelete->pNext; previous->pPrev = toDelete->pPrev; delete toDelete; } else { Node* next = this->tail; for (int i = Size - 1; i > index - 1; i--) { next = next->pPrev; } Node* toDelete = next->pNext; next->pNext = toDelete->pNext; next = toDelete->pNext; next->pPrev = toDelete->pPrev; delete toDelete; } Size--; } } } void List::pop_back() { Node* temp = tail; if (tail->pPrev == nullptr) { delete temp; Size--; } else { tail = tail->pPrev; tail->pNext = temp->pNext; delete temp; Size--; } } string List::str(const int index, string str) { int counter = 0; Node* current = this->head; while (current != nullptr) { if (counter == index) { if (str == "name") return current->name; if (str == "part_number") return current->part_number; } current = current->pNext; counter++; } return str; } int namesakes(List* lst, int size) { int i = 0, j = i + 1; while (i < size - 1) { while (j < size) { if (lst->str(i, "part_number") == lst->str(j, "part_number")) { lst->removeAt(j); j--; size--; } j++; } i++; j = i + 1; } return size; } bool flag(List* lst, int size) { string str1 = "", str2 = ""; for (int i = 0; i < size - 1; i++) { str1 = lst->str(i, "part_number"); str2 = lst->str(i + 1, "part_number"); for (unsigned short int k = 0; k < str1.length(); k++) if (str1[k] > str2[k]) return false; else break; } return true; } bool revers_flag(List* lst, int size) { string str1 = "", str2 = ""; for (int i = 0; i < size - 1; i++) { str1 = lst->str(i, "part_number"); str2 = lst->str(i + 1, "part_number"); for (unsigned short int k = 0; k < str1.length(); k++) if (str1[k] < str2[k]) return false; else break; } return true; } int counter(List* lst, int size) { int count = 0; cout << "Элементы списка, шифры деталей, в которых встречаются в списке только 1 раз:" << endl; size = lst->GetSize(); for (int i = 0; i < size; i++) { bool flag = true; for (int j = 0; j < size; j++) { if (i == j) j++; else if (lst->str(i, "part_number") == lst->str(j, "part_number")) { flag = false; break; } } if (flag) { count++; cout << lst->str(i, "part_number") << endl; } } cout << "Кол-во элементов = "; return count; } int multi_sum(List* lst, int size) { int sum = 0, max = lst->number(0, "price"), min = max; string name_max = lst->str(0, "name") + ' ', name_min = name_max; for (int i = 0; i < size; i++) { sum += lst->number(i, "price"); if (max < lst->number(i, "price")) { max = lst->number(i, "price"); name_max = lst->str(i, "name") + ' '; } if (min > lst->number(i, "price")) { min = lst->number(i, "price"); name_min = lst->str(i, "name") + ' '; } } cout << "Максимальный элемент: " << name_max << max << endl; cout << "Минимальный элемент: " << name_min << min << endl; cout << "Сумма = "; return sum; } void start(List* lst) { lst->push_front("2313", "gtu", 390, 101); lst->push_front("1231", "ghy", 912, 900); lst->push_front("8132", "hut", 832, 799); } void add(List* lst) { string part_number = "", name = "", str = ""; int price = 0, weight = 0; ifstream text; bool flag = true; while (flag) { cout << "Шифр детали: "; cin >> part_number; cout << "Название детали: "; cin >> name; cout << "Цена детали: "; cin >> price; cout << "Вес детали: "; cin >> weight; lst->push_front(part_number, name, price, weight); cout << "Желаете ещё добавить элементы? " << endl; tryAgain: cin >> str; if (str == "Да" or str == "да" or str == "ДА" or str == "lf" or str == "Lf" or str == "LF") flag = true; else if (str == "Нет" or str == "нет" or str == "НЕТ" or str == "Ytn" or str == "YTN" or str == "ytn") flag = false; else { cout << "Введите \"Да\" или \"Нет\" " << endl; goto tryAgain; } } } int remove(List* lst, int size) { int i = 0; string str = "", name = ""; bool flag = true; while (flag) { cout << "Введите наименование, по которому сделать удаление: "; cin >> name; i = 0; while (i < size) { if (name == lst->str(i, "name")) { lst->removeAt(i); size--; i--; } i++; } cout << "Желаете снова удалить по наименованию? " << endl; tryAgain: cin >> str; if (str == "Да" or str == "да" or str == "ДА" or str == "lf" or str == "Lf" or str == "LF") flag = true; else if (str == "Нет" or str == "нет" or str == "НЕТ" or str == "Ytn" or str == "YTN" or str == "ytn") flag = false; else { cout << "Введите \"Да\" или \"Нет\" " << endl; goto tryAgain; } } return size; } void print(List* lst, int size) { for (int i = 0; i < size; i++) { cout << lst->str(i, "part_number") << setw(15) << right; cout << lst->str(i, "name") << setw(22) << right; cout << lst->number(i, "price") << setw(20) << right; cout << lst->number(i, "weight") << endl; } } int main() { setlocale(LC_ALL, "Russian"); system("chcp 1251 >> null"); List lst; int N = 0; string command = "show"; start(&lst); int size = lst.GetSize(); do { if (command == "show") { cout << "Шифр" << setw(16) << right << "Название" << setw(23) << right << "Цена" << setw(20) << right << "Вес" << endl; print(&lst, size); } else if (command == "del1") { lst.removeAt(size - 3); size--; } else if (command == "del2") { cout << "Введите номер элемента, который хотите удалить(с начала)" << endl; cin >> N; lst.removeAt(N - 1); size--; } else if (command == "del3") { cout << "Введите номер элемента, который хотите удалить(с конца)" << endl; cin >> N; lst.removeAt(size - N); size--; } else if (command == "del4") size = namesakes(&lst, size); else if (command == "check1") { if (flag(&lst, size)) cout << "Верно" << endl; else cout << "Ложно" << endl; } else if (command == "check2") { if (revers_flag(&lst, size)) cout << "Верно" << endl; else cout << "Ложно" << endl; } else if (command == "count") cout << counter(&lst, size) << endl; else if (command == "sum") cout << multi_sum(&lst, size) << endl; else if (command == "del") { size = remove(&lst, size); } else if (command == "add") { add(&lst); size = lst.GetSize(); } cout << "______________________________________________\n\nВведите команду.\nshow - Показать вывод эл-тов.\ndel1 - Удалить элемент, предшествующий 2-му с конца списка элементу.\ndel2 - Удалить элемент с заданным номером К от начала списка.\ndel3 - Удалить элемент с заданным номером от конца списка.\ndel4 - Удалить повторяющиеся элементы списка DSP, если в них совпадает шифр и наименование.\ncheck1 - Проверить упорядочены ли элементы списка по возрастанию шифра детали от начала к концу.\ncheck2 - Проверить упорядочены ли элементы списка DSP от конца к началу по возрастанию шифра детали.\ncount - Подсчитать количество элементов списка, шифры деталей, в которых встречаются в списке только 1 раз, и вывести их на печать.\nsum - Найти сумму расценок по всем деталям, наибольшую и наименьшую расценки и соответ-ствующие наименования деталей.\ndel - Удаление по наименованию\nadd - Добавление в начало\nexit - Выход."; cout << "\n______________________________________________\n" << endl; cin >> command; } while (command != "exit"); return 0; }