int dodaj_na_pocetak_liste(Cvor ** adresa_glave, Cvor **
                           adresa_kraja, int broj)
{
  /* Kreira se novi cvor i proverava se uspesnost kreiranja */
  Cvor *novi = napravi_cvor(broj);
  if (novi == NULL)
    return 1;

  /* Sledbenik novog cvora je glava stare liste */
  novi->sledeci = *adresa_glave;

  /* Ako stara lista nije bila prazna, onda prethodni cvor glave
     treba da bude novi cvor. Inace, novi cvor je u isto vreme i
     pocetni i krajnji. */
  if (*adresa_glave != NULL)
    (*adresa_glave)->prethodni = novi;
  else
    *adresa_kraja = novi;

  /* Novi cvor je nova glava liste */
  *adresa_glave = novi;

  /* Vraca se indikator uspesnog dodavanja */
  return 0;
}
Example #2
0
/* Funkcija koja dodaje novi cvor u stablo. Stablo treba da bude
   uredjeno po datumu - prvo po mesecu, a zatim po danu. Ukoliko je
   dodavanje uspesno povratna vrednost funkcije je 0, u suprotnom
   povratna vrednost je 1 */
int dodaj_u_stablo(Cvor ** koren, char ime[], char prezime[],
                   int dan, int mesec)
{
  /* Ako je stablo prazno */
  if (*koren == NULL) {

    /* Kreira se novi cvor */
    Cvor *novi_cvor = napravi_cvor(ime, prezime, dan, mesec);
    /* Proverava se uspesnost kreiranja novog cvora */
    if (novi_cvor == NULL) {
      /* I ukoliko je doslo do greske, vraca se odgovarajuca
         vrednost */
      return 1;
    }
    /* Inace, novi cvor se proglasava korenom stabla */
    *koren = novi_cvor;

    /* I vraca se indikator uspesnog dodavanja */
    return 0;
  }

  /* Stablo se uredjuje po mesecu, a zatim po danu u okviru istog
     meseca */
  if (mesec < (*koren)->mesec)
    return dodaj_u_stablo(&(*koren)->levo, ime, prezime, dan,
                          mesec);
  else if (mesec == (*koren)->mesec && dan < (*koren)->dan)
    return dodaj_u_stablo(&(*koren)->levo, ime, prezime, dan,
                          mesec);
  else
    return dodaj_u_stablo(&(*koren)->desno, ime, prezime, dan,
                          mesec);
}
int dodaj_na_kraj_liste(Cvor ** adresa_glave, Cvor ** adresa_kraja,
                        int broj)
{
  /* Kreira se novi cvor i proverava se uspesnost kreiranja */
  Cvor *novi = napravi_cvor(broj);
  if (novi == NULL)
    return 1;

  /* U slucaju prazne liste, glava nove liste je upravo novi cvor i
     ujedno i cela lista. Azuriraju se vrednosti na koje pokazuju
     adresa_glave i adresa_kraja */
  if (*adresa_glave == NULL) {
    *adresa_glave = novi;
    *adresa_kraja = novi;
  } else {
    /* Ako lista nije prazna, novi cvor se dodaje na kraj liste kao
       sledbenik poslednjeg cvora i azurira se samo pokazivac na
       kraj liste */
    (*adresa_kraja)->sledeci = novi;
    novi->prethodni = (*adresa_kraja);
    *adresa_kraja = novi;
  }

  /* Vraca se indikator uspesnog dodavanja */
  return 0;
}
Example #4
0
int dodaj_na_kraj_liste(Cvor ** adresa_glave, int broj)
{
  /* Ako je lista prazna */
  if (*adresa_glave == NULL) {

    /* Novi cvor postaje glava liste */
    Cvor *novi = napravi_cvor(broj);
    /* Ako je bilo greske pri kreiranju novog cvora, vraca se 1 */
    if (novi == NULL)
      return 1;

    /* Azuriranjem vrednosti na koju pokazuje adresa_glave, ujedno
       se azurira i pokazivacka promenljiva u pozivajucoj funkciji */
    *adresa_glave = novi;

    /* Vraca se indikator uspesnog dodavanja */
    return 0;
  }

  /* Ako lista nije prazna, broj se dodaje u rep liste. */
  /* Prilikom dodavanja u listu na kraj u velikoj vecini slucajeva
     novi broj se dodaje u rep liste u rekurzivnom pozivu.
     Informaciju o uspesnosti alokacije u rekurzivnom pozivu
     funkcija prosledjuje visem rekurzivnom pozivu koji tu
     informaciju vraca u rekurzivni poziv iznad, sve dok se ne
     vrati u main. Tek je iz main funkcije moguce pristupiti pravom 
     pocetku liste i osloboditi je celu, ako ima potrebe. Ako je
     funkcija vratila 0, onda nije bilo greske. */
  return dodaj_na_kraj_liste(&(*adresa_glave)->sledeci, broj);
}
Example #5
0
int dodaj_sortirano(Cvor ** adresa_glave, int broj)
{
  /* Ako je lista prazna */
  if (*adresa_glave == NULL) {

    /* Novi cvor postaje glava liste */
    Cvor *novi = napravi_cvor(broj);

    /* Ako je bilo greske pri kreiranju novog cvora, vraca se 1 */
    if (novi == NULL)
      return 1;

    /* Azurira se glava liste */
    *adresa_glave = novi;

    /* Vraca se indikator uspesnog dodavanja */
    return 0;
  }

  /* Lista nije prazna. Ako je broj manji ili jednak od vrednosti u
     glavi liste, onda se dodaje na pocetak liste */
  if ((*adresa_glave)->vrednost >= broj)
    return dodaj_na_pocetak_liste(adresa_glave, broj);

  /* Inace, broj treba dodati u rep liste, tako da rep i sa novim
     cvorom bude sortirana lista. */
  return dodaj_sortirano(&(*adresa_glave)->sledeci, broj);
}
Example #6
0
int dodaj_u_stablo(Cvor ** adresa_korena, int broj)
{
  /* Ako je stablo prazno */
  if (*adresa_korena == NULL) {

    /* Kreira se novi cvor */
    Cvor *novi_cvor = napravi_cvor(broj);

    /* Proverava se uspesnost kreiranja */
    if (novi_cvor == NULL) {
      /* Ako je doslo do greske, vraca se odgovarajuca vrednost */
      return 1;
    }

    /* Inace, novi cvor se proglasava korenom stabla */
    *adresa_korena = novi_cvor;

    /* I vraca se indikator uspesnosti kreiranja */
    return 0;
  }

  /* Ako stablo nije prazno, trazi se odgovarajuca pozicija za
     zadati broj */

  /* Ako je zadata vrednost manja od vrednosti korena */
  if (broj < (*adresa_korena)->broj)
    /* Broj se dodaje u levo podstablo */
    return dodaj_u_stablo(&(*adresa_korena)->levo, broj);
  else
    /* Inace, broj je veci (ili jednak) od vrednosti u korenu pa se
       dodaje u desno podstablo */
    return dodaj_u_stablo(&(*adresa_korena)->desno, broj);
}
Example #7
0
int potisni_na_stek(Cvor ** adresa_vrha, char *etiketa)
{
  /* Kreira se novi cvor i proverava se uspesnost kreiranja */
  Cvor *novi = napravi_cvor(etiketa);
  if (novi == NULL)
    return 1;

  /* Novi cvor se uvezuje na vrh i postaje nov vrh steka */
  novi->sledeci = *adresa_vrha;
  *adresa_vrha = novi;
  return 0;
}
Example #8
0
int dodaj_na_pocetak_liste(Cvor ** adresa_glave, int broj)
{
  /* Kreira se novi cvor i proverava se uspesnost kreiranja */
  Cvor *novi = napravi_cvor(broj);
  if (novi == NULL)
    return 1;

  /* Novi cvor se uvezuje na pocetak i postaje nova glave liste */
  novi->sledeci = *adresa_glave;
  *adresa_glave = novi;

  /* Vraca se indikator uspesnog dodavanja */
  return 0;
}
Example #9
0
/* Funkcija dodaje novi cvor na pocetak liste. Vraca 1 ako je doslo
   do greske pri alokaciji memorije za nov cvor, inace vraca 0. */
int dodaj_na_pocetak_liste(Cvor ** adresa_glave, unsigned br,
                           char *etiketa)
{
  /* Kreira se novi cvor i proverava se uspesnost alokacije */
  Cvor *novi = napravi_cvor(br, etiketa);
  if (novi == NULL)
    return 1;

  /* Dodaje se novi cvor na pocetak liste */
  novi->sledeci = *adresa_glave;
  *adresa_glave = novi;

  /* Vraca se indikator uspesnog dodavanja */
  return 0;
}
Example #10
0
/* Funkcija dodaje novi cvor na pocetak liste. Vraca 1 ako je doslo
   do greske pri alokaciji memorije za nov cvor, inace vraca 0. */
int dodaj_na_pocetak_liste(Cvor ** adresa_glave, char *broj_indeksa,
                           char *ime, char *prezime)
{
  /* Kreira se novi cvor i proverava se uspesnost alokacije */
  Cvor *novi = napravi_cvor(broj_indeksa, ime, prezime);
  if (novi == NULL)
    return 1;

  /* Dodaje se novi cvor na pocetak liste */
  novi->sledeci = *adresa_glave;
  *adresa_glave = novi;

  /* Vraca se indikator uspesnog dodavanja */
  return 0;
}
Example #11
0
/* Funkcija koja dodaje novu osobu i njen broj telefona u stablo.
   Ukoliko je dodavanje uspesno povratna vrednost funkcije je 0,
   dok je u suprotnom povratna vrednost 1 */
int
dodaj_u_stablo(Cvor ** adresa_korena, char *ime_i_prezime,
               char *telefon)
{
  /* Ako je stablo prazno */
  if (*adresa_korena == NULL) {
    /* Kreira se novi cvor */
    Cvor *novi_cvor = napravi_cvor(ime_i_prezime, telefon);
    /* Proverava se uspesnost kreiranja novog cvora */
    if (novi_cvor == NULL) {
      /* Ako je doslo do greske, vraca se odgovarajuca vrednost */
      return 1;
    }

    /* Inace, novi cvor se proglasava korenom stabla */
    *adresa_korena = novi_cvor;

    /* I vraca se indikator uspesnog dodavanja */
    return 0;
  }

  /* Ako stablo nije prazno, trazi se odgovarajuca pozicija za novi
     unos. Kako pretragu treba vrsiti po imenu i prezimenu, stablo
     treba da bude pretrazivacko po ovom polju.

     Ako je zadato ime i prezime leksikografski manje od imena i
     prezimena koje se nalazi u korenu, podaci se dodaju u levo
     podstablo */
  if (strcmp(ime_i_prezime, (*adresa_korena)->ime_i_prezime)
      < 0)
    return dodaj_u_stablo(&(*adresa_korena)->levo, ime_i_prezime,
                          telefon);
  else
    /* Ako je zadato ime i prezime leksikografski vece od imena i
       prezimena sadrzanog u korenu, podaci se dodaju u desno
       podstablo */
  if (strcmp(ime_i_prezime, (*adresa_korena)->ime_i_prezime) > 0)
    return dodaj_u_stablo(&(*adresa_korena)->desno, ime_i_prezime,
                          telefon);

  /* Pretostavka zadatka je da nema istih imena i prezimena u
     datoteci, pa se sledeca naredba nikada neci ni izvrsiti */
  return 0;
}
int dodaj_iza(Cvor * tekuci, int broj)
{
  /* Kreira se novi cvor i provera se uspesnost kreiranja */
  Cvor *novi = napravi_cvor(broj);
  if (novi == NULL)
    return 1;

  novi->sledeci = tekuci->sledeci;
  novi->prethodni = tekuci;

  /* Ako tekuci ima sledeceg, onda se sledecem dodeljuje
     prethodnik, a potom i tekuci dobija novog sledeceg
     postavljanjem pokazivaca na ispravne adrese */
  if (tekuci->sledeci != NULL)
    tekuci->sledeci->prethodni = novi;
  tekuci->sledeci = novi;

  /* Vraca se indikator uspesnog dodavanja */
  return 0;
}
Example #13
0
int dodaj_u_red(Cvor ** adresa_pocetka, Cvor ** adresa_kraja,
                Zahtev * zahtev)
{
  /* Kreira se novi cvor i proverava se uspesnost kreiranja */
  Cvor *novi = napravi_cvor(zahtev);
  if (novi == NULL)
    return 1;

  /* U red se uvek dodaje na kraj. Zbog postojanja pokazivaca na
     kraj, to je efikasno koliko i dodavanje na pocetak liste */
  if (*adresa_kraja != NULL) {
    (*adresa_kraja)->sledeci = novi;
    *adresa_kraja = novi;
  } else {
    /* Ako je red bio ranije prazan */
    *adresa_pocetka = novi;
    *adresa_kraja = novi;
  }

  /* Vraca se indikator uspesnog dodavanja */
  return 0;
}
int dodaj_sortirano(Cvor ** adresa_glave, Cvor ** adresa_kraja, int
                    broj)
{
  /* Ako je lista prazna, novi cvor je i prvi i poslednji cvor */
  if (*adresa_glave == NULL) {
    /* Kreira se novi cvor i proverava se uspesnost kreiranja */
    Cvor *novi = napravi_cvor(broj);
    if (novi == NULL)
      return 1;

    /* Azuriraju se vrednosti pocetka i kraja liste */
    *adresa_glave = novi;
    *adresa_kraja = novi;

    /* Vraca se indikator uspesnog dodavanja */
    return 0;
  }

  /* Ukoliko je vrednost glave liste veca ili jednaka od nove
     vrednosti onda novi cvor treba staviti na pocetak liste */
  if ((*adresa_glave)->vrednost >= broj) {
    return dodaj_na_pocetak_liste(adresa_glave, adresa_kraja, broj);
  }

  /* Pronalazi se cvor iza koga treba uvezati novi cvor */
  Cvor *pomocni = pronadji_mesto_umetanja(*adresa_glave, broj);
  /* Dodaje se novi cvor uz proveru uspesnosti dodavanja */
  if (dodaj_iza(pomocni, broj) == 1)
    return 1;
  /* Ako pomocni cvor pokazuje na poslednji element liste, onda je
     novi cvor poslednji u listi. */
  if (pomocni == *adresa_kraja)
    *adresa_kraja = pomocni->sledeci;

  return 0;
}
Example #15
0
/* Ubacuje dati broj na pocetak liste.  
   Pokazivac na pocetak liste se prenosi preko pokazivaca, umesto po 
   vrednosti, kako bi mogla da mu se izmeni vrednost. */
void ubaci_na_pocetak(CVOR** pl, int br)
{
	CVOR* novi = napravi_cvor(br);
	novi->sl = *pl;
	*pl = novi;
}