Advertisement
AdamBB

Two directional list

Jan 17th, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.79 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3.  
  4. using namespace std;
  5.  
  6. // Element listy
  7. //--------------
  8. struct dlistEl
  9. {
  10.     dlistEl * next;   // następnik
  11.     dlistEl * prev;   // poprzednik
  12.     int data;
  13. };
  14.  
  15. // Definicja obiektu listy dwukierunkowej
  16. //---------------------------------------
  17. class dlist
  18. {
  19. public:
  20.     dlistEl * head;  // początek listy
  21.     dlistEl * tail;  // koniec listy
  22.     unsigned count;  // licznik elementów
  23.  
  24.     dlist();         // konstruktor
  25.     ~dlist();        // destruktor
  26.     void printl();
  27.     void push_front(int v);
  28.     void push_back(int v);
  29.     void insert_before(dlistEl * e, int v);
  30.     void insert_after(dlistEl * e, int v);
  31.     void remove(dlistEl * e);
  32.     void pop_front();
  33.     void pop_back();
  34. };
  35.  
  36. //------------------------------------
  37. // Metody obiektu listy dwukierunkowej
  38. //------------------------------------
  39.  
  40. // Inicjuje pola zmiennej listy
  41. //-----------------------------
  42. dlist::dlist()
  43. {
  44.     head  = tail  = NULL;
  45.     count = 0;
  46. }
  47.  
  48. // Usuwa listę z pamięci
  49. //----------------------
  50. dlist::~dlist()
  51. {
  52.     while(count) pop_front();
  53. }
  54.  
  55. // Wyświetla zawartość elementów listy
  56. //----------------------------------------------
  57. void dlist::printl()
  58. {
  59.     dlistEl * p;
  60.     cout << endl;
  61.     cout << "--------------------------------------------------" <<endl;
  62.     cout << "---------ZAWARTOŚĆ LISTY DWUKIERUNKOWEJ---------" <<endl;
  63.     cout << "--------------------------------------------------" <<endl;
  64.     cout << "Ilość elementów: " << count << endl;
  65.     p = head;
  66.     for (int i = 1; p ; ++i)
  67.     {
  68.         cout << "Element #"<< i << "  dane = " << p->data << endl;
  69.         p = p->next;
  70.     }
  71.     cout << "--------------------------------------------------" <<endl;
  72. }
  73.  
  74. // Dodaje nowy element na początek listy
  75. //------------------------------------------------
  76. void dlist::push_front(int v)
  77. {
  78.     dlistEl * p;
  79.  
  80.     p = new dlistEl;
  81.     p->data = v;
  82.     p->prev = NULL;
  83.     p->next = head;
  84.     head  = p;
  85.     count++;
  86.     if(p->next) p->next->prev = p;
  87.     else tail = p;
  88. }
  89.  
  90. // Dodaje nowy element na koniec listy
  91. //----------------------------------------------
  92. void dlist::push_back(int v)
  93. {
  94.     dlistEl * p;
  95.  
  96.     p = new dlistEl;
  97.     p->data = v;
  98.     p->next = NULL;
  99.     p->prev = tail;
  100.     tail  = p;
  101.     count++;
  102.     if(p->prev) p->prev->next = p;
  103.     else head = p;
  104. }
  105.  
  106. // Dodaje nowy element przed wybranym
  107. //-----------------------------------
  108. void dlist::insert_before(dlistEl * e, int v)
  109. {
  110.     dlistEl * p;
  111.  
  112.     if(e == head) push_front(v);
  113.     else
  114.     {
  115.         p = new dlistEl;
  116.         p->data = v;
  117.         p->next = e;
  118.         p->prev = e->prev;
  119.         count++;
  120.         e->prev->next = p;
  121.         e->prev = p;
  122.     }
  123. }
  124.  
  125. // Dodaje nowy element za wybranym
  126. //--------------------------------
  127. void dlist::insert_after(dlistEl * e, int v)
  128. {
  129.     dlistEl * p;
  130.  
  131.     if(e == tail) push_back(v);
  132.     else
  133.     {
  134.         p = new dlistEl;
  135.         p->data = v;
  136.         p->next = e->next;
  137.         p->prev = e;
  138.         count++;
  139.         e->next->prev = p;
  140.         e->next = p;
  141.     }
  142. }
  143.  
  144. // Usuwa wybrany element z listy
  145. //------------------------------
  146. void dlist::remove(dlistEl * e)
  147. {
  148.     count--;
  149.     if(e->prev) e->prev->next = e->next;
  150.     else        head = e->next;
  151.     if(e->next) e->next->prev = e->prev;
  152.     else        tail = e->prev;
  153.     delete e;
  154. }
  155.  
  156. // Usuwa element z początku listy
  157. //-------------------------------
  158. void dlist::pop_front()
  159. {
  160.     if(count) remove(head);
  161. }
  162.  
  163. // Usuwa element z końca listy
  164. //----------------------------
  165. void dlist::pop_back()
  166. {
  167.     if(count) remove(tail);
  168. }
  169.  
  170. void menu()
  171. {
  172.     cout << "1. Dodaj element na początek listy" << endl;
  173.     cout << "2. Dodaj element na koniec listy" << endl;
  174.     cout << "3. Dodaj element przed elementem nr..." << endl;
  175.     cout << "4. Dodaj element za elementem nr..." << endl;
  176.     cout << "5. Usuń element z początku listy" << endl;
  177.     cout << "6. Usuń element z końca listy" << endl;
  178.     cout << "7. Usuń element numer..." << endl;
  179.     cout << "8. Wyjdź z programu" << endl;
  180.     cout << endl;
  181. }
  182.  
  183. //---------------
  184. // Program główny
  185. //---------------
  186.  
  187. int main()
  188. {
  189.     dlist L;
  190.     dlistEl * e;
  191.     int i;
  192.     int x;
  193.     int y;
  194.  
  195.     while(true) {
  196.         L.printl();
  197.         menu();
  198.         cout << "Wybór: ";
  199.         cin >> i;
  200.  
  201.         switch (i) {
  202.             case 1:
  203.             if (L.count < 6)
  204.             {
  205.                 cout << "Podaj numer jaki dodać do elementu na początku listy: ";
  206.                 cin >> x;
  207.                 L.push_front(x);
  208.             } else {
  209.                 cout << "Lista jest pełna! Max 6 elementów" << endl;
  210.             }
  211.             break;
  212.             case 2 :
  213.                 if (L.count < 6)
  214.                 {
  215.                     cout << "Podaj numer jaki dodać do elementu na końcu listy: ";
  216.                     cin >> x;
  217.                     L.push_back(x);
  218.                 } else {
  219.                     cout << "Lista jest pełna! Max 6 elementów" << endl;
  220.                 }
  221.                 break;
  222.             case 3 :
  223.                 cout << "Wpisz numer elementu przed którym dodać element: ";
  224.                 cin >> y;
  225.                 cout << "Wpisz wartość dodawanego elementu: ";
  226.                 cin >> x;
  227.                 e = L.head;
  228.                 for (int xx = 1; xx < y; xx++) e = e->next;
  229.                 L.insert_before(e, x);
  230.                 break;
  231.             case 4 :
  232.                 cout << "Wpisz numer elementu za którym dodać element: ";
  233.                 cin >> y;
  234.                 cout << "Wpisz wartość dodawanego elementu: ";
  235.                 cin >> x;
  236.                 e = L.head;
  237.                 for (int xx = 1; xx < y; xx++) e = e->next;
  238.                 L.insert_after(e, x);
  239.                 break;
  240.             case 5 :
  241.                 if (L.count > 0) L.pop_front();
  242.                 else cout << "Lista jest pusta! Brak możliwości usunięcia elementu.";
  243.                 break;
  244.             case 6 :
  245.                 if (L.count > 0) L.pop_back();
  246.                 else cout << "Lista jest pusta! Brak możliwości usunięcia elementu.";
  247.                 break;
  248.             case 7 :
  249.                 if (L.count > 0) {
  250.                     cout << "Wpisz numer elementu za którym chcesz usunąć: ";
  251.                     cin >> y;
  252.                     e = L.head;
  253.                     for (int xx = 1; xx < y; xx++) e = e->next;
  254.                     L.remove(e);
  255.                 } else {
  256.                     cout << "Lista jest pusta! Brak możliwości usunięcia elementu.";
  257.                 }
  258.                 break;
  259.             case 8:
  260.                 return 0;
  261.             default:
  262.                 cout << "Niepoprawny numer!" << endl;
  263.         }
  264.     }
  265. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement