Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // https://youtu.be/_QLHxI_1yTg
- #include <iostream>
- using namespace std;
- class Node
- {
- int field;
- class Node *ptr;
- friend class List;
- };
- class List
- {
- Node *head;
- int count = 0;
- Node* Prev(Node *); // Переход к предыдущему узлу (не интерфейсный метод)
- public:
- List() { head = NULL; } // Инициализация списка
- int getCount() { return count; } // Получение количества узлов списка
- bool isEmpty() { return head == NULL; } // Проверка, пуст ли список
- int getValue(Node* p) { return p->field; } // Получение значения узла списка
- void setValue(Node *p, int val) { p->field = val; } // Установка значения узла списка
- Node* getFirst() { return head; } // Получение корневого узла списка
- Node* getLast(); // Получение последнего узла списка
- void Clear(); // Очистка списка
- Node* Next(Node *); // Переход к следующему узлу
- Node* Add(int, Node*); // Добавление узла списка
- Node* Delete(Node*); // Удаление узла списка
- void Print(); // Вывод значений узлов списка
- void Swap(Node*, Node*); // Взаимообмен двух узлов
- Node* Nomer_s_kontsa_del(); // удален середина по номеру
- Node* Zamena(); // замена
- Node* Zamena_ptr(); // замена по указателю
- Node* Dobav_n_last(); // добавить в конец
- Node* Dobav_pre_last(); // добавить перед конец
- Node* Dobav_head(); // добавить перед конец
- Node* Dobav_head_next(); // добавить перед конец
- Node* head_del(); // udalit golovu
- Node* head_next_del(); // udalit 2 s golovu
- Node* Delete_end(); // удаляет конец
- Node* Delete_prev_end(); // удален предпоследний
- Node* By_value_del(); // udalit po znacheniu
- };
- Node* List::Add(int num, Node* node = NULL)
- {
- Node *elem = new Node();
- elem->field = num;
- count++;
- if (node == NULL) // Добавление нового корня
- {
- if (head == NULL) {
- elem->ptr = NULL;
- head = elem;
- }
- else {
- elem->ptr = head;
- head = elem;
- }
- return elem;
- }
- elem->ptr = node->ptr; // Добавление узла после текущего
- node->ptr = elem;
- return elem;
- }
- Node* List::Delete(Node* node)
- {
- if (node == NULL) { return NULL; } // В списке нет узлов
- count--;
- if (node == head) // Удаление корневого узла
- {
- head = node->ptr;
- delete node;
- return head;
- }
- Node* prev = Prev(node); // Удаление промежуточного узла
- prev->ptr = node->ptr;
- delete node;
- return prev;
- }
- ////////////////
- Node* List::Delete_end()
- {
- Node *temp = NULL;
- Node *head2 = head;
- if (head2 == NULL) { return NULL; } // В списке нет узлов
- count--;
- while (head2->ptr != NULL) { // перемотка на последние указатели
- temp = head2;
- head2 = head2->ptr;
- }
- if (temp) {
- //<udalenie poslednego>
- temp->ptr = NULL;
- delete head2;
- //< /udalenie poslednego>
- }
- cout << temp->field <<" - " << temp << " - " << temp->ptr << endl;
- }
- ////////////////
- ////////////////
- Node* List::Dobav_head()
- {
- Node *temp = NULL;
- Node *head2 = head;
- //<opation>
- Node *elem2 = new Node();
- elem2->field = 88;
- elem2->ptr = head2;
- head = elem2;
- //</opation>
- if (head2 == NULL) { return NULL; } // В списке нет узлов
- count++;
- }
- ////////////////
- ////////////////
- Node* List::Dobav_head_next()
- {
- Node *t1 = NULL;
- Node *t2 = head;
- t1 = head;
- t2 = t2->ptr;
- //<operation>
- Node *elem2 = new Node();
- elem2->field = 88;
- t1->ptr = elem2;
- elem2->ptr = t2;
- //<operation>
- if (t2 == NULL) { return NULL; } // В списке нет узлов
- count++;
- }
- ////////////////
- ////////////////
- Node* List::Dobav_n_last()
- {
- Node *temp = NULL;
- Node *head2 = head;
- if (head2 == NULL) { return NULL; } // В списке нет узлов
- count++;
- while (head2->ptr != NULL) {
- temp = head2;
- head2 = head2->ptr;
- }
- // <operation>
- Node *elem2 = new Node();
- elem2->field = 88;
- elem2->ptr = NULL;
- head2->ptr = elem2;
- // </operation>
- cout << head2->field << " test " << head2 << " test " << endl;
- cout << head2->ptr->field << " test " << head2->ptr << " test " << endl;
- }
- ////////////////
- /////////////////
- Node* List::Dobav_pre_last()
- {
- Node *temp = NULL;
- Node *t = head;
- Node *head2 = head;
- if (head2 == NULL) { return NULL; } // В списке нет узлов
- count--;
- while (head2->ptr != NULL) {
- head2 = head2->ptr;
- t = t->ptr;
- if (t->ptr->ptr == NULL) {
- temp = t->ptr;
- cout << t->field << " test2 " << t << " test2 " << endl;
- cout << temp->field << " test2 " << temp->ptr << " test2 " << endl;
- //<operation>
- Node *elem2 = new Node();
- elem2->field = 88;
- t->ptr = elem2;
- elem2->ptr = temp;
- //</operation>
- return NULL;
- }
- }
- }
- ////////////////
- ////////////////
- Node* List::Delete_prev_end()
- {
- count++;
- Node *temp = NULL;
- Node *head2 = head;
- Node *t = head;
- Node *t2 = head;
- Node *t3 = head;
- if (head2 == NULL) { return NULL; } // В списке нет узлов
- if (head2->ptr == NULL) { return NULL; } // В списке нет узлов по условию
- if (head2->ptr->ptr == NULL) { return NULL; } // В списке нет узлов
- count--;
- int j = 0;
- cout << head2->field << " - " << head2 << " - " << endl;
- while (head2->ptr != NULL) {j++;
- head2 = head2->ptr;
- temp = head2;
- t = temp->ptr;
- t3 = t->ptr;
- cout << temp->field << " - " << temp << " - " << endl;
- cout << t->field << " - " << t << " - " << endl;
- cout << t3->field << " - " << t3 << " - " << endl;
- if (head2->ptr->ptr->ptr == NULL) {
- //// <operation>
- temp->ptr = t3; delete t;
- //// </operation>
- cout << temp->field << " Проверка " << temp << " - " << endl;
- cout << temp->ptr->field << " Проверка " << temp->ptr << " - " << endl;
- cout << "temp->ptr->ptr->field" << " Проверка " << temp->ptr->ptr << " - " << endl;
- cout << "t3->ptr->field" << " - " << t3->ptr << " - " << endl;
- return NULL;
- }
- }
- }
- ///////////////////
- ////////////////
- Node* List::Nomer_s_kontsa_del()
- {
- count++;
- Node *temp = NULL;
- Node *head2 = head;
- Node *t = head;
- Node *t2 = head;
- Node *t3 = head;
- Node *t4 = head;
- int nomer_s_kontsa = 4;
- if (head2 == NULL) { return NULL; } // В списке нет узлов
- count--;
- int i = 0;
- int vsego;
- while (t2->ptr != NULL) {
- t2 = t2->ptr;
- i++;
- vsego = i;
- }
- // proverka na sootvetstvie spisku
- if ((vsego+1) <= nomer_s_kontsa) { cout << " Nomer ne sootvetstvuet spisku|" << nomer_s_kontsa << "- этого номера нет " << endl; return NULL; }
- cout << " vsego " << (vsego+1) << " - " << endl;
- int j = 0;
- while (head2->ptr != NULL) {
- if (j == (vsego - nomer_s_kontsa)) {
- temp = head2;
- t = temp ->ptr;
- t3 = t->ptr;
- //// <perenos ukazatelya udalenie>
- temp->ptr = t3; delete t;
- //// </ perenos ukazatelya udalenie>
- cout << j << " Проверка " << temp << " - " << endl;
- head2 = head2->ptr;
- }
- else {
- head2 = head2->ptr;
- }
- j++;
- }
- }
- ///////////////////
- ////////////////
- Node* List::By_value_del()
- {
- Node *temp = NULL;
- Node *head2 = head;
- Node *t = head;
- Node *t2 = head;
- Node *t3 = head;
- Node *t4 = head;
- int value_del = 31;
- if (head2 == NULL) { return NULL; } // В списке нет узлов
- count--;
- int j = 0;
- while (head2->ptr != NULL) {
- temp = head2;
- head2 = head2->ptr;
- if (head2->field == value_del) {
- t = temp->ptr;
- t3 = t->ptr;
- //// <operation>
- temp->ptr = t3; delete t;
- //// </operation>
- cout << j << " Проверка " << temp << " - " << endl;
- break;
- }
- else {
- }
- j++;
- }
- }
- ///////////////////
- ////////////////
- Node* List::head_next_del()
- {
- Node *t1 = NULL;
- Node *head2 = head;
- Node *t2 = head;
- Node *t3 = head;
- t1 = head;
- t2 = t1->ptr;
- t3 = t2->ptr;
- if (head2 == NULL) { return NULL; } // В списке нет узлов
- // <ukazateli dlya operatsii>
- cout << t1->field << " - " << t1 << " - " << endl;
- cout << t2->field << " - " << t2 << " - " << endl;
- cout << t3->field << " - " << t3 << " - " << endl;
- // </ukazateli dlya operatsii>
- // <operation>
- t1->ptr = t3;
- t2->ptr = NULL;
- delete t2;
- // </operation>
- // <proverka>
- cout << head2->field << " - " << head2 << " - " << endl;
- cout << head2->ptr->field << " - " << head2->ptr << " - " << endl;
- cout << head2->ptr->ptr->field << " - " << head2->ptr->ptr << " - " << endl;
- // </proverka>
- }
- ////////////////
- ////////////////
- Node* List::head_del()
- {
- Node *temp = NULL;
- Node *head2 = head;
- Node *t = head;
- if (head2 == NULL) { return NULL; } // В списке нет узлов
- //<operation>
- head = head2->ptr;
- t = NULL;
- delete t;
- //</operation>
- int i = 0;
- while (head2->ptr != NULL) {
- temp = head2;
- head2 = head2->ptr;
- cout << i << " - " << t << " - " << endl;
- cout << i << " - " << temp << " - " << endl;
- cout << i << " - " << head2->ptr << " - " << endl;
- i++;
- }
- }
- ////////////////
- ////////////////
- Node* List::Zamena_ptr()
- {
- Node *temp = NULL;
- Node *head2 = head;
- Node *t = head;
- Node *t2 = head;
- Node *t3 = head;
- Node *t4 = head;
- if (head2 == NULL) { return NULL; } // В списке нет узлов
- int i = 0;
- int n_zameny=5;
- while (head2->ptr != NULL) {
- t2 = head2;
- head2 = head2->ptr;
- if (i == (n_zameny-2)) {
- temp = head2;
- cout << " Замена " << n_zameny << endl;
- head2 = head2->ptr;
- t3 = temp->ptr;
- // <vivod nuzhnih peremennih>
- cout << t->field << " - " << t << " - " << endl;
- cout << t2->field << " - " << t2 << " - " << endl;
- cout << temp->field << " - " << temp << " - " << endl;
- cout << t3->field << " - " << t3 << " - " << endl;
- // </vivod nuzhnih peremennih>
- // </ podstanovka>
- t4 = t4->ptr;
- t2->ptr = t; t->ptr = t3;
- head = temp;
- temp->ptr = t4;
- // < podstanovka>
- // < proverka>
- cout << head->field << " 1 " << head << " - " << endl;
- cout << t2->field << " n " << t2 << " - " << endl;
- cout << t2->ptr->field << " n+1 " << t2->ptr << " - " << endl;
- cout << t3->field << " n+2 " << t3 << " - " << endl;
- // < proverka>
- }
- i++;
- }
- }
- ///////////////////
- ////////////////
- Node* List::Zamena()
- {
- Node *temp = NULL;
- Node *head2 = head;
- Node *t = head;
- if (head2 == NULL) { return NULL; } // В списке нет узлов
- int i = 0;
- int n_zameny;
- cout << " Введи номер замены " << endl;
- cin >> n_zameny;
- while (head2->ptr != NULL) {
- if (i == (n_zameny-1)) {
- temp = head2;
- cout << " Замена " << n_zameny << endl;
- }
- head2 = head2->ptr;
- cout << i << " - " << t << " - " << endl;
- cout << i << " - " << temp << " - " << endl;
- cout << i << " - " << head2->ptr << " - " << endl;
- i++;
- }
- if (temp) {
- int zamen1;
- zamen1 = temp->field;
- temp->field = t->field; // вставляем значение первого в выбранный
- t->field = zamen1; // вставляем в первый значение выбранного
- }
- }
- ///////////////////
- void List::Print()
- {
- if (isEmpty()) { cout << "Список пуст" << endl; return; }
- Node *p = head;
- do {
- cout << getValue(p) << " ";
- p = Next(p);
- } while (p != NULL);
- cout << endl;
- }
- void List::Clear()
- {
- class Node *p = head;
- if (p == NULL) return;
- do {
- Node *d = p;
- p = Next(p);
- delete d;
- } while (p != NULL);
- count = 0;
- head = NULL;
- }
- Node* List::getLast()
- {
- Node* p = head;
- while (Next(p) != NULL)
- p = Next(p);
- return p;
- }
- Node* List::Next(Node* node)
- {
- if (isEmpty()) return NULL;
- return node->ptr;
- }
- Node* List::Prev(Node* node)
- {
- if (isEmpty()) return NULL;
- if (node == head) return NULL;
- Node *p = head;
- while (p->ptr != node)
- p = p->ptr;
- return p;
- }
- void List::Swap(Node* node1, Node* node2)
- {
- if (node1 == NULL || node2 == NULL) return;
- if (node1 == node2) return;
- if (node2->ptr == node1)
- {
- Node *p = node1;
- node1 = node2;
- node2 = p;
- }
- Node *prev1 = Prev(node1);
- Node *prev2 = Prev(node2);
- Node *next1 = Next(node1);
- Node *next2 = Next(node2);
- if (next1 == node2)
- {
- if (prev1 != NULL)
- prev1->ptr = node2;
- else
- head = node2;
- node2->ptr = node1;
- node1->ptr = next2;
- return;
- }
- if (prev1 != NULL)
- prev1->ptr = node2;
- else
- head = node2;
- if (prev2 != NULL)
- prev2->ptr = node1;
- else
- head = node1;
- node2->ptr = next1;
- node1->ptr = next2;
- }
- int main()
- {
- system("chcp 1251");
- system("cls");
- List list;
- list.Print();
- Node *s = list.getLast();
- for (int i = 0; i < 10; i++) {
- int z;
- cout << ">> ";
- cin >> z;
- s = list.Add(z, s);
- }
- //list.Delete_end();
- list.Nomer_s_kontsa_del();
- //list.By_value_del();
- //list.Delete_prev_end();
- //list.head_del();
- //list.Zamena();
- //list.Zamena_ptr();
- //list.head_next_del();
- //list.Dobav_n_last();
- //list.Dobav_pre_last();
- //list.Dobav_head();
- //list.Dobav_head_next();
- cout << "***********************" << endl;
- list.Print();
- cout << "Последний элемент: " << list.getValue(list.getLast()) << endl;
- // Удаляем элементы, равные 0
- Node *p = list.getFirst();
- do {
- if (list.getValue(p) == 0)
- p = list.Delete(p);
- else
- p = list.Next(p);
- } while (p != NULL);
- list.Print();
- cout << "В списке " << list.getCount() << " элементов" << endl;
- list.Swap(list.getFirst(), list.getLast());
- list.Print();
- list.Clear();
- list.Print();
- cout << "В списке " << list.getCount() << " элементов" << endl;
- cin.get(); cin.get();
- return 0;
- }
Add Comment
Please, Sign In to add comment