#include #include /* Vezane liste - Primjer 5a. Sortirano ubacivanje (na pravo mjesto) u listi. Elegantnija varijanta funkcije za ubacivanje. */ /* ======================================================================== */ /* 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 sortirano_ubaci(lista prvi, lista novi) { /* Insertion sort za jedan element. */ /* Ne provjerava novi != NULL. */ /* Inicijalizacija pom na prvi. NE treba inicijalizacija preth na NULL. */ lista preth, pom = prvi; /* Nadji trazeni element, ako ga ima. */ while (pom != NULL && pom->broj < novi->broj) { preth = pom; pom = preth->sljed; /* <=> pom = pom->sljed; */ } /* Neovisno o pom == prvi ili ne, pom uvijek pokazuje na listu sljedbenika novog elementa. */ /* Objesi pom iza novog. */ novi->sljed = pom; /* Sad pitamo kamo ce novi. */ if (pom == prvi) prvi = novi; else /* Tu je pom == preth->sljed. */ preth->sljed = novi; return prvi; } /* ======================================================================== */ /* Ispod su funkcije za osnovne operacije s listama. */ /* ======================================================================== */ 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 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; } /* ======================================================================== */ int main(void) { lista prvi = NULL; /* Prazna lista! */ lista novi; int broj; /* Sortirano punjenje liste. */ /* Citanje niza brojeva za listu, do broj = 0. To je oznaka kraj niza, ali nije clan niza. */ /* Pripadne elemente sortirano ubacujemo u listu. */ printf("Upisite niz cijelih brojeva (0 = kraj).\n"); do { printf("Sljedeci broj:\n"); scanf("%d", &broj); printf("\n Ucitao %d\n", broj); if (broj != 0) { novi = kreiraj_novi(broj); prvi = sortirano_ubaci(prvi, novi); printf(" Broj elemenata u trenutnoj listi = %d\n", broj_elemenata(prvi)); ispisi_listu(prvi); printf("\n"); } } while (broj != 0); /* Ispis broja elemenata i cijele liste. */ printf(" Broj elemenata u zavrsnoj listi = %d\n", broj_elemenata(prvi)); ispisi_listu(prvi); /* Obrisi cijelu listu. */ prvi = obrisi_listu(prvi); return 0; }