Advertisement
AdamBB

One directional list

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