Vezane liste Vezana lista je dinamika struktura podataka


















- Slides: 18

Vezane liste

Vezana lista je dinamička struktura podataka koja predstavlja niz elemenata. Razlike između liste i niza: ◦ U nizu se elementima pristupa izravno, preko indeksa, dok se elementima vezane liste pristupa slijedno ◦ Nizu mora broj elemenata biti zadan prije korištenja polja, dok se broj elemenata vezane liste dinamički mijenja

Vezana lista Svaki element liste mora imati barem dva podatka: ◦ Sadržaj ◦ Veza na drugi element liste Osnovni element liste je struktura. Vezanu listu čini slijed struktura povezan pokazivačima Pokazivač na strukturu definira se isto kao i pokazivač na druge tipove podataka.

Primjer. struct tocka { int x; int y; } t, *p = &t; Varijabla p je pokazivač na strukturu struct tocka, inicijaliziran adresom strukture t.

Pokazivač na strukturu Kad imamo pokazivač na neku strukturu, članovima te strukture može se individualno pristupiti korištenjem primarnog operatora strelica ( *p. x ili p -> x; struct tocka { int x; int y; } t, *p = &t; ->).

Pokazivač na varijablu nekog tipa smije biti član strukture. To omogućava “povezivanje” varijabli razno–raznih tipova, ovisno o tipu pokazivača. Dozvoljeno je da pokazivač, koji je član strukture, “pokazuje” na istu takvu strukturu, tj. da struktura sadrži pokazivač na “samu sebe”. Takve strukture imaju i svoje posebno ime.

Samoreferencirajuća struktura Struktura koja sadrži jedan ili više članova koji su pokazivači na strukturu tog istog tipa, zove se samoreferencirajuća struktura (jer sadrži “pointer na samu sebe”). Upravo ovakve “rekurzivno vezane” strukture su glavna korist od pokazivača kao članova strukture. One omogućavaju “povezivanje” objekata istog tipa — na razne načine, ovisno o broju i svrsi pokazivača. Služe za implementaciju “rekurzivno” definiranih složenih tipova podataka — kao što su: ◦ vezane liste i ◦ binarna stabla.

Kako izgledaju takve “rekurzivno vezane” strukture i kako se deklariraju? Svaki element takve strukture ima dva bitna dijela: ◦ nekakav “koristan” sadržaj — jedan ili više članova nekih tipova, ◦ jedan ili više pokazivača na isti takav element. Članovi strukture koji sadrže pokazivače obično imaju standardna imena koja sugeriraju značenje pokazivača. Pogledajmo kako izgledaju elementi vezane liste: struct element {int x; struct element *veza; }el; x

Element vezane liste, osim sadržaja, - (varijabla x) ima još jedan pokazivač na takav element — kojeg interpretiramo kao pokazivač na sljedeći element u listi. “Standardna imena” za pripadni član strukture su veza, slijed, next, link. Početni element zovemo glava, prvi, first, head

Zadavanje vezane liste Lista je u početku prazna, tj. ima nula elemenata. Listu zadajemo tako da pokazivaču na prvi element pridružujemo vrijednost NULL. Dakle, u početku lista izgleda ovako: prvi struct element {int x; struct element *veza; } el, *prvi=NULL; NULL

Kreirana vezana lista ZAPAMTI! lista se zadaje pokazivačem na prvi element — ovdje je to prvi, svaki element ima pokazivač na sljedeći element u listi, taj pokazivač (član veza) možemo interpretirati i kao listu sljedbenika tog elementa, zadnji element u listi ima praznu listu sljedbenika, tj. njegov sljedbenik je NULL.

Dinamičko alociranje memorije

Dinamičko alociranje memorije Postupak kojim se raspolaže sa slobodnom memorijom dio slobodne memorije se dodjeljuje korisničkom programu, Nadzor nad korištenjem slobodne memorije vrši operativni sustav. U samom C-jeziku nije implementirana mogućnost direktnog raspolaganja slobodnom memorijom. Ipak se u C-jeziku, uz pomoć pokazivača i funkcija biblioteke: malloc, calloc, realloc i free, pronašla mogućnost da se na indirektan način koristi slobodna memorija.

Rezervacija (alokacija) memorije Vezana lista i sve slične strukture su idealne za: ◦ dinamičku promjenu veza među elementima, ◦ dodavanje novih i izbacivanje postojećih elemenata. Zato se elementi takvih struktura uvijek kreiraju dinamičkom alokacijom memorije. prvi = (struct element*) malloc(sizeof(element)); if (prvi == NULL) { printf("Alokacija nije uspjela. n"); exit(-1); } prvi->x = 5; prvi->veza= NULL;

Operacije s vezanim listama Osnovne operacije nad vezanom listom su: ◦ kreiranje elemenata, ◦ dodavanje novog elementa u listu, ◦ brojanje elemenata liste, ◦ ispis liste, ◦ pretraživanje liste (prolaz kroz listu), ◦ izbacivanje ili brisanje elementa iz liste, ◦ spajanje (konkatenacija) dvije liste, ◦ sortiranje liste.

Primjer. Kreiraj element liste #include<stdio. h> #include<conio. h> #include<stdlib. h> struct element {int x; struct element *veza; }*p; main() { p=(struct element*)malloc(sizeof(struct element)); if (p == NULL) { printf("Alokacija nije uspjela. n"); exit(-1); } } scanf("%d", &p->x); //ispis printf("%d ", p->x); getch();

Primjer. Napravi listu 3 cijela broja. #include<stdio. h> uct element)); #include<conio. h> scanf("%d", &p->x); #include<stdlib. h> p->veza=glava; struct element glava=p; } {int x; struct element //ispis *veza; p=glava; }*p, *glava=NULL; while(p!=NULL) int i; {printf("%d ", p->x); main() p=p->veza; } { getch(); for(i=1; i<=3; i++) } {p=(struct element*)malloc(sizeof(str

Primjer. Napraviti listu od 10 cijelih brojeva. Ispisati najmanji element u listi. Ispisati samo parne elemente u listi. Svaki element liste pomnožiti s 2.