Advertisement
B-Matt

Studij #2 - C

Feb 20th, 2016
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.87 KB | None | 0 0
  1. // main.c
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include "list.h"
  5.  
  6. int main() {
  7.     InsertData(1);
  8.     InsertData(2);
  9.     InsertData(3);
  10.     InsertData(4);
  11.     InsertData(5);
  12.     InsertData(6);
  13.     InsertData(7);
  14.     InsertData(8);
  15.     InsertData(9);
  16.     InsertData(10);
  17.     PrintList();
  18.     return 0;
  19. }
  20.  
  21.  
  22. // list.h (modul) - novi fajl
  23. #ifndef LIST_H
  24. #define LIST_H
  25.  
  26. #include <stdlib.h>
  27. #include <stdio.h>
  28.  
  29. struct Lista {                                                              // Ovdje kreiraš strukturu po imenu lista (ona reprenzetira tu listu)
  30.     int data;                                                               // U ovu cijelobrojnu varijablu spremaš brojeve unutar
  31.     struct Lista* next;                                                     // Ovdje spremaš adresu sljedećeg mjesta unutar liste (ako je jedini član onda je sljedeći član NULL (nema ga))
  32.     struct Lista* prev;                                                     // Ovdje spremaš adresu prošlog mjesta unutar liste (ako je prvi član onda je prošli NULL (nema ga))
  33. };
  34.  
  35. 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
  36.                                                                             // Da ne bismo zeznuli cijelu listu, zato moraš dodati privremene varijable sa adresama liste
  37. int listCount = 0;                                                          // Ovo je brojač koji broji koliko članova lista ima (to koristimo kod pregleda srednje vrijednosti članova liste)
  38.  
  39. struct Lista* NewNode(int value) {                                          // Funkcija koja pravi novo mjesto unutar liste sa zadanom vrijednosti (value). Ovo koristiš da si olakšaš posao
  40.     struct Lista* node = (struct Lista*)malloc(sizeof(struct Lista));       // Praviš privremenu lokalnu varijablu u dinamičnoj memoriji (malloc)
  41.     node->data = value;                                                     // Prirodaješ vrijednost argumenta u tu privremenu listu
  42.     node->prev = NULL;                                                      // Prva je vrijednost u toj privremenoj listi zato nema sljedećeg ili prošlog člana
  43.     node->next = NULL;
  44.     return node;                                                            // Vraćaš napravljeno mjesto dalje
  45. }
  46.  
  47. void InsertData(int value) {                                                // Funkcija koja stavlja vrijednost unutar liste
  48.     listCount++;                                                            // Povečaš brojač članova liste jer dodaješ novog člana
  49.     struct Lista* temp = head;                                              // Praviš privremeni pokazivač 'temp' u koji spremaš cijelu listu
  50.     struct Lista* novaLista = NewNode(value);                               // Praviš privremeni pokazivač 'novaLista' u koji spremaš novokreirano mjesto
  51.     if (head == NULL) {                                                     // Ako je prvo mjesto u listi onda stavljaš da je novo mjesto prvo u listi
  52.         head = novaLista;
  53.         return;
  54.     }
  55.     while (temp->next != NULL) temp = temp->next;                           // Ovdje pomičeš 'temp' pokazivač na zadnje mjesto u listi
  56.     temp->next = novaLista;                                                 // Ubacuješ novokreirano mjesto na zadnje mjesto u listi
  57.     novaLista->prev = temp;                                                 // I stavljaš da je prošlo mjesto zadnje mjesto prije stavljanja novog
  58. }
  59.  
  60. void PrintItem(Lista *node) {                                               // Ovdje ispisuješ pojedini element liste, argument je pokazivač na adresu pojedinog elementa iz liste
  61.     printf("%d.", node->data);                                              // Ispisuje broj
  62.     if (listCount % 2 == 0)                                                 // Ako je broj paran onda ispisuje nakon broja zarez ili novi redak
  63.         printf("%s", node->next != NULL ? (", ") : ("\n"));
  64.     else                                                                    // Ako je broj neparan i ako nema ništa poslije njega onda ispisuje zared ili novi redak
  65.         printf("%s", node->prev != NULL ? (", ") : ("\n"));
  66. }
  67.  
  68. void PrintList() {                                                          // Funkcija kojom ispisuješ čitavu listu
  69.     second = third = head;                                                  // Stavljaš dva pomoćna pokazivača liste na vrijednosti glavne liste
  70.     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
  71.         second = third = second->next;                                      // (ako je srednja vrijednost 4 onda će ti do te vrijednosti ići pokazivači)
  72.     if (listCount % 2 == 0) {                                               // Ako je broj paran onda radi ovaj blok naredbi
  73.         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)  
  74.         third = third->prev;                                                // Isto kao i gore
  75.     }
  76.     PrintItem(second);                                                      // Ispisujemo srednji element liste
  77.     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
  78.         third = third->next;                                                // Ovdje 'third' pomičeš naprijed (adresu pokazivača mijenjaš na sljedeći element)
  79.         PrintItem(third);                                                   // Ispisuješ vrijednost toga elementa
  80.  
  81.         second = second->prev;                                               // Ovdje 'second' pomičeš nazad (adresu pokazivača mijenjaš na prošli element)
  82.         PrintItem(second);                                                   // Ispisuješ vrijednost toga elementa
  83.     }
  84.     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)
  85. }
  86.  
  87. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement