# Programiranje 2 - jednostruko povezane liste ### Povezane liste: #### Svaka lista sastoji se od: 1. strukture ```cpp= struct node { int data; node* next; } ``` 2. main-a ```cpp= node* head = NULL; // node* tail = NULL; //koristi samo kod dodavanje elemenata na kraj liste char choice; do { cout << "1 - unos elemenata u listu." << endl; cout << "2 - ispis elemenata iz liste." << endl; cout << "3- brisanje elemenata iz liste." << endl; cout << "Izaberi funkcionalnost: "; cin >> choice; switch(choice) { case '1': add(head /*, tail */); break; case '2': if (checkEmpty(head) == 1) { cout << "Lista je prazna, molim unesite element u listu." << endl; } else listElements(head); break; case '3': if (checkEmpty(head) == 1) { cout << "Lista je prazna, molim unesite element u listu." << endl; } else removeElement(head /*, tail */); break; default: break; } } } while(choice != '0'); memoryDeallocation(head /*, tail */); cout << "Kraj programa." << endl; ``` 3. funkcija (unos, ispis, brisanje, dealokacija memorije...) Funkcije su detaljnije obrađene u daljnjem dijelu dokumentacije. #### Dodavanje u listu dijelimo na tri različita unosa: 1. Unos elemenata na početak liste: ```cpp= //s naglaskom da je u main djelu pograma head pokazivac usmjeren na NULL void unosPocetak(node*& head) { int data; cout << "Dodajte podatak elementu u listi: "; cin >> data; node* newNode = new node; newNode->data = data; newNode->next = head; head = newNode; cout << "Novi element je uspjesno dodan na pocetak liste." << endl; } ``` 2. Unos elemenata na kraj liste: ```cpp= void unos(node*& head, node*& tail) { int data; cout << "Dodajte podatak elementu u listi: "; cin >> data; node* newNode = new node; newNode->data = data; newNode->next = NULL; if (head == NULL) { head = newNode; } else { tail->next = newNode; } tail = newNode; } ``` 3. Unos elemenata na određeno mjesto u listi: ```cpp= void unos(node*& head) { int data; cout << "Dodajte podatak elementu u listi: "; cin >> data; node* newNode = new node; newNode->data = data; newNode->next = NULL; node* current = head; node* previous = NULL; while (current != NULL && current->data > data) { previous = current; current = current->next; } if (current != NULL) { previous->next = newNode; newNode->next = current; } else { newNode->next = head; head = newNode; } } ``` #### Brisanje dijelimo na četiri različita načina: 1. Brisanje s početka liste, koristi se kad koristimo unos na početak liste: ```cpp= void brisi(node*& head) { node* tmp; tmp = head; head = head->next; delete tmp; } ``` 2. Brisanje s početka liste, koristi se kad koristimo unos na kraj liste: ```cpp= void brisi(node*& head, node*& tail) { if (head == NULL) { tail = NULL; } node* tmp; tmp = head; head = head->next; delete tmp; tmp = NULL; } ``` 3. Brisanje određenog elementa liste prema njegovom podatku: ```cpp= void brisi(node*& head) { int data; cout << "Unesite podatak elementa kojeg zelite obrisati: "; cin >> data; node* current = head; node* previous = NULL; while (current != NULL) { if (current->data = data) { break; } previous = current; current = current->next; } if (current != NULL) { if (previous == NULL) { head = head->next; } else { previous->next = current->next; } delete current; current = NULL; } } ``` 4. Brisanje svih elemenata u listi koji imaju isti podatak: ```cpp= void izbrisi(node *&head) { node *current = head; node *previous = NULL; node *tmp = NULL; int brojac = 0; while (current != NULL) { if (current->data == 0) { tmp = current; current = current->next; if (previous == NULL) { head = head->next; } else { previous->next = current; } delete tmp; tmp = NULL; brojac++; } else { previous = current; current = current->next; } } cout << "izbrisano je: " << brojac << "elemenata sa podatkom 0" << endl; } ``` #### Ispis elemenata iz liste djelimo na dva različita načina: 1. Ispis cijele liste: ```cpp= void ispis(node* head) { int brojac = 1; while (head != NULL) { cout << brojac ". element u listi: " << head->data << endl; brojac++; head = head->next; } } ``` 2. Ispis rednog broja elementa (korisnik unosi redni broj, a program ispisuje podatek o tom studentu): ```cpp= void ispis(node *head) { int brojac = 1; int redniBroj; cout << "unesite redni broj studenta za ispis: "; cin >> redniBroj; while (head != NULL) { if (brojac == redniBroj) { cout << "--------------------" << endl; cout << brojac << ". student pod ovim rednim brojem ima sljedeće podatke: " << endl; cout << "prezime: " << head->prezime << " | bodovi: " << head->bodovi << endl; } brojac++; head = head->next; } } ``` #### Dealokacija elemenata iz liste: ```cpp= void dealokacija(node*& head) { node* tmp; while (head != NULL) { tmp = head; head = head->next; delete tmp; tmp = NULL; } } ``` #### Primjer cijelog programa: ```cpp= #include <iostream> using namespace std; struct node { int data; node *next; }; void unos(node *&head) { int data; cout << "unesite podatak u cvor: "; cin >> data; node *newNode = new node; newNode->data = data; newNode->next = NULL; node *current = head; node *previous = NULL; while (current != NULL && current->data < data) { previous = current; current = current->next; } if (previous != NULL) { previous->next = newNode; newNode->next = current; } else { newNode->next = head; head = newNode; } } bool provjera(node *head) { if (head == NULL) { return 1; } else return 0; } void ispisi(node *head) { int brojac = 1; while (head != NULL) { cout << brojac << ". element u listi je: " << head->data << endl; brojac++; head = head->next; } cout << endl; } void izbrisi(node *&head) { int data; cout << "unesite podatak postojeceg elementa kojeg zelite obrasati: "; cin >> data; node *current = head; node *previous = NULL; while (current != NULL) { if (current->data == data) { break; } previous = current; current = current->next; } if (current != NULL) { if (previous == NULL) { head = head->next; } else { previous->next = current->next; } delete current; current = NULL; } } void dealokacija(node *&head) { node *tmp; while (head != NULL) { tmp = head; head = head->next; delete tmp; } } int main() { node *head = NULL; char odabir; do { cout << "1 - unos elementa u listu" << endl; cout << "2 - ispis elemenata iz liste" << endl; cout << "3 - brisanje elementa iz liste" << endl; cout << "odaberi: "; cin >> odabir; switch (odabir) { case '1': unos(head); break; case '2': if (provjera(head) == 1) { cout << "lista je prazna, unesite cvor u listu" << endl; } else { ispisi(head); } break; case '3': if (provjera(head) == 1) { cout << "lista je prazna, unesite cvor u listu" << endl; } else { izbrisi(head); } break; default: break; } } while (odabir != '0'); dealokacija(head); cout << "end of programm" << endl; return 0; } ``` Napomena: Što se tiče stog-a i red-a, situacija je ista ko i kod dodavanje elementa na početak liste(stog) i dodavanje elementa na kraj liste(red).