#include #include /* Vezane liste - Primjer 3. Ubacivanje na kraj vezane liste: - stalno trazenje zadnjeg elementa (lose), - pamcenje zadnjeg (simulacija reda). */ /* ======================================================================== */ /* Tip za pokazivac na element liste. */ typedef struct _element *lista; /* Tip za element liste. */ typedef struct _element { int broj; /* Sadrzaj je broj. */ lista sljed; /* Pokazivac na sljedeci element u listi. */ } element; /* ======================================================================== */ lista kreiraj_novi(int broj) { lista novi = NULL; /* if ((novi = (lista) malloc(sizeof(element))) == NULL) */ novi = (lista) malloc(sizeof(element)); if (novi == NULL) { printf("Alokacija nije uspjela.\n"); exit(EXIT_FAILURE); /* exit(1); */ } novi->broj = broj; novi->sljed = NULL; return novi; } /* ======================================================================== */ lista ubaci_na_pocetak(lista prvi, lista novi) { /* Ne provjerava novi != NULL. */ novi->sljed = prvi; prvi = novi; return prvi; } /* ======================================================================== */ lista obrisi_listu(lista prvi) { lista pom; /* while (prvi != NULL) prvi = obrisi_prvog(prvi); */ while (prvi != NULL) { pom = prvi; prvi = prvi->sljed; free(pom); } return NULL; /* <=> return prvi; */ } /* ======================================================================== */ int broj_elemenata(lista prvi) { lista pom; int brojac = 0; for (pom = prvi; pom != NULL; pom = pom->sljed) ++brojac; return brojac; } /* ======================================================================== */ void ispisi_listu(lista prvi) { lista pom; int brojac = 0; for (pom = prvi; pom != NULL; pom = pom->sljed) { printf(" Element %2d, broj = %2d\n", ++brojac, pom->broj); } return; } /* ======================================================================== */ lista trazi_zadnji(lista prvi) { lista pom; if (prvi == NULL) return NULL; for (pom = prvi; pom->sljed != NULL; pom = pom->sljed); return pom; } /* ======================================================================== */ lista ubaci_iza(lista prvi, lista preth, lista novi) { /* Ne provjerava novi != NULL. */ /* Ako je preth == NULL, ubacujemo na pocetak. */ if (preth == NULL) { novi->sljed = prvi; prvi = novi; } else { novi->sljed = preth->sljed; preth->sljed = novi; } return prvi; } /* ======================================================================== */ lista ubaci_na_kraj_lose(lista prvi, lista novi) { /* Ne provjerava novi != NULL. */ lista zadnji; /* Moze i samo else blok. */ if (prvi == NULL) prvi = ubaci_na_pocetak(prvi, novi); else { zadnji = trazi_zadnji(prvi); prvi = ubaci_iza(prvi, zadnji, novi); } return prvi; } /* ======================================================================== */ lista ubaci_na_kraj(lista prvi, lista *p_zadnji, lista novi) { /* Ne provjerava novi != NULL. */ /* Vraca zadnji kroz varijabilni argument - pokazivac p_zadnji. */ lista zadnji = *p_zadnji; /* Moze: prvi == NULL || zadnji == NULL. */ if (prvi == NULL) prvi = novi; else /* Ocekujemo zadnji->sljed == NULL. */ zadnji->sljed = novi; novi->sljed = NULL; /* Ne treba: zadnji = novi; *p_zadnji = zadnji; */ *p_zadnji = novi; /* Vrati novi zadnji! */ return prvi; } /* ======================================================================== */ int main(void) { lista prvi = NULL; /* Prazna lista! */ lista zadnji, novi; /* Punjenje liste straga, element po element. */ /* Los nacin. */ novi = kreiraj_novi(1); prvi = ubaci_na_kraj_lose(prvi, novi); novi = kreiraj_novi(2); prvi = ubaci_na_kraj_lose(prvi, novi); novi = kreiraj_novi(3); prvi = ubaci_na_kraj_lose(prvi, novi); novi = kreiraj_novi(4); prvi = ubaci_na_kraj_lose(prvi, novi); novi = kreiraj_novi(5); prvi = ubaci_na_kraj_lose(prvi, novi); printf(" Kreirana lista losim nacinom.\n"); /* Ispis broja elemenata i cijele liste. */ printf("\n"); printf(" Broj elemenata u listi = %d\n", broj_elemenata(prvi)); ispisi_listu(prvi); /* Obrisi cijelu listu. */ prvi = obrisi_listu(prvi); /* Pravi nacin - koristimo i zadnji. */ novi = kreiraj_novi(1); prvi = ubaci_na_kraj(prvi, &zadnji, novi); novi = kreiraj_novi(2); prvi = ubaci_na_kraj(prvi, &zadnji, novi); novi = kreiraj_novi(3); prvi = ubaci_na_kraj(prvi, &zadnji, novi); novi = kreiraj_novi(4); prvi = ubaci_na_kraj(prvi, &zadnji, novi); novi = kreiraj_novi(5); prvi = ubaci_na_kraj(prvi, &zadnji, novi); printf("\n"); printf(" Kreirana lista dobrim nacinom.\n"); /* Ispis broja elemenata i cijele liste. */ printf("\n"); printf(" Broj elemenata u listi = %d\n", broj_elemenata(prvi)); ispisi_listu(prvi); /* Obrisi cijelu listu. */ prvi = obrisi_listu(prvi); return 0; }