ivorakitin

Double linked list

Apr 15th, 2025 (edited)
776
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.74 KB | None | 0 0
  1. #include<iostream>
  2. using namespace std;
  3. void init();
  4. void add_b(int n);
  5. void add_mid1(int n, int k);
  6. void add_mid2(int n, int k);
  7. void add_e(int n);
  8. int del_b(int &n);
  9. int del_n(int n);
  10. int del_e(int &n);
  11. void invert();
  12. void list();
  13. struct elem
  14. {
  15.     int key;
  16.     elem *prev;
  17.     elem *next;
  18. }*start;
  19. int main()
  20. {
  21.     int num, k, ch;
  22.     init();
  23.     do {
  24.         cout << "\n Menu \n";
  25.         cout << "1. Add the first element\n";
  26.         cout << "2. Add element before k\n";
  27.         cout << "3. Add element after k\n";
  28.         cout << "4. Add the last element\n";
  29.         cout << "5. Del the first element\n";
  30.         cout << "6. Del the element with value num\n";
  31.         cout << "7. Del the last element\n";
  32.         cout << "8. Invert element\n";
  33.         cout << "9. Show the list\n";
  34.         cout << "0. Exit";
  35.         cout << "Your choice:";
  36.         cin >> ch;
  37.         switch (ch)
  38.         {
  39.         case 1:
  40.             cout << "num=";
  41.             cin >> num;
  42.             add_b(num);
  43.             break;
  44.         case 2:
  45.             cout << "num=";
  46.             cin >> num;
  47.             cout << "k=";
  48.             cin >> k;
  49.             add_mid1(num, k); break;
  50.         case 3:
  51.             cout << "num=";
  52.             cin >> num;
  53.             cout << "k=";
  54.             cin >> k;
  55.             add_mid2(num, k); break;
  56.         case 4:
  57.             cout << "num=";
  58.             cin >> num;
  59.             add_e(num);
  60.             break;
  61.         case 5:
  62.             if(del_b(num))
  63.                 list();
  64.             break;
  65.         case 6:
  66.             cout << "num=";
  67.             cin >> num;
  68.             if (del_n(num))
  69.                 list();
  70.             break;
  71.         case 7:
  72.             if (del_e(num))
  73.                 list();
  74.             break;
  75.         case 8:
  76.             invert();
  77.             list();
  78.             break;
  79.         case 9:
  80.             list();
  81.             break;
  82.         }
  83.     } while (ch != 0);
  84.     system("pause");
  85.     return 0;
  86.  
  87. }
  88.  
  89. void init()
  90. {
  91.     start = NULL;
  92. }
  93.    
  94. void add_b(int n)
  95. {   elem *p = start;
  96.     start = new elem;
  97.     start->key = n;
  98.     start->next = p;
  99.     start->prev = NULL;
  100.     if (p)
  101.         p->prev = start;
  102. }
  103.  
  104. void add_mid1(int n, int k)
  105. {   elem *q=NULL, *p = start;
  106.     while (p->key != k)
  107.         p = p->next;
  108.     q = new elem;
  109.     q->next = p->next;
  110.     q->key = p->key;
  111.     q->prev = p;
  112.     if(p)
  113.         p->next = q;
  114.     p->key = n;
  115.     q->next->prev=q;
  116. }
  117.  
  118. void add_mid2(int n, int k)
  119. {
  120.     elem *q;
  121.     elem *p = start;
  122.     while (p->key != k)
  123.         p = p->next;
  124.     q = new elem;  
  125.     q->key = n;
  126.     q->next = p->next; 
  127.     p->next = q;
  128.     q->prev = p;
  129.        q->next->prev=q;
  130. }
  131.  
  132. void add_e(int n)
  133. {
  134.     elem *p = start, *q;
  135.     q = new elem;      
  136.     q->key = n;
  137.     q->next = NULL;
  138.     if (start)     
  139.     {
  140.         while (p->next)
  141.             p = p->next;
  142.         p->next = q;
  143.     }
  144.     else
  145.         start = q;     
  146.     q->prev = p;
  147. }
  148.  
  149. int del_b(int &n)  
  150. {              
  151.     elem *p = start;
  152.     if (start) 
  153.     {
  154.         n = start->key;
  155.         if (start->next)
  156.         {
  157.             start = start->next;   
  158.             start->prev = NULL;
  159.         }
  160.         else
  161.             start = NULL;
  162.         delete p;  
  163.         return 1;
  164.     }
  165.     else
  166.         return 0;
  167. }
  168.  
  169. int del_n(int n)
  170. {   elem *q=NULL, *p = start;
  171.     if (start)
  172.     {
  173.         while ((p->key != n) && (p->next != NULL))
  174.             p = p->next;
  175.         if (p->key == n)
  176.         {
  177.             if (p->prev)
  178.             {
  179.                 p->prev->next = p->next;
  180.                 if (p->next)
  181.                     p->next->prev = p->prev;
  182.             }
  183.             else
  184.             {
  185.                 if (p->next)
  186.                 {
  187.                     p->next->prev = NULL;
  188.                     start = p->next;
  189.                 }
  190.                 else
  191.                     start = NULL;
  192.             }
  193.             delete p;
  194.             return 1;
  195.         }
  196.         else
  197.             return 0;          
  198.     }
  199.     else
  200.         return 0;
  201. }
  202.  
  203. int del_e(int &n)
  204. {
  205.     elem *p = start;
  206.     if (start)
  207.     {
  208.         while (p->next)
  209.             p = p->next;
  210.         n = p->key;
  211.         if (p->prev)   
  212.             p->prev->next = NULL;
  213.         else
  214.             start = NULL;
  215.         delete p;  
  216.         return 1;
  217.     }
  218.     else
  219.         return 0;
  220. }
  221.  
  222. void invert()
  223. {
  224.     elem *p = start, *q = NULL;
  225.     while (p)
  226.     {
  227.         q = p->next;
  228.         p->next = p->prev;
  229.         p->prev = q;
  230.         if (q == NULL)
  231.             start = p;
  232.         p = q;
  233.     }
  234. }
  235.  
  236. void list()
  237. {   elem *p = start;
  238.     if (start)
  239.         while (p)
  240.         {   cout << p->key << "\t";
  241.             p = p->next;
  242.         }
  243.     cout << "\n\n";
  244. }
  245.  
  246. void printBack()
  247. {
  248.     elem *p = start;
  249.     cout << "Print back\n";
  250.     while (p->next)
  251.     {
  252.         p = p->next;
  253.     }
  254.    
  255.     while (p)
  256.     {
  257.         cout << p->key << endl;
  258.         p = p->prev;
  259.     }
  260. }
  261.  
  262.  
Tags: dlink
Advertisement
Add Comment
Please, Sign In to add comment