Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
kakt00s Forumaš(ica)
Pridružen/a: 17. 10. 2007. (12:19:40) Postovi: (183)16
Spol:
Lokacija: :ɐɾıɔɐʞoן
|
|
[Vrh] |
|
Milojko Forumaš(ica)
Pridružen/a: 07. 11. 2008. (14:57:52) Postovi: (453)16
Spol:
Lokacija: Hilbertov hotel
|
Postano: 4:04 uto, 9. 11. 2010 Naslov: |
|
|
@Bole13:
nisam skužio točno pitanje. Što te zanima, jesu to jedine operacije koje će bit promatrane ili?
@nike:
jel nije niz manje-više ekvivalentan pojam pojmu polje?
ak ga prikažeš ko što je u skripti, onda je obilazak takav da ispisuješ samo čvorove gdje je na 2i+2 nul znak
@eve:
sscanf i sprintf su bolji za učitavanje/pisanje iz/u string. atoi je ok funkcija, ali itoa zna predstavljat poteškoće. Ak ti ništ ne piše u zadatku o načinu učitavanja, onda možeš pretpostaviti na primjer da se učitava sa razmacima između svaka dva znaka izraza ili tako nešto. Sve što nije izričito definirano možeš si prilagodit
@kakt00s:
NULL ti označava da na tom mjestu u stablu čvor nema dijete. time ti je stablo zadano na jedinstveni način, funkcija sagradi iz mog prošlog posta radi točno to što trebaš. naravno, moraš strcmp-at ulazne podatke sa NULL (opet, ovdje nije zadano kako će ti podaci biti uneseni. Ti možeš reći da će korisnik unositi string za stringom dok se ne unese čitavo stablo, da će svoj unos napisati u neku datoteku pa ćeš onda čitati iz nje, da će u main-u upisati niz stringova pa ćeš prema njima graditi stablo. Mislim da je najlakše da korisnika pitaš sa scanfom unutar sagradi)
@Bole13:
nisam skužio točno pitanje. Što te zanima, jesu to jedine operacije koje će bit promatrane ili?
@nike:
jel nije niz manje-više ekvivalentan pojam pojmu polje?
ak ga prikažeš ko što je u skripti, onda je obilazak takav da ispisuješ samo čvorove gdje je na 2i+2 nul znak
@eve:
sscanf i sprintf su bolji za učitavanje/pisanje iz/u string. atoi je ok funkcija, ali itoa zna predstavljat poteškoće. Ak ti ništ ne piše u zadatku o načinu učitavanja, onda možeš pretpostaviti na primjer da se učitava sa razmacima između svaka dva znaka izraza ili tako nešto. Sve što nije izričito definirano možeš si prilagodit
@kakt00s:
NULL ti označava da na tom mjestu u stablu čvor nema dijete. time ti je stablo zadano na jedinstveni način, funkcija sagradi iz mog prošlog posta radi točno to što trebaš. naravno, moraš strcmp-at ulazne podatke sa NULL (opet, ovdje nije zadano kako će ti podaci biti uneseni. Ti možeš reći da će korisnik unositi string za stringom dok se ne unese čitavo stablo, da će svoj unos napisati u neku datoteku pa ćeš onda čitati iz nje, da će u main-u upisati niz stringova pa ćeš prema njima graditi stablo. Mislim da je najlakše da korisnika pitaš sa scanfom unutar sagradi)
_________________ Sedam je prost broj
Bolonja je smeće i to pod hitno treba mijenjat
|
|
[Vrh] |
|
Bole13 Forumaš(ica)
Pridružen/a: 01. 11. 2008. (00:33:50) Postovi: (5A)16
Spol:
|
|
[Vrh] |
|
pmli Forumaš(ica)
Pridružen/a: 09. 11. 2009. (12:03:05) Postovi: (2C8)16
Spol:
|
|
[Vrh] |
|
.anchy. Forumaš(ica)
Pridružen/a: 14. 11. 2007. (20:03:46) Postovi: (1BC)16
Lokacija: Zgb
|
Postano: 19:50 uto, 9. 11. 2010 Naslov: |
|
|
[quote="eve"]Jos me samo zanima - pise da ucitavamo prefix izraz zapisan u string - da li to znaci da se izmedju svaka dva elementa nalazi razmak -npr + 12 5? Kako da onda na stog spremim bas broj 12?[/quote]
znam da je pitanje glupo,ali da znam što učitavam: ja imam zadatak s logičkim izrazima, znači &,!...i 0 ili 1, a za učitati mi je u primjeru zadano bez razmaka,pa je li sigurno da tako trebam učitati,tj.kao string,a ne charove?
i smijem li upotrijebiti f-ju isdigit? i strlen tek tolko da znam kada stati ići po stringu?
bilo bi jednostavnije :D
eve (napisa): | Jos me samo zanima - pise da ucitavamo prefix izraz zapisan u string - da li to znaci da se izmedju svaka dva elementa nalazi razmak -npr + 12 5? Kako da onda na stog spremim bas broj 12? |
znam da je pitanje glupo,ali da znam što učitavam: ja imam zadatak s logičkim izrazima, znači &,!...i 0 ili 1, a za učitati mi je u primjeru zadano bez razmaka,pa je li sigurno da tako trebam učitati,tj.kao string,a ne charove?
i smijem li upotrijebiti f-ju isdigit? i strlen tek tolko da znam kada stati ići po stringu?
bilo bi jednostavnije
|
|
[Vrh] |
|
.anchy. Forumaš(ica)
Pridružen/a: 14. 11. 2007. (20:03:46) Postovi: (1BC)16
Lokacija: Zgb
|
Postano: 20:59 uto, 9. 11. 2010 Naslov: |
|
|
zanemarite ovaj gore post,napisala sam bez tih f-ja. sada mi compiler javlja grešku
[code:1] data member may not have variably modified type `char[((unsigned int)((int)MAXLENGHT))]' [/code:1]
a kod mi je:
[code:1] int MAXLENGHT=100;
typedef struct{
int top;
char elementi[MAXLENGHT];
} STACK; [/code:1]
to je kao u skripti,samo što nisam napisala #define MAXLENGHT
jer to iskreno neznam,probala sam #define MAXLENGHT int; i slične kombinacije ali se compiler i dalje dere :(
edit3:ovaj problem sam rješila :D
također, kada trebam izračunati npr. 0&1, a & i 0 su mi na stogu,kako da to napravim? napisala sam y=x(TOP(S))1, gdje je x prijašnji TOP i jasno mi je da ne radi,ali nisam znala kako drugačije?
pretp.da prvo trebam char pretvorit u int,tj.ovaj x..a kako s izrazima?
edit2:i je li ! binarna operacija?ili se odnosi samo na 0 ili 1,a ne na oboje,pa moram i n anjega posebno paziti?
zanemarite ovaj gore post,napisala sam bez tih f-ja. sada mi compiler javlja grešku
Kod: | data member may not have variably modified type `char[((unsigned int)((int)MAXLENGHT))]' |
a kod mi je:
Kod: | int MAXLENGHT=100;
typedef struct{
int top;
char elementi[MAXLENGHT];
} STACK; |
to je kao u skripti,samo što nisam napisala #define MAXLENGHT
jer to iskreno neznam,probala sam #define MAXLENGHT int; i slične kombinacije ali se compiler i dalje dere
edit3:ovaj problem sam rješila
također, kada trebam izračunati npr. 0&1, a & i 0 su mi na stogu,kako da to napravim? napisala sam y=x(TOP(S))1, gdje je x prijašnji TOP i jasno mi je da ne radi,ali nisam znala kako drugačije?
pretp.da prvo trebam char pretvorit u int,tj.ovaj x..a kako s izrazima?
edit2:i je li ! binarna operacija?ili se odnosi samo na 0 ili 1,a ne na oboje,pa moram i n anjega posebno paziti?
|
|
[Vrh] |
|
pmli Forumaš(ica)
Pridružen/a: 09. 11. 2009. (12:03:05) Postovi: (2C8)16
Spol:
|
Postano: 21:53 uto, 9. 11. 2010 Naslov: |
|
|
[quote=".anchy."]također, kada trebam izračunati npr. 0&1, a & i 0 su mi na stogu,kako da to napravim? napisala sam y=x(TOP(S))1, gdje je x prijašnji TOP i jasno mi je da ne radi,ali nisam znala kako drugačije?[/quote]
Prvo trebaš izvuči 0 i & iz stoga i negdje pohraniti. Zatim obaviš operaciju 0&1 (treba ti switch naredba).
[quote=".anchy."]i je li ! binarna operacija?[/quote]
Nije, ! je unaran operator. On je posebna priča. Ako iz logičkog izraza učitaš operand, trebaš provjeriti je li ! na vrhu. Ako je, izvuci ga iz stoga i primjeni ga na operand koji si učitala iz logičkog izraza.
.anchy. (napisa): | također, kada trebam izračunati npr. 0&1, a & i 0 su mi na stogu,kako da to napravim? napisala sam y=x(TOP(S))1, gdje je x prijašnji TOP i jasno mi je da ne radi,ali nisam znala kako drugačije? |
Prvo trebaš izvuči 0 i & iz stoga i negdje pohraniti. Zatim obaviš operaciju 0&1 (treba ti switch naredba).
.anchy. (napisa): | i je li ! binarna operacija? |
Nije, ! je unaran operator. On je posebna priča. Ako iz logičkog izraza učitaš operand, trebaš provjeriti je li ! na vrhu. Ako je, izvuci ga iz stoga i primjeni ga na operand koji si učitala iz logičkog izraza.
|
|
[Vrh] |
|
.anchy. Forumaš(ica)
Pridružen/a: 14. 11. 2007. (20:03:46) Postovi: (1BC)16
Lokacija: Zgb
|
Postano: 22:32 uto, 9. 11. 2010 Naslov: |
|
|
hvala,ali rješila sam već sve to uz pomoć onog linka kojeg si dao eve,izuzev ovog s !,to lagano ubacim kasnije. sad imam drugi problem,napisala sam for petlju koja ide po stringu i sprema izraze na stog,i broj ako na vrhu nije broj. sada kada izađe iz petlje,ostane dosta toga na stogu,npr.za |0&1|^010
on izračuna samo |^010 = 1. i sada sam mislila while petlju ubaciti iza toga,koja uzima zadnja 2 broja,i operator koji je tada na vrhu stoga, izračuna vrijednost i vrati rješenje na stog.ali mi je beskonačna a neznam zašto? evo koda:(ps ovo sa ! cu ubacit poslije)
[code:1]
while(1){
z=TOP(S);
POP(&S);
if(EMPTY(S)){
PUSH(z,&S);
break;
}
x=atoi(&z);
z=TOP(S);
i=atoi(&z);
POP(&S);
if(TOP(S)=='&') y1=i&z;
else if(TOP(S)=='|') y1=i|x;
else if(TOP(S)=='^') y1=i^x;
itoa(y1,&y,10);
PUSH(y,&S);
printf("%c\n", y);
}[/code:1]
hvala,ali rješila sam već sve to uz pomoć onog linka kojeg si dao eve,izuzev ovog s !,to lagano ubacim kasnije. sad imam drugi problem,napisala sam for petlju koja ide po stringu i sprema izraze na stog,i broj ako na vrhu nije broj. sada kada izađe iz petlje,ostane dosta toga na stogu,npr.za |0&1|^010
on izračuna samo |^010 = 1. i sada sam mislila while petlju ubaciti iza toga,koja uzima zadnja 2 broja,i operator koji je tada na vrhu stoga, izračuna vrijednost i vrati rješenje na stog.ali mi je beskonačna a neznam zašto? evo koda:(ps ovo sa ! cu ubacit poslije)
Kod: |
while(1){
z=TOP(S);
POP(&S);
if(EMPTY(S)){
PUSH(z,&S);
break;
}
x=atoi(&z);
z=TOP(S);
i=atoi(&z);
POP(&S);
if(TOP(S)=='&') y1=i&z;
else if(TOP(S)=='|') y1=i|x;
else if(TOP(S)=='^') y1=i^x;
itoa(y1,&y,10);
PUSH(y,&S);
printf("%c\n", y);
} |
|
|
[Vrh] |
|
kakt00s Forumaš(ica)
Pridružen/a: 17. 10. 2007. (12:19:40) Postovi: (183)16
Spol:
Lokacija: :ɐɾıɔɐʞoן
|
Postano: 22:55 uto, 9. 11. 2010 Naslov: |
|
|
[quote="Milojko"]@Bole13:
@kakt00s:
NULL ti označava da na tom mjestu u stablu čvor nema dijete. time ti je stablo zadano na jedinstveni način, funkcija sagradi iz mog prošlog posta radi točno to što trebaš. naravno, moraš strcmp-at ulazne podatke sa NULL (opet, ovdje nije zadano kako će ti podaci biti uneseni. Ti možeš reći da će korisnik unositi string za stringom dok se ne unese čitavo stablo, da će svoj unos napisati u neku datoteku pa ćeš onda čitati iz nje, da će u main-u upisati niz stringova pa ćeš prema njima graditi stablo. Mislim da je najlakše da korisnika pitaš sa scanfom unutar sagradi)[/quote]
Ma jedina stvar koja me zanima je to da li ja doslovno unosim riječ NULL umjesto praznog čvora... ili to može biti '*','+','-',...?
Milojko (napisa): | @Bole13:
@kakt00s:
NULL ti označava da na tom mjestu u stablu čvor nema dijete. time ti je stablo zadano na jedinstveni način, funkcija sagradi iz mog prošlog posta radi točno to što trebaš. naravno, moraš strcmp-at ulazne podatke sa NULL (opet, ovdje nije zadano kako će ti podaci biti uneseni. Ti možeš reći da će korisnik unositi string za stringom dok se ne unese čitavo stablo, da će svoj unos napisati u neku datoteku pa ćeš onda čitati iz nje, da će u main-u upisati niz stringova pa ćeš prema njima graditi stablo. Mislim da je najlakše da korisnika pitaš sa scanfom unutar sagradi) |
Ma jedina stvar koja me zanima je to da li ja doslovno unosim riječ NULL umjesto praznog čvora... ili to može biti '*','+','-',...?
_________________ Muy importante!
|
|
[Vrh] |
|
pmli Forumaš(ica)
Pridružen/a: 09. 11. 2009. (12:03:05) Postovi: (2C8)16
Spol:
|
|
[Vrh] |
|
kakt00s Forumaš(ica)
Pridružen/a: 17. 10. 2007. (12:19:40) Postovi: (183)16
Spol:
Lokacija: :ɐɾıɔɐʞoן
|
|
[Vrh] |
|
Milojko Forumaš(ica)
Pridružen/a: 07. 11. 2008. (14:57:52) Postovi: (453)16
Spol:
Lokacija: Hilbertov hotel
|
Postano: 8:12 sri, 10. 11. 2010 Naslov: |
|
|
[quote="zadaća"]Na primjer, za ulazne podatke:
[b]A B F NULL J NULL NULL ...[/b][/quote]
zar iz ovog nije očito što unosiš?!
zadaća (napisa): | Na primjer, za ulazne podatke:
A B F NULL J NULL NULL ... |
zar iz ovog nije očito što unosiš?!
_________________ Sedam je prost broj
Bolonja je smeće i to pod hitno treba mijenjat
|
|
[Vrh] |
|
.anchy. Forumaš(ica)
Pridružen/a: 14. 11. 2007. (20:03:46) Postovi: (1BC)16
Lokacija: Zgb
|
Postano: 9:01 sri, 10. 11. 2010 Naslov: |
|
|
[quote="pmli"]@anchy: Nekak mi se čini da si sve odmah potrpala u stog. :tstnd: [url=http://degiorgi.math.hr/forum/viewtopic.php?t=15737&postdays=0&postorder=asc&&start=40]Link[/url]
Također, atoi ti je nepotrebna. Ta funkcija je dobra ako ne znaš koliko je broj dug, a tebi se može pojaviti samo 0 ili 1. To nije neki problem pretvoriti u int (samo oduzmeš '0') i natrag u char.[/quote]
radila sam tako,osim što kada mi je na vrhu operand,i učitam operand pa izvršim operaciju i dobijem operand,i onda neznam kako pomoću petlje glumiti da sam ga učitala. pretp.while, to ću danas navečer probati,prije se nisam sjetila tog.
a kako da int pretvorim u char?
pmli (napisa): | @anchy: Nekak mi se čini da si sve odmah potrpala u stog. Link
Također, atoi ti je nepotrebna. Ta funkcija je dobra ako ne znaš koliko je broj dug, a tebi se može pojaviti samo 0 ili 1. To nije neki problem pretvoriti u int (samo oduzmeš '0') i natrag u char. |
radila sam tako,osim što kada mi je na vrhu operand,i učitam operand pa izvršim operaciju i dobijem operand,i onda neznam kako pomoću petlje glumiti da sam ga učitala. pretp.while, to ću danas navečer probati,prije se nisam sjetila tog.
a kako da int pretvorim u char?
|
|
[Vrh] |
|
king_oberon Forumaš(ica)
Pridružen/a: 10. 12. 2008. (17:02:03) Postovi: (22)16
|
|
[Vrh] |
|
Milojko Forumaš(ica)
Pridružen/a: 07. 11. 2008. (14:57:52) Postovi: (453)16
Spol:
Lokacija: Hilbertov hotel
|
Postano: 10:04 sri, 10. 11. 2010 Naslov: |
|
|
pogledaj definiciju funkcija sa [url=http://web.math.hr/nastava/spa/files/salabahter.pdf]službenog šalabahtera[/url]. tamo piše da im je povratna vrijednost [b]void[/b], daklem, po defaultu ne trebaju ništ vratit, samo moraju napraviti nova stabla
pogledaj definiciju funkcija sa službenog šalabahtera. tamo piše da im je povratna vrijednost void, daklem, po defaultu ne trebaju ništ vratit, samo moraju napraviti nova stabla
_________________ Sedam je prost broj
Bolonja je smeće i to pod hitno treba mijenjat
|
|
[Vrh] |
|
pmli Forumaš(ica)
Pridružen/a: 09. 11. 2009. (12:03:05) Postovi: (2C8)16
Spol:
|
Postano: 15:24 sri, 10. 11. 2010 Naslov: |
|
|
[quote=".anchy."]radila sam tako,osim što kada mi je na vrhu operand,i učitam operand pa izvršim operaciju i dobijem operand,i onda neznam kako pomoću petlje glumiti da sam ga učitala. pretp.while, to ću danas navečer probati,prije se nisam sjetila tog.[/quote]
Evo, nadam se razumljiviji, pseudokod:
[code:1]dok se ima nešto za učitati
učitaj
ako je učitan operator
stavi ga na stog
inače
dok je stog neprazan i na vrhu je operand ili '!'
ako je na vrhu operand
izvuci taj operand i operator ispod njega
primjeni izvučeni operator na izvučeni i učitani operand, te dobivenu vrijednost spremi na mjesto učitanog operanda
inače
izvuci '!'
primjeni '!' na učitani operand i dobivenu vrijedost spremi na mjesto učitanog operanda
stavi učitani operand na stog[/code:1]
[quote=".anchy."]a kako da int pretvorim u char?[/quote]
Što je inverzno operaciji oduzimanja? :)
.anchy. (napisa): | radila sam tako,osim što kada mi je na vrhu operand,i učitam operand pa izvršim operaciju i dobijem operand,i onda neznam kako pomoću petlje glumiti da sam ga učitala. pretp.while, to ću danas navečer probati,prije se nisam sjetila tog. |
Evo, nadam se razumljiviji, pseudokod:
Kod: | dok se ima nešto za učitati
učitaj
ako je učitan operator
stavi ga na stog
inače
dok je stog neprazan i na vrhu je operand ili '!'
ako je na vrhu operand
izvuci taj operand i operator ispod njega
primjeni izvučeni operator na izvučeni i učitani operand, te dobivenu vrijednost spremi na mjesto učitanog operanda
inače
izvuci '!'
primjeni '!' na učitani operand i dobivenu vrijedost spremi na mjesto učitanog operanda
stavi učitani operand na stog |
.anchy. (napisa): | a kako da int pretvorim u char? |
Što je inverzno operaciji oduzimanja?
|
|
[Vrh] |
|
ankovacic Forumaš(ica)
Pridružen/a: 27. 10. 2009. (19:28:17) Postovi: (5C)16
Spol:
|
|
[Vrh] |
|
ante c Forumaš(ica)
Pridružen/a: 10. 10. 2009. (19:18:15) Postovi: (62)16
|
Postano: 21:34 sri, 10. 11. 2010 Naslov: |
|
|
Imam problem sa zadaćom iz strukture podataka zadatak glasi ovako :
Implementirajte a.t.p. BTREE pomoću polja i napišite potprogram koji računa
broj listova u binarnom stablu. Ispišite i oznake samih listova.
Ulazni podaci: niz stringova koji opisuje binarno stablo zadano u PREORDER
obilasku proširenom oznakama praznih čvorova (NULL)
Izlazni podaci: broj listova učitanog stabla, pa oznake listova
Na primjer, za ulazne podatke:
A B F NULL J NULL NULL NULL C D NULL E G NULL NULL H NULL NULL NULL
treba ispisati:
3: J G H
Stablo iz primjera izgleda ovako:
ovaj zadatak se može riješiti doslovno neovisno o implementaciji tako da idem
po nizu i ako je iza nekog znaka nalazi dva puta za redom null null taj je list
ali nisam siguran da je to dobro jer ne koristim implementaciju , iako ne kršim
niti jedno pravilo zadatak je uistinu tako neovisan o implementaciji ..........
Razmišljao sam i o tome da rekonstruiram stablo iz priordera tako da ga
pospremim u niz po pravilu kako smo učili da je lijevo dijete na 2i+1 a desno
na 2i+2 ali mi sečini to preteško tj ......piše u skripti da funkcije create
, left i right subtree nisu namjenjene za implementaciju pomoću pola pa me
zanima da li mi možet netko dati kakvu ideju ili me uputiti na pravi put
ovako radi al neznam da li bi to bilo dobro:
[code:1]#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define VELICINA 1000
#define LAMBDA -1
#define NE_DEF -2
#define ne_def 'n'
typedef int node;
typedef char labeltype;
typedef struct {
node zadnji;
labeltype oznaka[VELICINA];
}BTREE;
void MAKE_NULL(BTREE *T){
int i;
for(i=0; i<VELICINA; ++i) T->oznaka[i]='+';
T->zadnji=-1;
}
int EMPTY(BTREE t){
if (t.zadnji==-1) return 1;
return 0;
}
void INSERT_LEFT_CHILD(labeltype l,node i,BTREE *t)
{
if(i>t->zadnji || i<0 || t->oznaka[2*i+1]==l){
//printf("\n NEDEFINIRANO !!!!!!!!!!\n");
return;}
else
t->oznaka[2*i+1]=l;
}
void INSERT_RIGHT_CHILD(labeltype l,node i,BTREE *t)
{
if(i>t->zadnji || i<0 || t->oznaka[2*i+2]==l){
//printf("\n NEDEFINIRANO !!!!!!!!!!\n");
return;}
else
t->oznaka[2*i+2]=l;
}
node LEFT_CHILD(node i, BTREE t)
{
if(t.oznaka[2*i+1]=='+')
return LAMBDA;
if(i>t.zadnji || i<0 || 2*i+1>t.zadnji){
//printf("\n NEDEFINIRANO !!!!!!!!!!\n");
return NE_DEF;}
return 2*i+1;
}
node RIGHT_CHILD(node i, BTREE t)
{
if(t.oznaka[2*i+2]=='+')
return LAMBDA;
if(2*i+2>t.zadnji||i>t.zadnji || i<0){
//printf("\n NEDEFINIRANO !!!!!!!!!!\n");
return NE_DEF;}
return 2*i+2;
}
void DELETE(node i , BTREE *t)
{
if(i>t->zadnji || i<0 || LEFT_CHILD(i,*t)!=LAMBDA ||
RIGHT_CHILD(i,*t)!=LAMBDA){
//printf("\n NEDEFINIRANO !!!!!!!!!!\n");
return;}
else
t->oznaka[i]='+';
}
node ROOT(BTREE t)
{
if(t.oznaka[0]=='+') return LAMBDA;
return 0;
}
node PARENT(node i,BTREE t)
{
if(i==ROOT(t))
return LAMBDA;
if(i>t.zadnji || i<0){
//printf("\NEDEFINIRANO!!!!!!\n");
return NE_DEF;}
return (i-1)/2;
}
labeltype LABEL(node i, BTREE t)
{
if(i<0 || i>t.zadnji){
//printf("\NEDEFINIRANO!!!!!!\n");
return ne_def;}
return t.oznaka[i];
}
void CHANGE_LABEL(labeltype l,node i,BTREE *t)
{
if(i<0 || i>t->zadnji){
//printf("\NEDEFINIRANO!!!!!!\n");
return;}
t->oznaka[i]=l;
}
void broj_i_oznake_listova_stabla(BTREE t)
{
node i;
labeltype pom[VELICINA];
int brojac=0;
for (i=0;i<=t.zadnji-2;i++)
{
if(t.oznaka[i]==' '||t.oznaka[i-1]!=' ')continue;
if(t.oznaka[i+2]=='N' && t.oznaka[i+3]=='U'&&t.oznaka[i+4]=='L' &&
t.oznaka[i+5]=='L'&&t.oznaka[i+7]=='N' &&
t.oznaka[i+8]=='U'&&t.oznaka[i+9]=='L'&&t.oznaka[i+10]=='L')
pom[brojac++]=t.oznaka[i];
}
printf("\n%d :",brojac);
for(i=0;i<brojac;i++)
printf(" %c",pom[i]);
}
int main()
{
BTREE T;
gets(T.oznaka);
T.zadnji=strlen(T.oznaka);
broj_i_oznake_listova_stabla(T);
system("PAUSE");
return 0;[tex][/tex][/code:1]
Imam problem sa zadaćom iz strukture podataka zadatak glasi ovako :
Implementirajte a.t.p. BTREE pomoću polja i napišite potprogram koji računa
broj listova u binarnom stablu. Ispišite i oznake samih listova.
Ulazni podaci: niz stringova koji opisuje binarno stablo zadano u PREORDER
obilasku proširenom oznakama praznih čvorova (NULL)
Izlazni podaci: broj listova učitanog stabla, pa oznake listova
Na primjer, za ulazne podatke:
A B F NULL J NULL NULL NULL C D NULL E G NULL NULL H NULL NULL NULL
treba ispisati:
3: J G H
Stablo iz primjera izgleda ovako:
ovaj zadatak se može riješiti doslovno neovisno o implementaciji tako da idem
po nizu i ako je iza nekog znaka nalazi dva puta za redom null null taj je list
ali nisam siguran da je to dobro jer ne koristim implementaciju , iako ne kršim
niti jedno pravilo zadatak je uistinu tako neovisan o implementaciji ..........
Razmišljao sam i o tome da rekonstruiram stablo iz priordera tako da ga
pospremim u niz po pravilu kako smo učili da je lijevo dijete na 2i+1 a desno
na 2i+2 ali mi sečini to preteško tj ......piše u skripti da funkcije create
, left i right subtree nisu namjenjene za implementaciju pomoću pola pa me
zanima da li mi možet netko dati kakvu ideju ili me uputiti na pravi put
ovako radi al neznam da li bi to bilo dobro:
Kod: | #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define VELICINA 1000
#define LAMBDA -1
#define NE_DEF -2
#define ne_def 'n'
typedef int node;
typedef char labeltype;
typedef struct {
node zadnji;
labeltype oznaka[VELICINA];
}BTREE;
void MAKE_NULL(BTREE *T){
int i;
for(i=0; i<VELICINA; ++i) T->oznaka[i]='+';
T->zadnji=-1;
}
int EMPTY(BTREE t){
if (t.zadnji==-1) return 1;
return 0;
}
void INSERT_LEFT_CHILD(labeltype l,node i,BTREE *t)
{
if(i>t->zadnji || i<0 || t->oznaka[2*i+1]==l){
//printf("\n NEDEFINIRANO !!!!!!!!!!\n");
return;}
else
t->oznaka[2*i+1]=l;
}
void INSERT_RIGHT_CHILD(labeltype l,node i,BTREE *t)
{
if(i>t->zadnji || i<0 || t->oznaka[2*i+2]==l){
//printf("\n NEDEFINIRANO !!!!!!!!!!\n");
return;}
else
t->oznaka[2*i+2]=l;
}
node LEFT_CHILD(node i, BTREE t)
{
if(t.oznaka[2*i+1]=='+')
return LAMBDA;
if(i>t.zadnji || i<0 || 2*i+1>t.zadnji){
//printf("\n NEDEFINIRANO !!!!!!!!!!\n");
return NE_DEF;}
return 2*i+1;
}
node RIGHT_CHILD(node i, BTREE t)
{
if(t.oznaka[2*i+2]=='+')
return LAMBDA;
if(2*i+2>t.zadnji||i>t.zadnji || i<0){
//printf("\n NEDEFINIRANO !!!!!!!!!!\n");
return NE_DEF;}
return 2*i+2;
}
void DELETE(node i , BTREE *t)
{
if(i>t->zadnji || i<0 || LEFT_CHILD(i,*t)!=LAMBDA ||
RIGHT_CHILD(i,*t)!=LAMBDA){
//printf("\n NEDEFINIRANO !!!!!!!!!!\n");
return;}
else
t->oznaka[i]='+';
}
node ROOT(BTREE t)
{
if(t.oznaka[0]=='+') return LAMBDA;
return 0;
}
node PARENT(node i,BTREE t)
{
if(i==ROOT(t))
return LAMBDA;
if(i>t.zadnji || i<0){
//printf("\NEDEFINIRANO!!!!!!\n");
return NE_DEF;}
return (i-1)/2;
}
labeltype LABEL(node i, BTREE t)
{
if(i<0 || i>t.zadnji){
//printf("\NEDEFINIRANO!!!!!!\n");
return ne_def;}
return t.oznaka[i];
}
void CHANGE_LABEL(labeltype l,node i,BTREE *t)
{
if(i<0 || i>t->zadnji){
//printf("\NEDEFINIRANO!!!!!!\n");
return;}
t->oznaka[i]=l;
}
void broj_i_oznake_listova_stabla(BTREE t)
{
node i;
labeltype pom[VELICINA];
int brojac=0;
for (i=0;i<=t.zadnji-2;i++)
{
if(t.oznaka[i]==' '||t.oznaka[i-1]!=' ')continue;
if(t.oznaka[i+2]=='N' && t.oznaka[i+3]=='U'&&t.oznaka[i+4]=='L' &&
t.oznaka[i+5]=='L'&&t.oznaka[i+7]=='N' &&
t.oznaka[i+8]=='U'&&t.oznaka[i+9]=='L'&&t.oznaka[i+10]=='L')
pom[brojac++]=t.oznaka[i];
}
printf("\n%d :",brojac);
for(i=0;i<brojac;i++)
printf(" %c",pom[i]);
}
int main()
{
BTREE T;
gets(T.oznaka);
T.zadnji=strlen(T.oznaka);
broj_i_oznake_listova_stabla(T);
system("PAUSE");
return 0;[tex][/tex] |
|
|
[Vrh] |
|
pmli Forumaš(ica)
Pridružen/a: 09. 11. 2009. (12:03:05) Postovi: (2C8)16
Spol:
|
|
[Vrh] |
|
.anchy. Forumaš(ica)
Pridružen/a: 14. 11. 2007. (20:03:46) Postovi: (1BC)16
Lokacija: Zgb
|
Postano: 21:59 sri, 10. 11. 2010 Naslov: |
|
|
[quote="pmli"]Evo, nadam se razumljiviji, pseudokod:
[code:1]dok se ima nešto za učitati
učitaj
ako je učitan operator
stavi ga na stog
inače
dok je stog [b]neprazan[/b] i na vrhu je operand ili '!'
ako je na vrhu operand
izvuci taj operand i operator ispod njega
primjeni izvučeni operator na izvučeni i učitani operand, te dobivenu vrijednost spremi na mjesto učitanog operanda
inače
izvuci '!'
primjeni '!' na učitani operand i dobivenu vrijedost spremi na mjesto učitanog operanda
stavi učitani operand na stog[/code:1]
[/quote]
ovako sam napravila i prije nego sam pročitala tvoj post(jeeeej),osim ovog kvaziboldanog u petlji while,i provela sam 2 sata doslovno buljeći u kod i gledajući što mi nije točno,program se rušio,tako da ti neizmjerno hvala što to više nemoram radit! :D
i program sada radi i to točno :)
pmli (napisa): | Evo, nadam se razumljiviji, pseudokod:
Kod: | dok se ima nešto za učitati
učitaj
ako je učitan operator
stavi ga na stog
inače
dok je stog [b]neprazan[/b] i na vrhu je operand ili '!'
ako je na vrhu operand
izvuci taj operand i operator ispod njega
primjeni izvučeni operator na izvučeni i učitani operand, te dobivenu vrijednost spremi na mjesto učitanog operanda
inače
izvuci '!'
primjeni '!' na učitani operand i dobivenu vrijedost spremi na mjesto učitanog operanda
stavi učitani operand na stog |
|
ovako sam napravila i prije nego sam pročitala tvoj post(jeeeej),osim ovog kvaziboldanog u petlji while,i provela sam 2 sata doslovno buljeći u kod i gledajući što mi nije točno,program se rušio,tako da ti neizmjerno hvala što to više nemoram radit!
i program sada radi i to točno
|
|
[Vrh] |
|
|