Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- https://youtu.be/aBidgQ0xZSk
- #include <iostream>
- #include <string>
- using namespace std;
- class Node
- {
- string FirstName;
- //string LastName;
- //string MiddleName;
- 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; } // Проверка, пуст ли список
- string getValue(Node* p) { return p->FirstName; } // Получение значения узла списка
- //string getValue2(Node* p) { return p->LastName; } // Получение значения 2го узла списка
- //string getValue3(Node* p) { return p->MiddleName; } // Получение значения 2го узла списка
- void setValue(Node *p, int val) { p->FirstName = val; } // Установка значения узла списка
- Node* getFirst() { return head; } // Получение корневого узла списка
- Node* getLast(); // Получение последнего узла списка
- void Clear(); // Очистка списка
- Node* Next(Node *); // Переход к следующему узлу
- Node* Add(string, /*string, string,*/ Node*); // Добавление узла списка
- Node* Delete(Node*); // Удаление узла списка
- void Print(); // Вывод значений узлов списка
- void Swap(Node*, Node*); // Взаимообмен двух узлов
- Node* Nomer_s_kontsa_del(); // удален середина по номеру
- Node* Zamena(); // замена
- Node* Zamena_ptr(); // замена по указателю
- Node* HeadToEnd(); // замена местами по указателю первый назад последний вперед
- Node* FILO(); // первый назад
- Node* LIFO(); // последний вперед
- void StekOperation(); // DZ po AIP
- Node* Dobav_n_last(string); // добавить в конец
- Node* Dobav_pre_last(); // добавить перед конец
- Node* Dobav_head(string); // добавить перед конец
- 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(string num,// string num2, string num3,
- Node* node = NULL)
- {
- Node *elem = new Node();
- elem->FirstName = num;
- //elem->LastName = num2;
- //->MiddleName = num3;
- 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->FirstName <<" - " << temp << " - " << temp->ptr << endl;
- }
- ////////////////
- ////////////////
- Node* List::Dobav_head(string value = "ADD-TEST")
- {
- Node *temp = NULL;
- Node *head2 = head;
- //Node *uzel = head;
- //cout << "add to head: ";
- cin >> value;
- //<opation>
- Node *elem2 = new Node();
- elem2->FirstName = value;
- 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->FirstName = "88";
- t1->ptr = elem2;
- elem2->ptr = t2;
- //<operation>
- if (t2 == NULL) { return NULL; } // В списке нет узлов
- count++;
- }
- ////////////////
- ////////////////
- Node* List::Dobav_n_last(string value = "88")
- {
- 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->FirstName = value;
- elem2->ptr = NULL;
- head2->ptr = elem2;
- // </operation>
- cout << head2->FirstName << " test " << head2 << " test " << endl;
- cout << head2->ptr->FirstName << " 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->FirstName << " test2 " << t << " test2 " << endl;
- cout << temp->FirstName << " test2 " << temp->ptr << " test2 " << endl;
- //<operation>
- Node *elem2 = new Node();
- elem2->FirstName = 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->FirstName << " - " << head2 << " - " << endl;
- while (head2->ptr != NULL) {j++;
- head2 = head2->ptr;
- temp = head2;
- t = temp->ptr;
- t3 = t->ptr;
- cout << temp->FirstName << " - " << temp << " - " << endl;
- cout << t->FirstName << " - " << t << " - " << endl;
- cout << t3->FirstName << " - " << t3 << " - " << endl;
- if (head2->ptr->ptr->ptr == NULL) {
- //// <operation>
- temp->ptr = t3; delete t;
- //// </operation>
- cout << temp->FirstName << " Проверка " << temp << " - " << endl;
- cout << temp->ptr->FirstName << " Проверка " << temp->ptr << " - " << endl;
- cout << "temp->ptr->ptr->FirstName" << " Проверка " << temp->ptr->ptr << " - " << endl;
- cout << "t3->ptr->FirstName" << " - " << 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;
- string value_del = "31";
- if (head2 == NULL) { return NULL; } // В списке нет узлов
- count--;
- int j = 0;
- while (head2->ptr != NULL) {
- temp = head2;
- head2 = head2->ptr;
- if (head2->FirstName == 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->FirstName << " - " << t1 << " - " << endl;
- cout << t2->FirstName << " - " << t2 << " - " << endl;
- cout << t3->FirstName << " - " << t3 << " - " << endl;
- // </ukazateli dlya operatsii>
- // <operation>
- t1->ptr = t3;
- t2->ptr = NULL;
- delete t2;
- // </operation>
- // <proverka>
- cout << head2->FirstName << " - " << head2 << " - " << endl;
- cout << head2->ptr->FirstName << " - " << head2->ptr << " - " << endl;
- cout << head2->ptr->ptr->FirstName << " - " << 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 " << t << " 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->FirstName << " - " << t << " - " << endl;
- cout << t2->FirstName << " - " << t2 << " - " << endl;
- cout << temp->FirstName << " - " << temp << " - " << endl;
- cout << t3->FirstName << " - " << t3 << " - " << endl;
- // </vivod nuzhnih peremennih>
- // </ podstanovka>
- t4 = t4->ptr;
- t2->ptr = t; t->ptr = t3;
- head = temp;
- temp->ptr = t4;
- // < podstanovka>
- // < proverka>
- cout << head->FirstName << " 1 " << head << " - " << endl;
- cout << t2->FirstName << " n " << t2 << " - " << endl;
- cout << t2->ptr->FirstName << " n+1 " << t2->ptr << " - " << endl;
- cout << t3->FirstName << " n+2 " << t3 << " - " << endl;
- // < proverka>
- }
- i++;
- }
- }
- ///////////////////
- ////////////////
- Node* List::HeadToEnd()
- {
- 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 = 10;
- while (head2->ptr != NULL) {
- head2 = head2->ptr;
- t2 = head2;
- if (t2->ptr->ptr->ptr == NULL) {
- t2 = head2;
- temp = t2->ptr;
- cout << " Замена " << n_zameny << endl;
- //head2 = head2->ptr;
- t3 = temp->ptr;
- // <vivod nuzhnih peremennih>
- cout << t->FirstName << " - " << t << " - " << endl;
- cout << t2->FirstName << " - " << t2 << " - " << endl;
- cout << temp->FirstName << " - " << temp << " - " << endl;
- cout << t3->FirstName << " - " << t3 << " - " << endl;
- // </vivod nuzhnih peremennih>
- // </ podstanovka>
- t4 = t4->ptr;
- head = t3;
- t3->ptr = t4;
- temp->ptr = t; t->ptr = NULL;
- // < podstanovka>
- return NULL;
- }
- i++;
- }
- }
- ///////////////////
- ////////////////
- Node* List::LIFO()
- {
- Node *temp = NULL;
- Node *head2 = head;
- Node *t = head;
- Node *tt = head;
- Node *t2 = head;
- Node *t3 = head;
- Node *t4 = head;
- if (head2 == NULL) { return NULL; } // В списке нет узлов
- int i = 0;
- int n_zameny = 10;
- while (head2->ptr != NULL) {
- t2 = head2;
- t4 = t2->ptr;
- if (t2->ptr->ptr == NULL) {
- // <vivod nuzhnih peremennih>
- cout << t2->FirstName << " -- " << t2 << " - " << endl;
- cout << t4->FirstName << " -- " << t4 << " - " << endl;
- // </vivod nuzhnih peremennih>
- // </ podstanovka>
- head = t4;
- t4->ptr = t3;
- t2->ptr = NULL;
- // < podstanovka>
- return NULL;
- }
- head2 = head2->ptr; t2 = t2->ptr;
- i++;
- }
- }
- ///////////////////
- ////////////////
- Node* List::FILO()
- {
- Node *temp = NULL;
- Node *head2 = head;
- Node *t = head;
- Node *tt = head;
- Node *t2 = head;
- Node *t3 = head;
- Node *t4 = head;
- if (head2 == NULL) { return NULL; } // В списке нет узлов
- int i = 0;
- while (head2->ptr != NULL) {
- head2 = head2->ptr;
- t2 = head2;
- if (t2->ptr == NULL) {
- t2 = head2;
- temp = t2->ptr;
- // <vivod nuzhnih peremennih>
- //cout << t->FirstName << " -- " << t << " - " << endl;
- //cout << t2->FirstName << " -- " << t2 << " - " << endl;
- // </vivod nuzhnih peremennih>
- // </ podstanovka>
- t4 = t4->ptr;
- head = t4;
- t2->ptr = t;
- t->ptr = NULL;
- // < podstanovka>
- return NULL;
- }
- 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) {
- string zamen1;
- zamen1 = temp->FirstName;
- temp->FirstName = t->FirstName; // вставляем значение первого в выбранный
- t->FirstName = zamen1; // вставляем в первый значение выбранного
- }
- }
- ///////////////////
- ////////////////
- void List::StekOperation()
- {
- while (true)
- {
- int day;
- cout << "Operation Dobav_head-1 head_del-2 AddTail-3 DelTail-4 Print-5 Exit-6 \n";
- cin >> day;
- switch (day) {
- case 1:
- cout << "Dobav_head\n"; Dobav_head();
- break;
- case 2:
- cout << "head_del\n"; head_del();
- break;
- case 3:
- cout << "AddTail\n"; Dobav_head(); FILO();
- break;
- case 4:
- cout << "DelTail\n"; LIFO(); head_del();
- break;
- case 5:
- cout << "Print\n"; Print();
- break;
- case 6:
- cout << "Exit\n"; goto tryAgain;
- break;
- }
- }
- tryAgain: // это лейбл
- exit;
- }
- ///////////////////
- void List::Print()
- {
- if (isEmpty()) { cout << "Список пуст" << endl; return; }
- Node *p = head;
- do {
- cout<< "(" <<getValue(p)
- // << " "<< getValue2(p)
- // << " " << getValue3(p)
- << ")\n";
- 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()
- {
- using std::string;
- using std::cin;
- using std::cout;
- using std::getline;
- system("chcp 1251");
- system("cls");
- List list;
- list.Print();
- Node *s = list.getLast();
- for (int i = 0; i < 4; i++) {
- string z;
- //string z2;
- //string z3;
- cout << ">> FirstName ";
- cin >> z;
- //cout << ">> LastName ";
- //cin >> z2;
- //cout << ">> MiddleName ";
- //cin >> z3;
- s = list.Add(z, //z2, z3,
- s);
- }
- //list.Delete_end();
- //list.Nomer_s_kontsa_del();
- //list.By_value_del();
- //list.Delete_prev_end();
- //list.Zamena();
- //list.Zamena_ptr();
- //list.head_next_del();
- //list.Dobav_n_last();
- //list.Dobav_pre_last();
- //list.StekOperation();
- //list.Dobav_head_next();
- //list.HeadToEnd();
- list.FILO();
- //list.LIFO();
- //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;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement