alexx876

Untitled

Jun 25th, 2019
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.78 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <locale.h>
  4. #include <Windows.h>
  5.  
  6. using namespace std;
  7.  
  8. struct elm {
  9.     int vl;
  10.     elm *pr;
  11.     elm *nx;
  12. };
  13.  
  14. struct list {
  15.     elm *start, *end, *ptr;
  16. };
  17. void moveptr(list *L) {
  18.     if (L->ptr == L->end)  return;
  19.     L->ptr = L->ptr->nx;
  20. }
  21. void addelement(list *L, int vl) {
  22.     if (L->ptr == L->end) {
  23.         return;
  24.     }
  25.     elm *temp = (elm *)malloc(sizeof(elm));
  26.     if (!temp) return;
  27.     temp->vl = vl;
  28.     temp->nx = L->ptr->nx;
  29.     temp->pr = L->ptr;
  30.     L->ptr->nx->pr = temp; // for next
  31.     L->ptr->nx = temp;
  32. }
  33. void initl(list *L) {
  34.     L->start = (elm *)malloc(sizeof(elm)); // Create first
  35.     if (!L->start) return;
  36.     L->end = (elm *)malloc(sizeof(elm)); // CReate last
  37.     if (!L->end) {
  38.         free((void *)L->start);
  39.         L->start = NULL;
  40.         return;
  41.     }
  42.     L->start->nx = L->end; // next to first
  43.     L->start->pr = NULL; // back for fr
  44.     L->end->nx = NULL;
  45.     L->end->pr = L->start;
  46.     L->ptr = L->start;
  47. }
  48. void remove_element(list *L) {
  49.     elm *pntr = L->ptr;
  50.     pntr->nx->pr = pntr->pr;
  51.     pntr->pr->nx = pntr->nx;
  52.     L->ptr = L->start;
  53.     free((void *)pntr);
  54. }
  55. void print(list *L) {
  56.     // дополнительный элемент для прохода от начала до конца списка
  57.     elm *tmp;
  58.     tmp = L->start->nx; // ссылка на первый элемент
  59.                               // пока не конец списка
  60.     while (tmp != L->end) {
  61.         cout << tmp->vl << " "; // печать текущего элемента
  62.         tmp = tmp->nx; // переход на следующий элемент
  63.     }
  64.     cout << endl;
  65. }
  66. int main() {
  67.     setlocale(LC_ALL, "rus");
  68.  
  69.     list *L = (list *)malloc(0);
  70.     initl(L); // Create new list
  71.  
  72.     int exit = 1, m, vl, num, cc = 0;
  73.  
  74.     while (exit != 0) {
  75.         system("cls");
  76.         cout << "1.Добавить элемент в начало\n2.Добавить элемент после элемента\n3.Удалить элемент\n4.Вывод списка элементов\n5.Очистить и закрыть\n\n";
  77.         cin >> m;
  78.         switch (m) {
  79.             case 1:
  80.                 system("cls");
  81.                 L->ptr = L->start;
  82.                 cout << "Enter value: ";
  83.                 cin >> vl;
  84.                 addelement(L, vl);
  85.                 cc++;
  86.                 break;
  87.             case 2:
  88.                 system("cls");
  89.                 if (cc == 0) break;
  90.                 do {
  91.                     cout << "Номер элемента после которого добавить: ";
  92.                     cin >> num;
  93.                 } while (num < 1 || num > cc);
  94.                 for (int i = 0; i < num; i++) moveptr(L);
  95.                 cout << "Enter value: ";
  96.                 cin >> vl;
  97.                 addelement(L, vl);
  98.                 cc++;
  99.                 break;
  100.             case 3:
  101.                system("cls");
  102.                 do {
  103.                     cout << "Номер элемента для удаления: ";
  104.                     cin >> num;
  105.                 } while (num > cc);
  106.                 for (int i = 0; i < num; i++) moveptr(L);
  107.                 remove_element(L);
  108.                 cc--;
  109.                 break;
  110.             case 4:
  111.                 system("cls");
  112.                 print(L);
  113.                 cout << "Exit? (1)";
  114.                 cin >> vl;
  115.                 break;
  116.             case 5:
  117.                 elm *tt;
  118.                 L->ptr = L->end;
  119.                 while (L->ptr != NULL) {
  120.                     tt = L->ptr->pr;
  121.                     free(L->ptr);
  122.                     L->ptr = tt;
  123.                 }
  124.                 exit = 0;
  125.                 break;
  126.         }
  127.     }
  128.     return 0;
  129. }
Add Comment
Please, Sign In to add comment