Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // main.c
- #include <stdlib.h>
- #include <stdio.h>
- #include "list.h"
- int main() {
- InsertData(1);
- InsertData(2);
- InsertData(3);
- InsertData(4);
- InsertData(5);
- InsertData(6);
- InsertData(7);
- InsertData(8);
- InsertData(9);
- InsertData(10);
- PrintList();
- return 0;
- }
- // list.h (modul) - novi fajl
- #ifndef LIST_H
- #define LIST_H
- #include <stdlib.h>
- #include <stdio.h>
- struct Lista { // Ovdje kreiraš strukturu po imenu lista (ona reprenzetira tu listu)
- int data; // U ovu cijelobrojnu varijablu spremaš brojeve unutar
- struct Lista* next; // Ovdje spremaš adresu sljedećeg mjesta unutar liste (ako je jedini član onda je sljedeći član NULL (nema ga))
- struct Lista* prev; // Ovdje spremaš adresu prošlog mjesta unutar liste (ako je prvi član onda je prošli NULL (nema ga))
- };
- struct Lista *head = NULL, *second = NULL, *third = NULL; // Ovdje deklariraš pokazivače u kojima spremaš adrese liste i privremenih varijabli (second i third) koje se koriste kod ispisa brojeva
- // Da ne bismo zeznuli cijelu listu, zato moraš dodati privremene varijable sa adresama liste
- int listCount = 0; // Ovo je brojač koji broji koliko članova lista ima (to koristimo kod pregleda srednje vrijednosti članova liste)
- struct Lista* NewNode(int value) { // Funkcija koja pravi novo mjesto unutar liste sa zadanom vrijednosti (value). Ovo koristiš da si olakšaš posao
- struct Lista* node = (struct Lista*)malloc(sizeof(struct Lista)); // Praviš privremenu lokalnu varijablu u dinamičnoj memoriji (malloc)
- node->data = value; // Prirodaješ vrijednost argumenta u tu privremenu listu
- node->prev = NULL; // Prva je vrijednost u toj privremenoj listi zato nema sljedećeg ili prošlog člana
- node->next = NULL;
- return node; // Vraćaš napravljeno mjesto dalje
- }
- void InsertData(int value) { // Funkcija koja stavlja vrijednost unutar liste
- listCount++; // Povečaš brojač članova liste jer dodaješ novog člana
- struct Lista* temp = head; // Praviš privremeni pokazivač 'temp' u koji spremaš cijelu listu
- struct Lista* novaLista = NewNode(value); // Praviš privremeni pokazivač 'novaLista' u koji spremaš novokreirano mjesto
- if (head == NULL) { // Ako je prvo mjesto u listi onda stavljaš da je novo mjesto prvo u listi
- head = novaLista;
- return;
- }
- while (temp->next != NULL) temp = temp->next; // Ovdje pomičeš 'temp' pokazivač na zadnje mjesto u listi
- temp->next = novaLista; // Ubacuješ novokreirano mjesto na zadnje mjesto u listi
- novaLista->prev = temp; // I stavljaš da je prošlo mjesto zadnje mjesto prije stavljanja novog
- }
- void PrintItem(Lista *node) { // Ovdje ispisuješ pojedini element liste, argument je pokazivač na adresu pojedinog elementa iz liste
- printf("%d.", node->data); // Ispisuje broj
- if (listCount % 2 == 0) // Ako je broj paran onda ispisuje nakon broja zarez ili novi redak
- printf("%s", node->next != NULL ? (", ") : ("\n"));
- else // Ako je broj neparan i ako nema ništa poslije njega onda ispisuje zared ili novi redak
- printf("%s", node->prev != NULL ? (", ") : ("\n"));
- }
- void PrintList() { // Funkcija kojom ispisuješ čitavu listu
- second = third = head; // Stavljaš dva pomoćna pokazivača liste na vrijednosti glavne liste
- for (int i = 0; i < ((int)listCount / 2); i++) // U ovoj petlji od 0 do polovice liste stavljaš pomoćne pokazivače na maksimalnu vrijednost
- second = third = second->next; // (ako je srednja vrijednost 4 onda će ti do te vrijednosti ići pokazivači)
- if (listCount % 2 == 0) { // Ako je broj paran onda radi ovaj blok naredbi
- second = second->prev; // Pomičeš vrijednost pomoćne liste za jedan unatrag (inače ti se zezne čitava lista i kod ne radi ako je paran broj)
- third = third->prev; // Isto kao i gore
- }
- PrintItem(second); // Ispisujemo srednji element liste
- while (second->prev != NULL && third->next != NULL) { // Petlja se vrti sve dok 'second' ne dođe do svoga prvog elementa ili 'third' do svoga maksimalnog elementa
- third = third->next; // Ovdje 'third' pomičeš naprijed (adresu pokazivača mijenjaš na sljedeći element)
- PrintItem(third); // Ispisuješ vrijednost toga elementa
- second = second->prev; // Ovdje 'second' pomičeš nazad (adresu pokazivača mijenjaš na prošli element)
- PrintItem(second); // Ispisuješ vrijednost toga elementa
- }
- if (listCount % 2 == 0) PrintItem(third->next); // Ako je paran broj elemenata liste onda ispisuje zadnji element na kraju (inače ti se ne ispiše ako nema toga)
- }
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement