Stabla 1 dio dr Dra ž en Br đanin bdrazenetfblnet Goran Banjac goranbanjacetfblnet Danijela Zoran danijelazoranetfblnet Aleksandar Keleč aleksandarkelecetfblnet ID: 791276
Download The PPT/PDF document "PROGRAMIRANJE II A 10 –" is the property of its rightful owner. Permission is granted to download and print the materials on this web site for personal, non-commercial use only, and to display it on your personal computer provided you do not modify the materials and that you retain all copyright notices contained in the materials. By downloading content from our website, you accept the terms of this agreement.
Slide1
PROGRAMIRANJE II
A10 – Stabla (1. dio)
dr Dražen Brđanin (bdrazen@etfbl.net)Goran Banjac (goran.banjac@etfbl.net)Danijela Zoran (danijela.zoran@etfbl.net)Aleksandar Keleč (aleksandar.kelec@etfbl.net)
201
5
.
Slide2STABLA BINARNOG PRETRA
ŽIVANJAStabla (1. dio)
2A10Napisati program u
kojem
treba
:
d
efinisati
tip
CVOR
kojim
se
reprezentuje
čvor stabla binarnog pretraživanja (informacioni sadržaj treba da bude cijeli broj),
definisati funkciju koja dodaje novi čvor u stablo,
definisati
funkciju
koja
pronalazi
najmanji
čvor u stablu,
definisati
funkciju
koja
pronalazi
naj
veći
čvor u stablu,
definisati funkciju koja briše zadati čvor iz stabla,
definisati funkciju koja briše stablo,
definisati funkciju koja omogućava pretraživanje stabla,
definisati funkciju koja ispisuje sadržaj stabla u
preorder
redoslijedu obilaska,
definisati funkciju koja ispisuje sadržaj stabla u
inorder
redoslijedu obilaska,
definisati funkciju koja ispisuje sadržaj stabla u
postorder
redoslijedu obilaska,
u glavnom programu ilustrovati rad sa
stablom binarnog pretraživanja
tj. definisanim funkcijama.
Slide3STABLA BINARNOG PRETRA
ŽIVANJAStabla (1. dio)
3A10#include
<
stdio.h
>
#include
<
stdlib.h
>
typedef
struct cvor { int podatak; struct cvor *lijevi, *desni; } CVOR;CVOR *formiraj_cvor(int podatak){ CVOR *novi = (CVOR*)malloc(sizeof(CVOR)); novi->lijevi = novi->desni = 0; novi->podatak = podatak; return novi;}
void brisi_stablo(CVOR* korijen){ if (korijen != 0) { brisi_stablo(korijen->lijevi); brisi_stablo(korijen->desni); free(korijen); }}
CVOR
*dodaj_cvor(
CVOR
*
korijen
,
int
podatak
)
{
if
(
korijen
== 0)
return
formiraj_cvor(
podatak
);
if
(
podatak
<=
korijen
->podatak)
korijen
->lijevi = dodaj_cvor(
korijen
->lijevi,
podatak
);
else
korijen
->desni = dodaj_cvor(
korijen
->desni,
podatak
);
return
korijen
;
}
Slide4STABLA BINARNOG PRETRA
ŽIVANJAStabla (1. dio)
4A10CVOR
* trazi(
CVOR
*
korijen
,
int
podatak
)
{
if (korijen == 0) return 0; else if (podatak == korijen->podatak) return korijen; else if (podatak <= korijen->podatak) return trazi(korijen->lijevi, podatak); else return trazi(korijen
->desni, podatak);}void pisi_inorder(CVOR* korijen){ if (korijen != 0) { pisi_inorder(korijen->lijevi); printf("%d ", korijen->podatak);
pisi_inorder(
korijen
->desni);
}
}
void
pisi_preorder(CVOR* korijen){ if (korijen != 0) { printf("%d ", korijen->podatak); pisi_preorder(korijen->lijevi); pisi_preorder(korijen->desni); }}
void pisi_postorder(CVOR* korijen){ if (korijen != 0) { pisi_postorder(korijen->lijevi); pisi_postorder(korijen->desni); printf("%d ", korijen->podatak); }}
CVOR* trazi_najveci(CVOR* korijen){ while (korijen->desni != 0) korijen = korijen->desni; return korijen;}
CVOR
* trazi_najmanji(
CVOR
*
korijen
)
{
while
(
korijen
->lijevi != 0)
korijen
=
korijen
->lijevi;
return
korijen
;
}
Slide5STABLA BINARNOG PRETRA
ŽIVANJAStabla (1. dio)
5A10CVOR
* brisi_cvor(
CVOR
*
korijen
,
int
podatak
)
{ if (korijen == 0) return 0; else if (podatak < korijen->podatak) korijen->lijevi = brisi_cvor(korijen->lijevi, podatak); else if (podatak > korijen->podatak) korijen->desni = brisi_cvor(korijen->desni, podatak); else if (korijen->lijevi == 0)
{ CVOR *p = korijen->desni; free(korijen); return p; } else if (korijen->desni == 0) { CVOR *p = korijen->lijevi; free(
korijen
);
return
p;
}
else { CVOR *p = trazi_najveci(korijen->lijevi); korijen->podatak = p->podatak; korijen->lijevi = brisi_cvor(korijen->lijevi, korijen->podatak); } return korijen;}
Slide6STABLA BINARNOG PRETRA
ŽIVANJAStabla (1. dio)
6A10int
main()
{
CVOR
*korijen = 0;
int
br, i;
int
niz[] = { 50, 30, 40, 20, 10, 70, 60, 80, 90 }; for (i=0; i<9; i++) korijen = dodaj_cvor(korijen, niz[i]); printf("Preorder: "); pisi_preorder(korijen); printf("\nInorder: "); pisi_inorder(korijen); printf("\nPostorder: "); pisi_postorder(korijen); printf("\nUnesite broj za pretragu: "); scanf("%d", &br); printf("Broj %d %spostoji u stablu.\n", br, trazi(korijen, br) ? "" : "ne ");
printf("Unesite broj za brisanje: "); scanf("%d", &br); korijen = brisi_cvor(korijen, br); printf("Inorder (nakon brisanja): "); pisi_inorder(korijen); brisi_stablo(korijen); return 0;
}
Preorder: 50 30 20 10 40 70 60 80 90
Inorder
: 10 20 30 40 50 60 70 80 90
Postorder
: 10 20 40 30 60 90 80 70 50
Unesite
broj za pretragu: 20Broj 20 postoji u stablu.Unesite broj za brisanje: 30Inorder (nakon brisanja): 10 20 40 50 60 70 80 90
Slide7STABLA BINARNOG PRETRA
ŽIVANJAStabla (1. dio)
7A10Napisati program u
kojem
treba
:
definisati tip ARTIKAL kojim se reprezentuje artikal čiji su atributi: šifra (cijeli broj u opsegu 00000-99999, koji se uvijek ispisuje kao 5-cifreni podatak), naziv, količina i cijena,
definisati tip CVOR kojim se reprezentuje čvor
stabla
binarnog
pretraživanja,definisati funkciju koja dodaje podatke o novom artiklu u stablo tako da je kriterijum pri dodavanju novog čvora u stablo šifra artikla,definisati funkciju koja omogućava pretraživanje stabla po šifri artikla,definisati funkciju koja formatirano ispisuje podatke o svim artiklima,definisati funkciju koja omogućava brisanje podataka o artiklu po šifri,definisati funkciju koja briše stablo,definisati funkciju koja omogućava učitavanje podataka o artiklu,u glavnom programu prikazivati meni prema kojem korisnik može da vrši:dodavanje podataka o novom artiklu,ažuriranje podataka,brisanje podataka,prikaz podataka o svim artiklima,pretraživanje podataka po šifri.
Slide8STABLA BINARNOG PRETRA
ŽIVANJAStabla (1. dio)
8A10#include
<
stdio.h
>
#include
<
stdlib.h
>
typedef
struct { int sifra; char naziv[21]; double kol, cijena; } ARTIKAL;typedef struct cvor {ARTIKAL art; struct cvor *lijevi, *desni; } CVOR;static
int rb = 1;CVOR *formiraj_cvor(ARTIKAL *art) { CVOR *novi = (CVOR*)malloc(sizeof(CVOR)); novi->lijevi = novi->desni = 0; novi->art = *art; return novi;}
void
brisi_stablo(
CVOR
*
korijen
)
{ if (korijen != 0) { brisi_stablo(korijen->lijevi); brisi_stablo(korijen->desni); free(korijen); }}void citaj(ARTIKAL *art)
{ printf(" Sifra: "); scanf("%d", &art->sifra); printf(" Naziv: "); scanf("%s", art->naziv); printf(" Kolicina: "); scanf("%lf", &art->kol); printf(
" Cijena: "); scanf("%lf", &art->cijena);}CVOR *dodaj_cvor(CVOR *korijen, ARTIKAL *art){ if (
korijen
== 0)
return
formiraj_cvor(
art
);
if
(
art
->sifra <=
korijen
->art.sifra)
korijen
->lijevi = dodaj_cvor(
korijen
->lijevi,
art
);
else
korijen
->desni = dodaj_cvor(
korijen
->desni,
art
);
return
korijen
;
}
Slide9STABLA BINARNOG PRETRA
ŽIVANJAStabla (1. dio)
9A10CVOR
* trazi(
CVOR
*
korijen
,
int
sifra
)
{ if (korijen == 0) return 0; else if (sifra == korijen->art.sifra) return korijen; else if (sifra <= korijen->art.sifra) return trazi(korijen->lijevi, sifra); else return trazi(korijen->desni, sifra
);}void pisi_inorder(CVOR* korijen) { if (korijen != 0) { pisi_inorder(korijen->lijevi); printf("%2d. %05d %-20s %6.2lf %6.2lf %6.2lf\n", rb++, korijen
->art.sifra,
korijen
->art.naziv,
korijen
->art.kol,
korijen
->art.cijena,
korijen->art.kol*korijen->art.cijena); pisi_inorder(korijen->desni); }}void pisi(CVOR *korijen) { printf("--- ----- -------------------- ------ ------ ------\n"); printf("RB. SIFRA NAZIV KOL. CIJENA UKUPNO\n");
printf("--- ----- -------------------- ------ ------ ------\n"); rb = 1; pisi_inorder(korijen);}
Slide10STABLA BINARNOG PRETRA
ŽIVANJAStabla (1. dio)
10A10CVOR
* brisi_cvor(
CVOR
*
korijen
,
int
sifra
)
{ if (korijen == 0) return 0; else if (sifra < korijen->art.sifra) korijen->lijevi = brisi_cvor(korijen->lijevi, sifra); else if (sifra > korijen->art.sifra) korijen->desni = brisi_cvor(korijen->desni, sifra); else if (korijen->lijevi == 0) {
CVOR *p = korijen->desni; free(korijen); return p; } else if (korijen->desni == 0) { CVOR *p = korijen->lijevi; free(korijen);
return
p;
}
else
{ CVOR *p = trazi_najveci(korijen->lijevi); korijen->art = p->art; korijen->lijevi = brisi_cvor(korijen->lijevi, korijen->art.sifra); } return korijen;}
CVOR* trazi_najveci(CVOR* korijen){ while (korijen->desni != 0) korijen = korijen->desni; return korijen;}
Slide11STABLA BINARNOG PRETRA
ŽIVANJAStabla (1. dio)
11A10int
main()
{
CVOR
*korijen = 0;
char
c;
int sifra; ARTIKAL art; do { printf("======================================================================\n"); printf("Dodavanje/azur. [D], brisanje [B], prikaz [P], pretr. [T], kraj [0]? "); scanf("\n%c", &c); if (c == 'D') { printf(" Unesite podatke:\n"); citaj(&art); CVOR *p = trazi(korijen, art.sifra); if (p) p->art = art; else korijen = dodaj_cvor(korijen, &art);
} else if (c == 'B') { printf(" Sifra: "); scanf("%d", &sifra); korijen = brisi_cvor(korijen, sifra); } else if (c == 'P') pisi(korijen);
else
if
(c ==
'T'
)
{ printf(" Sifra: "); scanf("%d", &sifra); CVOR *p = trazi(korijen, sifra); if (p) printf(" Artikal %s ima cijenu %.2lf\n", p->art.naziv, p->art.cijena); else printf(" Nema podataka o artiklu sa sifrom %d.\n", sifra); } else if (c != '0') printf(
" Nepoznata opcija - '%c'.\n", c); } while (c != '0'); brisi_stablo(korijen); printf("KRAJ!\n"); return 0;}======================================================================Dodavanje/azur. [D], brisanje [B], prikaz [P], pretr. [T], kraj [0]? D Unesite podatke: Sifra: 10
Naziv: Banane Kolicina: 2 Cijena: 1.5======================================================================Dodavanje/azur. [D], brisanje [B], prikaz [P], pretr. [T], kraj [0]? D Unesite podatke: Sifra: 20
Naziv
:
Jabuke
Kolicina
:
3
Cijena
:
1.2
======================================================================
Dodavanje/azur. [D], brisanje [B], prikaz [P], pretr. [T], kraj [0]?
P
--- ----- -------------------- ------ ------ ------
RB. SIFRA NAZIV KOL. CIJENA UKUPNO
--- ----- -------------------- ------ ------ ------
1. 00010 Banane 2.00 1.50 3.00
2. 00020 Jabuke 3.00 1.20 3.60
======================================================================
Dodavanje/azur. [D], brisanje [B], prikaz [P], pretr. [T], kraj [0]?
0
KRAJ!
Slide12ZADACI ZA VJEŽBU
Stabla (1. dio)
12A10Napisati
program
koji simulira pretragu rječnika. Rječnik je potre
b
no realizovati u vidu stabla binarnog pretraživanja, pri čemu informacioni sadržaj čvora treba da bude jedna riječ. Pored toga, u programu treba
:
definisati
tip
CVOR
kojim
se reprezentuje čvor stabla binarnog pretraživanja,definisati funkciju koja dodaje novu riječ u rječnik,definisati funkciju koja omogućava pretraživanje stabla po unesenoj riječi,definisati funkciju koja formatirano ispisuje sve riječi iz rječnika,definisati funkciju
koja omogućava brisanje riječi iz rječnika,definisati funkciju koja briše stablo,u glavnom programu prikazivati meni prema kojem korisnik može da
vrši
:
dodavanje
nove riječi u rječnik
,
ažuriranje rječnika,brisanje riječi iz rječnika,prikaz rječnika,pretraživanje rječnika.