Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- struct lista { // Radiš strukturu za jednostruku listu
- int vrijednost; // U ovo spremaš vrijednost pojedinog polja liste
- struct lista *sljedeca; // Ovdje spremaš adresu sljedećeg elementa koji dolazi nakon
- } *glavna; // Ovdje deklariraš pokazivač glavne liste
- void UnosListe(int num) // Funkcija koja stavlja vrijednost num u listu (na prvo mjesto)
- {
- struct lista *temp = (struct lista *)malloc(sizeof(struct lista)); // Pravimo privremenu listu u koju ćemo spremiti vrijednost
- // Nakon provjera unosimo vrijednost u glavnu listu
- temp->vrijednost = num; // Stavljaš vrijednost argumenta u privremenu listu
- if (glavna == NULL) { // Ako je glavna lista prazna onda stavljaj tu vrijednost u nju
- glavna = temp; // Ako izjednačiš liste onda automatski ubacuješ vrijednost iz privremene u glavnu listu
- glavna->sljedeca = NULL; // Ako je prazna lista onda imaš samo 1 element, a idući element ne postoji (NULL je adresa sljedećeg)
- }
- else { // Ako lista ima već elemente
- temp->sljedeca = glavna; // Stavljaš da sljedeća adresa privremene liste zapravo adresa glavne liste
- glavna = temp; // Ovdje ubacuješ vrijednost argumenta na sljedeće prazno polje
- }
- }
- void Zamjena(struct lista **tmp_lista, int x, int y) // Funkcija koja vrši zamjenu integera x i y
- {
- if (x == y) return; // Ako su x i y isti onda nema svrhe mijenjati podatke
- struct lista *prosliX = NULL, *sadX = *tmp_lista; // Ovdje deklariraš dva pokazivača koji služe za praćenje X vrijednosti u listi
- while (sadX && sadX->vrijednost != x) { // Pratiš adrese vrijednosti u listi koje su različite od X, a tražiš X u listi
- prosliX = sadX; // Prosli postaje trenutna adresa X vrijednosti
- sadX = sadX->sljedeca; // Sadasnja adresa je sljedeća adresa
- }
- struct lista *prosliY = NULL, *sadY = *tmp_lista; // Isto sve vrijedi kao i kod Xa, pratiš adrese vrijednosti u listi koje si različite od Y, a tražiš Y u listi
- while (sadY && sadY->vrijednost != y) {
- prosliY = sadY;
- sadY = sadY->sljedeca;
- }
- if (sadX == NULL || sadY == NULL) return; // Ukoliko nema X i Y u listi izađi iz programa
- if (prosliX != NULL) // Ukoliko X nije na početku liste onda napravi Y da je na početku
- prosliX->sljedeca = sadY;
- else
- *tmp_lista = sadY;
- if (prosliY != NULL) // Ukoliko Y nije na početku liste onda napravi X da je na početku
- prosliY->sljedeca = sadX;
- else
- *tmp_lista = sadX;
- struct lista *temp = sadY->sljedeca; // Spremaš Y u privremenu varijablu
- sadY->sljedeca = sadX->sljedeca; // U mjesto Ya spremaš X (adresu pokazivača Xa stavljaš na Y)
- sadX->sljedeca = temp; // U mjesto Xa spremaš Y adresu pokazivača Ya stavljaš na X)
- }
- void IspisListe() // Funkcija koja služi za ispis liste
- {
- struct lista *temp = glavna; // Tu radiš privremenu listu koja je zapravo ona gore (da ne bismo
- if (temp == NULL) return; // Ukoliko je lista prazna ne ispisuje se ništa
- while (temp != NULL) { // Sve dok petlja ne dođe do zadnje vrijednosti se vrti
- printf("%d ", temp->vrijednost); // Ispisuje se vrijednost
- temp = temp->sljedeca; // Kao trenutnu adresu elementa koristiš sljedeći element
- }
- printf("\n");
- }
- int main() {
- UnosListe(5);
- UnosListe(6);
- UnosListe(7);
- UnosListe(9);
- UnosListe(12);
- UnosListe(2);
- UnosListe(1);
- IspisListe();
- Zamjena(&glavna, 7, 5);
- Zamjena(&glavna, 12, 6);
- IspisListe();
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement