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; }
/* 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; }
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); }
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); }
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); }
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; }
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; }
/* 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; }
/* 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; }
/* 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; }
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; }
/* 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; }