Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- // Typ elementów listy
- //--------------------
- struct slistEl
- {
- slistEl * next;
- int data;
- };
- // Definicja typu obiektowego slist
- //---------------------------------
- class slist
- {
- public:
- slistEl * head;
- slist(); // konstruktor
- ~slist(); // destruktor
- unsigned size();
- void printl();
- void push_front(int v);
- void push_back(int v);
- void insert_before(slistEl * e, int v);
- void insert_after(slistEl * e, int v);
- void pop_front();
- void pop_back();
- void remove(slistEl * e);
- };
- // Konstruktor listy
- //------------------
- slist::slist()
- {
- head = NULL;
- }
- // Destruktor listy
- //-----------------
- slist::~slist()
- {
- while(head) pop_front();
- }
- // Funkcja oblicza liczbę elementów listy
- //---------------------------------------
- unsigned slist::size()
- {
- unsigned c = 0;
- slistEl * p = head;
- while(p)
- {
- c++;
- p = p->next;
- }
- return c;
- }
- // Procedura wyświetla zawartość elementów listy
- //----------------------------------------------
- void slist::printl()
- {
- unsigned i;
- slistEl * p = head;
- cout << endl;
- cout << "--------------------------------------------------" <<endl;
- cout << "---------ZAWARTOŚĆ LISTY JEDNOKIERUNKOWEJ---------" <<endl;
- cout << "--------------------------------------------------" <<endl;
- cout << "Ilość elementów: " << size() << endl;
- for(i = 1; p; p = p->next) cout << "Element #" << i++ << " dane = " << p->data << endl;
- cout << endl;
- cout << "--------------------------------------------------" <<endl;
- }
- // Procedura dołączania na początek listy
- //---------------------------------------
- void slist::push_front(int v)
- {
- slistEl * p;
- p = new slistEl;
- p->next = head;
- p->data = v;
- head = p;
- }
- // Procedura dołączania na koniec listy
- //---------------------------------------
- void slist::push_back(int v)
- {
- slistEl * p, * e;
- e = new slistEl; // tworzymy nowy element
- e->next = NULL; // inicjujemy element
- e->data = v;
- p = head;
- if(p)
- {
- while(p->next) p = p->next;
- p->next = e;
- }
- else head = e;
- }
- // Procedura dołączania przed elementem e
- //---------------------------------------
- void slist::insert_before(slistEl * e, int v)
- {
- slistEl * p = head;
- if(p == e) push_front(v);
- else
- {
- while(p->next != e) p = p->next;
- p->next = new slistEl;
- p->next->next = e;
- p->next->data = v;
- }
- }
- // Procedura dołączania za elementem e
- //------------------------------------
- void slist::insert_after(slistEl * e, int v)
- {
- slistEl * p = new slistEl;
- p->next = e->next;
- p->data = v;
- e->next = p;
- }
- // Procedura usuwa pierwszy element
- //---------------------------------
- void slist::pop_front()
- {
- slistEl * p = head; // zapamiętujemy początek
- if(p)
- {
- head = p->next; // nowy początek
- delete p; // usuń element z pamięci
- }
- }
- // Procedura usuwa ostatni element
- //---------------------------------
- void slist::pop_back()
- {
- slistEl * p = head; // zapamiętujemy początek
- if(p)
- {
- if(p->next)
- {
- while(p->next->next) p = p->next;
- delete p->next;
- p->next = NULL;
- }
- else
- {
- delete p;
- head = NULL;
- }
- }
- }
- // Procedura usuwa wybrany element
- //--------------------------------
- void slist::remove(slistEl * e)
- {
- slistEl * p;
- if(head == e) pop_front();
- else
- {
- p = head;
- while(p->next != e) p = p->next;
- p->next = e->next;
- delete e;
- }
- }
- void menu()
- {
- cout << "1. Dodaj element na początek listy" << endl;
- cout << "2. Dodaj element na koniec listy" << endl;
- cout << "3. Dodaj element przed elementem nr..." << endl;
- cout << "4. Dodaj element za elementem nr..." << endl;
- cout << "5. Usuń element z początku listy" << endl;
- cout << "6. Usuń element z końca listy" << endl;
- cout << "7. Usuń element numer..." << endl;
- cout << "8. Wyjdź z programu" << endl;
- cout << endl;
- }
- //---------------
- // Program główny
- //---------------
- int main()
- {
- slist L; // zawiera adres początku listy
- slistEl * e; // do wskazywania elementów listy
- int i;
- int x;
- int y;
- while(true)
- {
- L.printl();
- menu();
- cout << "Wybór: ";
- cin >> i;
- switch(i)
- {
- case 1 :
- if (L.size() < 6)
- {
- cout << "Podaj numer jaki dodać do elementu na początku listy: ";
- cin >> x;
- L.push_front(x);
- } else {
- cout << "Lista jest pełna! Max 6 elementów" << endl;
- }
- break;
- case 2 :
- if (L.size() < 6)
- {
- cout << "Podaj numer jaki dodać do elementu na końcu listy: ";
- cin >> x;
- L.push_back(x);
- } else {
- cout << "Lista jest pełna! Max 6 elementów" << endl;
- }
- break;
- case 3 :
- cout << "Wpisz numer elementu przed którym dodać element: ";
- cin >> y;
- cout << "Wpisz wartość dodawanego elementu: ";
- cin >> x;
- e = L.head;
- for (int xx = 1; xx < y; xx++) e = e->next;
- L.insert_before(e, x);
- break;
- case 4 :
- cout << "Wpisz numer elementu za którym dodać element: ";
- cin >> y;
- cout << "Wpisz wartość dodawanego elementu: ";
- cin >> x;
- e = L.head;
- for (int xx = 1; xx < y; xx++) e = e->next;
- L.insert_after(e, x);
- break;
- case 5 :
- if (L.size() > 0) L.pop_front();
- else cout << "Lista jest pusta! Brak możliwości usunięcia elementu.";
- break;
- case 6 :
- if (L.size() > 0) L.pop_back();
- else cout << "Lista jest pusta! Brak możliwości usunięcia elementu.";
- break;
- case 7 :
- if (L.size() > 0) {
- cout << "Wpisz numer elementu za którym chcesz usunąć: ";
- cin >> y;
- e = L.head;
- for (int xx = 1; xx < y; xx++) e = e->next;
- L.remove(e);
- } else {
- cout << "Lista jest pusta! Brak możliwości usunięcia elementu.";
- }
- break;
- case 8:
- return 0;
- default:
- cout << "Niepoprawny numer!" << endl;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement