Advertisement
ivorakitin

Double Linked List

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