Download as pdf or txt
Download as pdf or txt
You are on page 1of 8

JEDNOSTRUKO POVEZANE KRUNE LISTE

Jednostruko povezane krune liste predstavljaju jednu modifikaciju


jednostruko povezanih lista koje obezbeuju dodatnu pogodnost prilikom obilaska
elemenata u listi (videti Sliku 1). Naime, kruna lista, koja moe, u optem sluaju,
biti jednostruko ili dvostruko povezana, se odlikuje time da nema rep, ve pokaziva
poslednjeg vora u listi koji pokazuje na sledei vor liste pokazuje na prvi vor u listi
umesto da mu se dodeli vrednost NULL (ako se radi o dvostruko povezanim listama
tada mora i pokaziva prvog elementa u listi koji pokazuje na prethodni element da
pokazuje na poslednji element u listi ovakva lista se jo naziva i prsten i o njoj emo
govoriti kasnije).
HEAD

Podatak

...

Pokaziva

Slika 1: Elementi povezani tako da ine krunu listu


U sluaju da je kruna lista, prazna lista, ona treba da bude povezana tako da
prvi vor liste pokazuje na samog sebe.U nastavku dajemo kd u programskom jeziku
C za kreiranje i tampanje vorova povezane liste.
# include <stdio.h>
# include <stdlib.h>
struct node
{
int data;
struct node *link;
};
struct node *insert(struct node *p, int n)
{
struct node *temp;
/* Ako je postojeca lista prazna, tada novi cvor postavljamo kao
pocetni */
if(p==NULL)
{
p=(struct node *)malloc(sizeof(struct node));
if(p==NULL)
{
printf("Greska\n");
exit(0);
}
p-> data = n;
p-> link = p; /* Stavljamo da pokazivac pokazuje na sebe
jer se radi o povezanoj listi */
}
else
{
temp = p;

Jednostruko povezane krune liste


/* U sluaju da u listi vec ima elemenata prolazimo kroz postojecu
listu, ali se u ovom sluaju zaustavljamo kada dodjemo do cvora koji
pokazuje na prvi cvor liste tj. do poslednjeg u listi */
while (temp-> link != p) temp = temp-> link;
temp-> link = (struct node *)malloc(sizeof(struct node));
if(temp -> link == NULL)
{
printf("Greska\n");
exit(0);
}
temp = temp-> link;
temp-> data = n;
temp-> link = p;
}
return (p);
}
void printlist ( struct node *p )
{
struct node *temp;
temp = p;
printf(" Podaci u listi su \n");
if(p!= NULL)
{
do
{
printf(%d\t",temp->data);
temp=temp->link;
} while (temp!= p)
}
else
printf(" Lista je prazna \n");
}
void main()
{
int n;
int x;
struct node *start = NULL ;
printf(" Uneti broj cvorova liste koje treba kreirati \n");
scanf("%d",&n);
while ( n- > 0 )
{
printf( " Unesite podatak koji se smesta u cvor \n");
scanf("%d",&x);
start = insert ( start, x );
}
printf(" Kreirana lista je \n");
printlist ( start );
}

Objanjenja
Ovaj program dodaje novi vor u postojeu listu tj. ubacuje novi vor na njen
kraj i postavlja polje pokazivaa novoubaenog vora da pokazuje na prvi lan liste.
Na ovaj nain postiemo da poslednji vor liste obavezno ukazuje na poetak liste.

Tehniki fakultet u aku

Predmet: STRUKTURE PODATAKA

Jednostruko povezane krune liste


DELJENJE LISTE SA 2N VOROVA NA DVE LISTE SA PODJEDNAKIM BROJEM
VOROVA
# include <stdio.h>
# include <stdlib.h>
struct node
{
int data;
struct node *link;
};
void split(struct node *p, struct node **q, int n)
{
struct node *temp;
int i = 1;
temp = p;
while( i < n)
{
temp = temp->link;
i++;
} /* Dolazi se do n-tog cvora */
*q = temp->link; /* Uvodi se pokazivac q na preostali deo liste
koji postaje druga lista */
temp->link = p; /* Kako je n-ti cvor sada poslednji u novoj
(prvoj) listi on mora pokazivati na pocetak liste */
temp = *q;
while(temp->link != p)
temp = temp ->link;
temp->link = *q; /* Poslednji element iz stare liste se
postavlja da pokazuje na (n+1). cvor stare liste tj. na prvi cvor
nove (druge) liste */
}
struct node *insert(struct node *p, int n)
{
struct node *temp;
if(p==NULL)
{
p=(struct node *)malloc(sizeof(struct node));
if(p==NULL)
{
printf("Greska\n");
exit(0);
}
p-> data = n;
p-> link = p;
}
else
{
temp = p;
while (temp-> link != p)
temp = temp-> link;
temp-> link = (struct node *)malloc(sizeof(struct node));
if(temp -> link == NULL)
{
printf("Greska\n");
exit(0);
}
temp = temp-> link;
temp-> data = n;
temp-> link = p;
}

Tehniki fakultet u aku

Predmet: STRUKTURE PODATAKA

Jednostruko povezane krune liste


return (p);
}
void printlist ( struct node *p )
{
struct node *temp;
temp = p;
printf(" Podaci u listi su \n");
if(p!= NULL)
do
{
printf("%d\t",temp->data);
temp=temp->link;
} while (temp!= p);
else
printf(" Lista je prazna \n");
}
void main()
{
int n,num;
int x;
struct node *start = NULL ;
struct node *start1 = NULL;
printf(" Uneti vrednost za n \n");
scanf("%d",&n);
num = n;
n*=2;
/* Na ovaj nacin kreiramo kruznu listu sa 2n clanova */
while ( n-- > 0 )
{
printf( " Unesite podatak koji se smesta u cvor \n");
scanf("%d",&x);
start = insert ( start, x );
}
printf(" Kreirana lista je \n");
printlist ( start );
split(start,&start1,num);
printf(" Prva lista je :\n");
printlist(start);
printf(" Druga lista :\n");
printlist(start1);
}

Objanjenja
Da bismo razdvojili listu od 2n vorova na dva jednaka dela potrebno proi
kroz nju sve dok se ne stigne do n-tog vora (polovine). Tada uvodimo novi
pokaziva, koji je definisan kao pokaziva na pokazivaku strukturu da bio oznaio
poetak nove (druge) liste koja poinje od (n+1). vora. Nakon toga, n-ti vor se
nameta da pokazuje na prvi vor liste, a kod druge liste koja poinje od (n+1). vora
se nameta da poslednji vor stare liste pokazuje na njega, koji je sada prvi vor druge
liste. Na ovaj nain su od stare liste duine 2n, napravljene dve nove krune liste
podjednake duine. Funkcija split se moe, svakako, koristiti i za proizvoljno
razdvajanje liste na dva dela. U tom sluaju, potrebno je zadati broj vora iza koga se
eli razdvajanje (u programu, tada, treba voditi rauna da taj broj nije vei od duine
same liste).

Tehniki fakultet u aku

Predmet: STRUKTURE PODATAKA

Jednostruko povezane krune liste


SPAJANJE DVE KRUNE LISTE

# include <stdio.h>
# include <stdlib.h>
struct node
{
int data;
struct node *link;
};
struct node *insert(struct node *p, int n)
{
struct node *temp;
if(p==NULL)
{
p=(struct node *)malloc(sizeof(struct node));
if(p==NULL)
{
printf(" Greska \n");
exit(0);
}
p-> data = n;
p-> link = p;
}
else
{
temp = p;
while (temp-> link != p)
temp = temp-> link;
temp-> link = (struct node *)malloc(sizeof(struct node));
if(temp -> link == NULL)
{
printf(" Greska \n");
exit(0);
}
temp = temp-> link;
temp-> data = n;
temp-> link = p;
}
return (p);
}
void printlist ( struct node *p )
{
struct node *temp;
temp = p;
printf(" Podaci u listi su \n");
if(p!= NULL)
{
do
{
printf("%d\t",temp->data);
temp=temp->link;
} while (temp!= p);
}
else
printf(" Lista je prazna \n");
}
struct node *merge(struct node *p, struct node *q)
{
struct node *temp=NULL;
struct node *r=NULL;

Tehniki fakultet u aku

Predmet: STRUKTURE PODATAKA

Jednostruko povezane krune liste


r = p;
temp = p;
while(temp->link != p)
temp = temp->link;
temp->link = q;
temp = q;
while( temp->link != q)
temp = temp->link;
temp->link = r;
return(r);
}
void main()
{
int n;
int x;
struct node *start1=NULL ;
struct node *start2=NULL;
struct node *start3=NULL;
/* Ovde kreiramo prvu kruznu listu */
printf(" Uneti broj cvorova prve liste \n");
scanf("%d",&n);
while ( n-- > 0 )
{
printf( " Unesite podatak koji se smesta u cvor \n");
scanf("%d",&x);
start1 = insert ( start1, x );
}
printf(" Prva lista je \n");
printlist ( start1 );
/* Ovde kreiramo drugu kruznu listu */
printf(" Uneti broj cvorova druge liste \n");
scanf("%d",&n);
while ( n-- > 0 )
{
printf( " Podaci u prvoj listi su \n");
scanf("%d",&x);
start2 = insert ( start2, x );
}
printf(" Prva lista je \n");
printlist ( start2 );
start3 = merge(start1,start2);
printf(" Nova, spojena lista je :\n");
printlist(start3);
}

Objanjenja
Da bismo spojili ili nastavili jednu krunu listu na drugu, sa pokazivaima p i
q tim redom, potrebno je najpre postaviti da je pokaziva na novu listu pokaziva p.
Dalje, prolazimo kroz listu p sve dok ne stignemo do njenog kraja i tada polje
pokazivaa poslednjeg vora postaje pokaziva q. Nakon toga, se prolazi kroz listu q
sve dok se ne doe do njenog kraja, a nakon toga se polje pokazivaa poslednjeg
vora iz liste q postavlja da pokazuje na poetak liste tj. na pokaziva p.

Tehniki fakultet u aku

Predmet: STRUKTURE PODATAKA

Jednostruko povezane krune liste


OKRETANJE KRUNE LISTE
# include <stdio.h>
# include <stdlib.h>
struct node
{
int data;
struct node *link;
};
/* Funkcija koja okree kruznu listu */
struct node *reverselist(struct node *p)
{
struct node *temp;
struct node *prev = NULL;
struct node *curr;
curr = p;
temp = curr;
while(curr->link != p)
{
curr = curr->link;
temp ->link = prev;
prev = temp;
temp = curr;
}
temp ->link = prev;
p->link = temp;
p= temp;
}
return(p);
}
struct node *insert(struct node *p, int n)
{
struct node *temp;
if(p==NULL)
{
p=(struct node *)malloc(sizeof(struct node));
if(p==NULL)
{
printf(" Greska \n");
exit(0);
}
p-> data = n;
p-> link = p
}
else
{
temp = p;
while (temp-> link != p)
temp = temp-> link;
temp-> link = (struct node *)malloc(sizeof(struct node));
if(temp -> link == NULL)
{
printf(" Greska \n");
exit(0);
}
temp = temp-> link;
temp-> data = n;
temp-> link = p;
}

Tehniki fakultet u aku

Predmet: STRUKTURE PODATAKA

Jednostruko povezane krune liste


return (p);
}
void printlist ( struct node *p )
{
struct node *temp;
temp = p;
printf(" Podaci u listi su \n");
if(p!= NULL)
{
do
{
printf("%d\t",temp->data);
temp=temp->link;
} while (temp!= p);
}
else
printf(" Lista je prazna \n");
}
void main()
{
int n;
int x;
struct node *start = NULL ;
struct node *start1=NULL;
printf("Uneti broj cvorova liste koju treba kreirati \n");
scanf("%d",&n);
while ( n-- > 0 )
{
printf( " Unesite podatak koji se smesta u cvor \n");
scanf("%d",&x);
start = insert ( start, x );
}
printf(" Lista je \n");
printlist ( start );
start1 = reverselist(start);
printf(" Okrenuta lista je: \n");
printlist(start1);
}

Objanjenja
Princip izvravanja funkcije reverselist je veoma slian kao i funkcije
reverse koju smo pominjali kod jednostruko povezanih lista, s tim to u ovom
sluaju dodatno treba voditi rauna da poslednji lan ne pokazuje na NULL, ve na
prvi lan liste.

Tehniki fakultet u aku

Predmet: STRUKTURE PODATAKA

You might also like