#include #include /* Vezane liste - Primjer 1. Osnovne operacije s vezanom listom: - kreiranje i brisanje elemenata sprijeda (na pocetku liste), - brojanje elemenata, ispis i brisanje cijele liste. */ /* ======================================================================== */ /* Tip za pokazivac na element liste. */ /* NE SMIJE OVAKO --- tip element jos NIJE definiran: typedef element* lista; To smijemo napisati tek NAKON deklaracije tipa element. Zato koristimo struct s pomocnim imenom tipa _element. */ 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 kreiraj_sprijeda(lista prvi, 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 = prvi; /* Ne treba prvi = novi, vec samo ovo: */ return novi; } /* ======================================================================== */ lista obrisi_prvog(lista prvi) { lista pom; if (prvi != NULL) { pom = prvi; prvi = prvi->sljed; free(pom); /* Ne treba pom = NULL; */ } 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; } /* ======================================================================== */ void ispisi_listu_2(lista prvi) { lista pom; int brojac = 0; if (prvi == NULL) printf(" Lista je prazna!\n"); else for (pom = prvi; pom != NULL; pom = pom->sljed) { printf(" Element %2d, broj = %2d\n", ++brojac, pom->broj); } return; } /* ======================================================================== */ int main(void) { lista prvi = NULL; /* Prazna lista! */ int broj; lista novi; /* Test za praznu listu. */ printf(" Broj elemenata u listi = %d\n", broj_elemenata(prvi)); ispisi_listu(prvi); ispisi_listu_2(prvi); /* Punjenje liste sprijeda. */ /* Citanje niza brojeva za listu, do broj = 0. To je oznaka kraj niza, ali nije clan niza. */ /* Poredak brojeva u listi je obratan od redoslijeda citanja, jer dodajemo na pocetak liste. */ printf("Upisite niz cijelih brojeva (0 = kraj).\n"); do { printf("Sljedeci broj:\n"); scanf("%d", &broj); if (broj != 0) prvi = kreiraj_sprijeda(prvi, broj); } while (broj != 0); /* Ispis broja elemenata i cijele liste. */ printf("\n"); printf(" Broj elemenata u listi = %d\n", broj_elemenata(prvi)); ispisi_listu(prvi); /* Ubacivanje na pocetak liste. */ printf("\n"); /* Ubaci novi element sa zadanim brojem na pocetak liste. */ novi = kreiraj_novi(11); prvi = ubaci_na_pocetak(prvi, novi); /* Moze i ovako: prvi = kreiraj_sprijeda(prvi, 11); */ printf(" Ubacen 11 na pocetak liste.\n"); printf(" Broj elemenata u listi = %d\n", broj_elemenata(prvi)); ispisi_listu(prvi); /* Izbacivanje (brisanje) s pocetka liste. */ printf("\n"); /* Obrisi prvi element u listi. */ prvi = obrisi_prvog(prvi); printf(" Obrisan prvi element.\n"); printf(" Broj elemenata u listi = %d\n", broj_elemenata(prvi)); ispisi_listu(prvi); /* Obrisi cijelu listu. */ prvi = obrisi_listu(prvi); printf("\n Cijela lista je obrisana.\n"); ispisi_listu_2(prvi); return 0; }