#include #include /* Vezane liste - Primjer 7. Spajanje (konkatenacija) dvije liste. */ /* ======================================================================== */ /* 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 spoji_dvije(lista prvi_1, lista prvi_2) { lista pom; /* Ako je prva lista prazna, rezultat je druga lista. */ if (prvi_1 == NULL) return prvi_2; /* Nadji zadnjeg u prvoj i spoji drugu listu na njega. */ for (pom = prvi_1; pom->sljed != NULL; pom = pom->sljed); pom->sljed = prvi_2; return prvi_1; } /* ======================================================================== */ /* Ispod su funkcije za osnovne operacije s listama. */ /* ======================================================================== */ lista kreiraj_straga(lista prvi, lista *p_zadnji, int broj) { /* Vraca zadnji kroz varijabilni argument - pokazivac p_zadnji. */ lista zadnji = *p_zadnji; 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; if (prvi == NULL) prvi = novi; else zadnji->sljed = novi; /* Ne treba: zadnji = novi; *p_zadnji = zadnji; */ *p_zadnji = novi; /* Vrati novi zadnji! */ 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; } /* ======================================================================== */ int main(void) { lista prvi_1 = NULL; /* Prazna lista! */ lista prvi_2 = NULL; /* Prazna lista! */ lista zadnji_1, zadnji_2; lista prvi; int broj; /* Punjenje prve liste straga. */ /* Citanje niza brojeva za listu, do broj = 0. To je oznaka kraj niza, ali nije clan niza. */ /* Poredak brojeva u listi je isti kao redoslijed citanja, jer dodajemo na kraj liste. */ printf("Upisite niz cijelih brojeva (0 = kraj).\n"); do { printf("Sljedeci broj:\n"); scanf("%d", &broj); if (broj != 0) prvi_1 = kreiraj_straga(prvi_1, &zadnji_1, broj); } while (broj != 0); /* Punjenje druge liste straga. */ /* Citanje niza brojeva za listu, do broj = 0. To je oznaka kraj niza, ali nije clan niza. */ /* Poredak brojeva u listi je isti kao redoslijed citanja, jer dodajemo na kraj liste. */ printf("\n"); printf("Upisite niz cijelih brojeva (0 = kraj).\n"); do { printf("Sljedeci broj:\n"); scanf("%d", &broj); if (broj != 0) prvi_2 = kreiraj_straga(prvi_2, &zadnji_2, broj); } while (broj != 0); /* Prva lista: ispis broja elemenata i cijele liste. */ printf("\n Prva lista:\n"); printf(" Broj elemenata u listi = %d\n", broj_elemenata(prvi_1)); ispisi_listu(prvi_1); /* Druga lista: ispis broja elemenata i cijele liste. */ printf("\n Druga lista:\n"); printf(" Broj elemenata u listi = %d\n", broj_elemenata(prvi_2)); ispisi_listu(prvi_2); /* Konkatenacija dvije liste. */ prvi = spoji_dvije(prvi_1, prvi_2); /* Spojena lista: ispis broja elemenata i cijele liste. */ printf("\n Spojena lista:\n"); printf(" Broj elemenata u listi = %d\n", broj_elemenata(prvi)); ispisi_listu(prvi); /* Obrisi cijelu listu. */ prvi = obrisi_listu(prvi); return 0; }