# 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).