Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <conio.h>
- #include <Windows.h>
- using namespace std;
- struct Node
- {
- int Value;
- Node* pNext;
- Node* pPrev;
- };
- Node* head;//заглавное звено (голова)
- Node* tail;//конечное звено (хвост)
- void Initial();
- Node* SearchForward(int);
- Node* SearchBack(int);
- void AddAfter(int);
- void AddBefore(int);
- void DeleteNode(int);
- void DeleteList();
- void OutputForward();
- void OutputBack();
- int main()
- {
- int q;
- do
- {
- SetConsoleOutputCP(1251);
- SetConsoleCP(1251);
- 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 << "0. Выход" << endl;
- cin >> q;
- if (q == 1)
- {
- Initial();
- }
- else if (q == 2)
- {
- int num;
- cout << "Введите искомое значение:" << endl;
- cin >> num;
- cout << SearchForward(num) << endl;
- }
- else if (q == 3)
- {
- int num;
- cout << "Введите искомое значение:" << endl;
- cin >> num;
- cout << SearchBack(num) << endl;
- }
- else if (q == 4)
- {
- int num;
- cout << "Введите искомое значение:" << endl;
- cin >> num;
- AddBefore(num);
- }
- else if (q == 5)
- {
- int num;
- cout << "Введите искомое значение:" << endl;
- cin >> num;
- AddAfter(num);
- }
- else if (q == 6)
- {
- int num;
- cout << "Введите искомое значение:" << endl;
- cin >> num;
- DeleteNode(num);
- }
- else if (q == 7)
- {
- cout << "Удаление списка..." << endl;
- DeleteList();
- }
- else if (q == 8)
- OutputForward();
- else if (q == 9)
- OutputBack();
- } while (q != 0);
- }
- void Initial()
- {
- head = new Node;
- head->Value = 0;//head выполняет роль счётчика элементов
- head->pNext = nullptr;
- head->pPrev = nullptr;
- Node* tmp = head;//tmp - "рабочий" указатель
- int elem;
- cout << "Введите элементы списка:" << endl;
- cin >> elem;
- while (elem != 0)
- {
- tmp->pNext = new Node;
- tmp->pNext->pPrev = tmp;
- tmp = tmp->pNext;
- tmp->pNext = nullptr;
- tmp->Value = elem;
- head->Value++;
- cin >> elem;
- }
- tail = tmp;
- }
- Node* SearchForward(int num)//функция выводит адрес элемента с заданным значением
- {
- Node* tmp = head->pNext;
- while (tmp != nullptr)
- {
- if (tmp->Value == num)
- return tmp;
- tmp = tmp->pNext;
- }
- cout << "Такого элемента нет в списке" << endl;
- return nullptr;
- }
- Node* SearchBack(int num)
- {
- Node* tmp = tail;
- while (tmp != head)
- {
- if (tmp->Value == num)
- return tmp;
- tmp = tmp->pPrev;
- }
- cout << "Такого элемента нет в списке" << endl;
- return nullptr;
- }
- void AddAfter(int num)
- {
- Node* elem = SearchForward(num), * tmp = elem, *tmp2 = new Node;
- //tmp - иходное звено списка, tmp2 - звено, которое нужно добавить
- if (tmp != nullptr && tmp->pNext != nullptr)
- {
- cout << "Введите значение для нового элемента:" << endl;
- cin >> tmp2->Value;
- tmp2->pNext = tmp->pNext;//настраиваем указатели нового звена на звенья списка
- tmp2->pPrev = tmp; //есть ли разница между этим <-- и этим --> tmp2->pPrev = tmp->pNext->pPrev;
- tmp->pNext->pPrev = tmp2;//настраиваем указатели звеньев списка на новое звено
- tmp->pNext = tmp2;
- head->Value++;
- }
- else if (tmp != nullptr)//в случае, если нужно добавить звено после последнего звена списка
- {
- cout << "Введите значение для нового элемента:" << endl;
- cin >> tmp2->Value;
- tmp2->pNext = nullptr;
- tmp2->pPrev = tmp;
- tmp->pNext = tmp2;
- head->Value++;
- tail = tmp2;
- }
- }
- void AddBefore(int num)
- {
- Node* elem = SearchForward(num), * tmp = elem, *tmp2 = new Node;
- //tmp - иходное звено списка, tmp2 - звено, которое нужно добавить
- if (tmp != nullptr)
- {
- cout << "Введите значение для нового элемента:" << endl;
- cin >> tmp2->Value;
- tmp2->pNext = tmp;
- tmp2->pPrev = tmp->pPrev;
- tmp->pPrev->pNext = tmp2;
- tmp->pPrev = tmp2;
- head->Value++;
- }
- }
- void DeleteNode(int num)
- {
- Node* elem = SearchForward(num), * tmp = elem;
- if (tmp != nullptr && tmp->pNext == nullptr)
- {
- tmp->pPrev->pNext = nullptr;
- tail = tmp->pPrev;
- delete tmp;
- }
- else if (tmp != nullptr)
- {
- tmp->pPrev->pNext = tmp->pNext;
- tmp->pNext->pPrev = tmp->pPrev;
- delete tmp;
- }
- }
- void DeleteList()
- {
- Node* tmp = tail;
- while (tail != head)
- {
- tail = tail->pPrev;
- delete tmp;
- tmp = tail;
- head->Value--;
- tail->pNext = nullptr;
- }
- }
- void OutputForward()//Вывод списка от его начала
- {
- Node* tmp = head;
- cout << "Вывод списка:" << endl;
- for (tmp; tmp != nullptr; tmp = tmp->pNext)
- cout << tmp->Value << '\t';
- cout << endl;
- }
- void OutputBack()
- {
- Node* tmp = tail;
- cout << "Вывод списка:" << endl;
- cout << head->Value << '\t';
- for (tmp; tmp != head; tmp = tmp->pPrev)
- cout << tmp->Value << '\t';
- cout << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement