/* Rad sa jednostruko lancanim listama */ #include #include typedef struct elem {int broj; struct elem *sled;} Elem; /* Citanje brojeva i stvaranje liste */ Elem *citaj () { Elem *niz=NULL, *tekuci=NULL; int broj; printf("\nUnesite niz celih brojeva, a zatim bilo sta sto nije ceo broj za nastavak.\nUkoliko zelite prekid programa unesite nesto sto nije ceo broj.\nKonacno, trazeni unos je: "); while (scanf("%d", &broj)) { Elem *novi=malloc(sizeof(Elem)); novi->broj=broj; novi->sled=NULL; if (! niz) niz=novi; else tekuci->sled=novi; tekuci=novi; } getchar(); return niz; } /* Ispisivanje liste */ void pisi (Elem *niz) { while (niz) {printf("%d ", niz->broj); niz=niz->sled;} } /* Brisanje cele liste */ void brisi (Elem *niz) { while (niz) {Elem *stari=niz; niz=niz->sled; free(stari);} } /* Izostavljanje zadatog broja */ Elem *izost (Elem *niz, int k) { Elem *preth=NULL, *tekuci=niz; while (tekuci) if (tekuci->broj != k) { preth=tekuci; tekuci=tekuci->sled; } else { Elem *stari=tekuci; tekuci=tekuci->sled; if (! preth) niz=tekuci; else preth->sled=tekuci; free(stari); } return niz; } /* Dodavanje jednog novog elementa na kraj liste */ void dodaj_kraj (Elem *niz) { Elem *tekuci=niz, *poslednji=NULL; int broj; while (tekuci) { poslednji=tekuci; tekuci=tekuci->sled; } Elem *novi=malloc(sizeof(Elem)); printf("Unesite broj za dodavanje na kraj liste: "); scanf("%d", &broj); novi->broj=broj; novi->sled=NULL; tekuci=novi; poslednji->sled=tekuci; } /* Dodavanje jednog novog elementa na pocetak liste */ Elem *dodaj_pocetak (Elem *niz) { int broj; Elem *novi=malloc(sizeof(Elem)); printf("Unesite broj za dodavanje na pocetak liste: "); scanf("%d", &broj); novi->broj=broj; novi->sled=niz; niz=novi; return niz; } /* Umetanje jednog elementa u neopadajuce uredjenu listu tako da lista i dalje ostane uredjena */ Elem *umetni (Elem *niz) { Elem *prethodni=NULL, *tekuci=niz, *naredni=niz->sled, *krajnji=niz; int broj; printf("Unesite broj koji zelite da umetnem u listu (paziti da lista mora da bude neopadajuce uredjena !): "); scanf("%d", &broj); Elem *novi=malloc(sizeof(Elem)); if (tekuci->sled != NULL && broj>tekuci->broj) { /* slucaj kada nije jedan elem. u listi ili kada broj za umetanje nije najmanji */ while (krajnji->sled) krajnji=krajnji->sled; if (brojbroj) /* standardni slucaj */ while (tekuci) if (broj>tekuci->broj) {prethodni=tekuci; tekuci=naredni; naredni=naredni->sled;} else { novi->broj=broj; novi->sled=tekuci; prethodni->sled=novi; break; /* Kad umetne neka prekine ! */ } else {novi->broj=broj; novi->sled=NULL; krajnji->sled=novi;} /* slucaj kada broj za umetanje treba da ide na kraj liste */ } else { /* slucaj liste sa samo jednim elementom i slucaj kada je uneti broj za umetanje manji od prvog u listi*/ if (broj>tekuci->broj) {novi->broj=broj; novi->sled=NULL; tekuci->sled=novi;} else {novi->broj=broj; novi->sled=tekuci; niz=novi;} } return niz; } /* Odredjivanje broja elemenata liste */ int izbroj (Elem *niz) { int n=0; Elem *tekuci=niz; while (tekuci) {n++; tekuci=tekuci->sled;} return n; } /* Izracunavanje zbira elemenata liste */ int saberi (Elem *niz) { int s=0; Elem *tekuci=niz; while (tekuci) {s+=tekuci->broj; tekuci=tekuci->sled;} return s; } /* Glavni program */ void main() { Elem *lista; while ((lista=citaj()) != NULL) { int k; printf("Ucitani niz = "); pisi(lista); putchar ('\n'); printf("Trenutni broj elemenata liste je %d\n", izbroj(lista)); printf("Trenutni zbir elemenata liste je %d", saberi(lista)); printf("\n"); lista=umetni(lista); printf("Novi niz = "); pisi (lista); printf("\n"); printf("Trenutni broj elemenata liste je %d\n", izbroj(lista)); printf("Trenutni zbir elemenata liste je %d\n", saberi(lista)); printf("Unesite broj koji zelite da izostavim iz liste: "); scanf("%d", &k); printf("Izostavlja se %d\n",k); printf("Novi niz = "); pisi (lista=izost(lista,k)); printf("\nTrenutni broj elemenata liste je %d\n", izbroj(lista)); printf("Trenutni zbir elemenata liste je %d", saberi(lista)); printf("\n"); dodaj_kraj (lista); printf("Novi niz = "); pisi (lista); printf("\nTrenutni broj elemenata liste je %d\n", izbroj(lista)); printf("Trenutni zbir elemenata liste je %d", saberi(lista)); printf("\n"); lista=dodaj_pocetak (lista); printf("Novi niz = "); pisi (lista); printf("\nTrenutni broj elemenata liste je %d\n", izbroj(lista)); printf("Trenutni zbir elemenata liste je %d\n", saberi(lista)); printf("\n"); brisi(lista); } putchar('\n'); }