/* Rad sa jednostruko lancanom listom */ #include #include typedef struct elem { int broj; struct elem *sled; } Elem; /* Citanje brojeva i formiranje liste */ Elem *citaj (void) { Elem *niz = NULL, *tekuci = NULL, *novi; int broj; printf("\n\nUnesite elemente niza - 0 za kraj\n"); scanf ("%d", &broj); while (broj) { /*Alocira se prostor za novi clan liste*/ novi =(Elem*)malloc (sizeof (Elem)); /* Postavljanje vrednosti */ novi->broj = broj; novi->sled = NULL; /* Ukoliko lista nije prazna novi element se postavlja iza poslednjeg elemnta liste - na koji pokazuje tekuci */ if (tekuci) tekuci->sled = novi; /* Inace se postavlja da bude pocetak liste */ else niz = novi; /*Tekuci se postavlja da pokazuje na poslednji element liste */ /*Ekvivalentno je sa tekuci = tekuci ->sledeci */ tekuci = novi; /* Ucitavanje novog elementa liste 0 za kraj */ scanf ("%d", &broj); } /* Funkcija vraca pokazivac na pocetak liste */ return niz; } void pisi (Elem *niz) { while (niz) { printf ("%d ", niz->broj), niz = niz->sled; } } void brisi (Elem *niz) { Elem * stari; while (niz) { stari = niz; niz = niz->sled; free (stari); } } /* Izostavljanje zadatog broja */ Elem *izost (Elem *niz, int k) { Elem *preth = NULL, *tekuci = niz, *stari; while (tekuci) /*Ukoliko tekuci pokazuje na clana liste kojeg treba izbaciti */ if (tekuci->broj == k) { stari = tekuci; tekuci = tekuci->sled; if (preth) preth->sled = tekuci; else niz = tekuci; free (stari); } else { preth = tekuci; tekuci = tekuci->sled; } return niz; } main () { /* test glavni program */ Elem *lista; int k; while (lista = citaj ()) { printf ("Ucitani niz = "); pisi (lista); putchar ('\n'); printf("Koji element niza zelite da izbacite?\n"); scanf ("%d", &k); printf ("Izostavlja se = %d\n", k); printf ("Novi niz = "); pisi (lista = izost (lista, k)); printf ("\n"); printf("Oslobadjam memoriju za novu listu\n"); brisi (lista); } return 0; }