1.zadaca-pomoc oko zadatka
Select messages from
# through # FAQ
[/[Print]\]

Forum@DeGiorgi -> Strukture podataka i algoritmi

#1: 1.zadaca-pomoc oko zadatka Autor/ica: Sekanta PostPostano: 18:28 pet, 28. 10. 2011
    —
Moze pomoc oko ovog zadatka iz zadace iz spa. Glasi ovako:
Citat:

Implementirajte a.t.p. STACK pomoću pointera i napišite potprogram koji logički izraz iz infix oblika prebacuje u prefix oblik. Problem trebate riješiti pomoću stoga.


Ulazni podaci: string koji predstavlja logički izraz u infix obliku
Izlazni podaci: prikaz istog izraza u prefix obliku
Na primjer, za ulazne podatke:
A|B&(C^E|D)
treba ispisati:
|A&B|^CED
Napomena: &=AND, |=OR, ^=XOR, -=NOT; obratite pažnju na prioritete


Koje ja sad sve logicke operatore moram uzeti u obzir? Ako bi mi ih netko mogao sve nabrojat, i poredat po prioritetima bila bih jako zahvalna Smile

#2:  Autor/ica: vsegoLokacija: /sbin/init PostPostano: 4:27 sub, 29. 10. 2011
    —
Ja bih rekao da trebas implementirati ove pobrojane, a prioriteti (od najjaceg prema najslabijem su): NOT, AND, XOR, OR.

Inace, ne bi trebalo biti tesko definirati stvar na nacin da lako dodas jos operatora, ako zatreba (npr. definiras konstantni niz u kojem drzis operatore redom prioriteta i onda samo, ako treba, dodajes nove).

#3:  Autor/ica: Sekanta PostPostano: 11:01 sub, 29. 10. 2011
    —
Hvala puno! Smile Baš sam se nadala da ćete mi Vi odgovorit na pitanje, jer onda uvijek dobijem sve informacije što mi trebaju Smile

#4:  Autor/ica: michelangelo PostPostano: 0:47 ned, 30. 10. 2011
    —
da ne otvaram novu temu:
imam problem kod implementacije BTREE pomoću polja, točnije kod funkcije node CREATE(labeltype l, BTREE TL, BTREE TR, BTREE *T) ne dolazim na ideju za to. pa ako neko može dat hint barem, bila bi zahvalna Smile

#5:  Autor/ica: matmihLokacija: {Zg, De , Ri} PostPostano: 12:04 ned, 30. 10. 2011
    —
michelangelo (napisa):
da ne otvaram novu temu:
imam problem kod implementacije BTREE pomoću polja, točnije kod funkcije node CREATE(labeltype l, BTREE TL, BTREE TR, BTREE *T) ne dolazim na ideju za to. pa ako neko može dat hint barem, bila bi zahvalna Smile


Dakle, stvorite novu strukturu BTREE i u polje SPACE na odgovarajuću poziciju (0) stavite čvor s labeltype-om l, koi je korijen stabla. Ako su zadana stabla TR i TL, korijeni ta dva stabla su djeca od korijena stabla T (kopirate ih na odgovarajuću poziciju u polju SPACE, ovisno o tome kako ste reprezentirali djecu određenog čvora), ostale čvorove na jednaki način kopirate u polje SPACE stabla T.

Svakako kod implementacije morate znati koje je lijevo a koje desno dijete određenog čvora.

#6:  Autor/ica: michelangelo PostPostano: 13:54 ned, 30. 10. 2011
    —
tnx. mislim da sam skopčala. još jedno pitanje zadatak mi je stvorit novo stablo koje se sastoji samo od korijenskog čvora, koji mora dobiti oznaku c. dal je ovaj kod dobar za to?
void make_new(BTREE *B, labeltype c)
{
BTREE Br,Bl;
MAKE_NULL(&Br);
MAKE_NULL(&Bl);
node i=CREATE(c,Br,Bl,&B);
}

#7:  Autor/ica: matmihLokacija: {Zg, De , Ri} PostPostano: 15:22 ned, 30. 10. 2011
    —
michelangelo (napisa):
tnx. mislim da sam skopčala. još jedno pitanje zadatak mi je stvorit novo stablo koje se sastoji samo od korijenskog čvora, koji mora dobiti oznaku c. dal je ovaj kod dobar za to?
void make_new(BTREE *B, labeltype c)
{
BTREE Br,Bl;
MAKE_NULL(&Br);
MAKE_NULL(&Bl);
node i=CREATE(c,Br,Bl,&B);
}


Ovo bi trebalo raditi.
Predlažem da testirate svaku funkciju posebno dok implementirate stablo.
Inače će vam se nakupiti više grešaka pa nećete znati gdje je što krivo.

#8:  Autor/ica: integral PostPostano: 19:50 ned, 30. 10. 2011
    —
Molio bih za pomoć oko zadatka:

Implementirajte a.t.p. LIST pomoću pointera i napišite funkciju
void INSERTION_SORT (LIST L1, LIST *L2)
za sortiranje liste. Program treba omogućiti sortiranje silazno i uzlazno.


Ulazni podaci: broj članova liste, članovi liste, način sortiranja
Izlazni podaci: sortirana lista
Na primjer, za ulazne podatke:
5
7 3 8 5 2
silazno
treba ispisati:
8 7 5 3 2


Hvala.

#9:  Autor/ica: CROmpir PostPostano: 20:39 ned, 30. 10. 2011
    —
Mislim da bi trebao objasnit svoj problem u tom zadatku... Tako ces lakse naci pomoc, jer nemozes ocekivati da netko to umjesto tebe napravi...

#10:  Autor/ica: integral PostPostano: 20:57 ned, 30. 10. 2011
    —
Moj je problem u tome da mi postane slabo dok otvorim skriptu iz kolegija "Struktura podataka i algoritmi", a kamoli dok počnem čitati ono što je u njoj napisano. Mrzim programiranje i očajan sam u pogledu toga kao ću položiti taj kolegij. Priznajem da je bilo neprimjereno očekivati da mi netko napiše rješenje, pa mi oprostite zbog toga.

#11:  Autor/ica: michelangelo PostPostano: 21:48 ned, 30. 10. 2011
    —
probaj barem nešto napisat, kad sa otvorila zadaću i pokrenula code blocks nisam više znala include napisat. budeš nekako. i oćeš se mijenjat za zadaću? Smile

#12:  Autor/ica: CROmpir PostPostano: 23:29 ned, 30. 10. 2011
    —
Imam jedno pitanje,

Kako u atp. BTREE, definirati LAMBDA?? Razz

i kako implementirati PARENT funkciju...

hvala

#13:  Autor/ica: matmihLokacija: {Zg, De , Ri} PostPostano: 1:42 pon, 31. 10. 2011
    —
CROmpir (napisa):
Imam jedno pitanje,

Kako u atp. BTREE, definirati LAMBDA?? Razz

i kako implementirati PARENT funkciju...

hvala


Definicija LAMBDE ovisi o tome što su vam čvorovi.
Ako recimo u stablu imate cijelobrojne oznake (prirodne brojeve), onda možete definirati da vam je LAMBDA -1 recimo.

Implementacija PARENT funkcije također ovisi o tome na koji način morate implementirati BTREE (polje, pointeri...), uglavnom imat ćete ili pointer na roditelja ili kursor na roditelja. Funkcija parent onda samo pročita taj podatak.

#14:  Autor/ica: CROmpir PostPostano: 12:13 pon, 31. 10. 2011
    —
Imam implementaciju pomocu pointera, a sad za PARENT funkciju stvarno nemam ideje... :p

Cvorovi mi sadrze velika slova... npr. 'A'...

#15:  Autor/ica: pravipurger PostPostano: 12:16 pon, 31. 10. 2011
    —
1. Kada implementiram LIST preko pointera u zadaći da li trebam napisati funkciju PREVIOUS() za koju skripta kaže da je neefikasna, ali dz kaže "potrebno napraviti sve funkcije koje su navedene kod definicije tog atp-a"?

2. Da li kad mi ćelija sadrži koeficijent, eksponent i pointer trebam pisati dvije funckije RETRIEVE1 i RETRIEVE2, jednu koja vraća koef, drugu koja vraća exp ili jednu koja će vraćati nešto drugo?

#16:  Autor/ica: matmihLokacija: {Zg, De , Ri} PostPostano: 13:28 pon, 31. 10. 2011
    —
pravipurger (napisa):
1. Kada implementiram LIST preko pointera u zadaći da li trebam napisati funkciju PREVIOUS() za koju skripta kaže da je neefikasna, ali dz kaže "potrebno napraviti sve funkcije koje su navedene kod definicije tog atp-a"?

2. Da li kad mi ćelija sadrži koeficijent, eksponent i pointer trebam pisati dvije funckije RETRIEVE1 i RETRIEVE2, jednu koja vraća koef, drugu koja vraća exp ili jednu koja će vraćati nešto drugo?


1. Ako u zadaći kaže napisati sve funkcije, onda morate napisati sve funkcije. Smile

2. U ATP postoji samo jedna funkcija RETRIEVE i samo tu morate implementirati, ona vraća element koji se nalazi na poziciji p u listi. Dakle vraća element, kojeg god tipa on bio u vašem zadatku.

#17:  Autor/ica: CROmpir PostPostano: 14:29 pon, 31. 10. 2011
    —
Moze li mi netko pomoci oko implementacije funkcije PARENT u BTREE a.t.p-u pomocu pointera... Ne kuzim kako da to napravim... Sad

U skripti sugerira da dodamo jos jedno celiju pointera na parent? I smijemo li to koristiti s obzirom da vise CREATE nije onakakva funkcija kakva bi trebala biti imala bi jos jedan parametar ako se ne varam...

Ima li mozda nekakvu ideju ili moze bilo kakva pomoc...

#18:  Autor/ica: matmihLokacija: {Zg, De , Ri} PostPostano: 18:17 pon, 31. 10. 2011
    —
CROmpir (napisa):
Moze li mi netko pomoci oko implementacije funkcije PARENT u BTREE a.t.p-u pomocu pointera... Ne kuzim kako da to napravim... Sad

U skripti sugerira da dodamo jos jedno celiju pointera na parent? I smijemo li to koristiti s obzirom da vise CREATE nije onakakva funkcija kakva bi trebala biti imala bi jos jedan parametar ako se ne varam...

Ima li mozda nekakvu ideju ili moze bilo kakva pomoc...


Predlažem da poslušate skriptu. Smile

Ne vidim razloga za dodatni parametar u funkciji CREATE. Pri stvaranju stabla unutar funkcije CREATE možete namjestiti parent pointere bez dodatnih parametara. Parent pointer za korijen je ionako null. Kod inserta imate sve potrebne informacije.

#19:  Autor/ica: CROmpir PostPostano: 23:35 pon, 31. 10. 2011
    —
Moze li mi netko pomoci oko nacina unosa BINARNOG STABLA...

Bio bih mu jako zahvalan posto me to jako muci...


I imam pitanje u vezi implementacije, jel ovo u redu??


Kod:
node CREATE(labeltype l, BTREE TL, BTREE TR, BTREE *Tptr){
       *Tptr=(celltype *)malloc(sizeof(celltype));
       (*Tptr)->label=l;
       (*Tptr)->leftchild=TL;
       (*Tptr)->rightchild=TR;
   return (*Tptr);
}
 
node INSERT_LEFT_CHILD ( labeltype l, node i, BTREE *T){
     node novi;
 
       novi=CREATE(l,LAMBDA,LAMBDA,T);
       i->leftchild=novi;
       return (i->leftchild);
}
 
node INSERT_RIGHT_CHILD ( labeltype l, node i, BTREE *T){
     node novi;
 
       novi=CREATE(l,LAMBDA,LAMBDA,T);
       i->rightchild=novi;
       return (i->rightchild);
}

#20:  Autor/ica: matmihLokacija: {Zg, De , Ri} PostPostano: 18:23 uto, 1. 11. 2011
    —
CROmpir (napisa):
Moze li mi netko pomoci oko nacina unosa BINARNOG STABLA...

Bio bih mu jako zahvalan posto me to jako muci...


I imam pitanje u vezi implementacije, jel ovo u redu??


Kod:
node CREATE(labeltype l, BTREE TL, BTREE TR, BTREE *Tptr){
       *Tptr=(celltype *)malloc(sizeof(celltype));
       (*Tptr)->label=l;
       (*Tptr)->leftchild=TL;
       (*Tptr)->rightchild=TR;
   return (*Tptr);
}
 
node INSERT_LEFT_CHILD ( labeltype l, node i, BTREE *T){
     node novi;
 
       novi=CREATE(l,LAMBDA,LAMBDA,T);
       i->leftchild=novi;
       return (i->leftchild);
}
 
node INSERT_RIGHT_CHILD ( labeltype l, node i, BTREE *T){
     node novi;
 
       novi=CREATE(l,LAMBDA,LAMBDA,T);
       i->rightchild=novi;
       return (i->rightchild);
}


Binarno stablo unosite tako da ga prvo stvorite s funkcijom CREATE, a zatim dodajete čvorove pomoću funkcija INSERT_LEFT/RIGHT_CHILD

Ove implementacije INSERT_LEFT/RIGHT_CHILD neće baš raditi što bi trebale. Vi pri svakom pozivu stvarate novo stablo T, pošto pozivate funkciju CREATE (pročitajte u službenom šalabahteru što ta funkcija radi). Ono što funkcije INSERT trebaju raditi je dodati čvor u već postojeće stablo, što znači da u stablu T, dodajete lijevo/desno dijete čvoru i.

#21:  Autor/ica: CROmpir PostPostano: 18:56 uto, 1. 11. 2011
    —
Aha, puno hvala, da sad sam skuzio...

Mozes li mi jos reci ili pomoci kako da omogucim korisniku unos podataka u stablo? Fakat nemam ideje, prvi put se susrecem s tim...

#22:  Autor/ica: matmihLokacija: {Zg, De , Ri} PostPostano: 21:45 sri, 2. 11. 2011
    —
CROmpir (napisa):
Aha, puno hvala, da sad sam skuzio...

Mozes li mi jos reci ili pomoci kako da omogucim korisniku unos podataka u stablo? Fakat nemam ideje, prvi put se susrecem s tim...


To možete neki unos smisliti. Jedan način recimo je kad se program pokrene pita korisnika da defiira label za korijen stabla.
Nakon toga unosa stvorite stablo pomoću CREATE. Svaki sljedeći unos pita korisnika za label i kojemu čvoru želimo dodati trenutni čvor kao djete. Nakon toga unosa se sa INSERT_LEFT/RIGHT child odvija odgovarajući unos.

Sam izgled i način unosa nije ključan za zadaću, bitna je implementacija i što se već traži u zadatku.

Ako vam je lakše možete napraviti unos iz datoteke...

#23:  Autor/ica: Joker PostPostano: 1:57 sub, 5. 11. 2011
    —
može pomoć oko zadatka plizzz

Napišite program koji računa k−tu derivaciju polinoma zapisanog u obliku: p(x) = c1 xe1 + ... + cn xen, gdje su e1 > e2 > ... > en ≥ 0 . Polinome prikažite vezanom listom. A.t.p. LIST implementirajte pomoću kursora tako da i−ta ćelija liste sadrži koeficijent ci, eksponent ei i kursor na slijedeću ćeliju.



sto je meni ovdje elementtype? kolko mi smijemo mijenjati funkcije iz implementacije?

#24:  Autor/ica: yellow submarine PostPostano: 17:32 sub, 5. 11. 2011
    —
Ako u zadatku piše:

Kod:

Za ulazne podatke:
7
2 2 7
2 1 4
1 6
3 2 7 5
1 4
1 3
2 1 4
treba ispisati:
1 2 4 5 7


Je li to znači da ispis mora nužno biti tim redoslijedom ili je točno i ako se ispiše npr. 12754 ?

Hvala. Smile

#25:  Autor/ica: akolak PostPostano: 17:03 ned, 6. 11. 2011
    —
Ako prefix izraz napišemo unazad i računamo kao postfix oćemo dobit isto rješenje?
Dakle ako
+ * 13 2 -8 7
napisemo kao 8 7 - 13 2 * + pa izracnamo kao postfix?
Naravno pitanje se odnosi na općeniti prefix izraz.

EDIT: Bolje pitanje je jel smijemo to koristit? (Mislim da se dokaže indukcijom po broju operatora)

#26:  Autor/ica: Sekanta PostPostano: 17:40 ned, 6. 11. 2011
    —
akolak (napisa):
Ako prefix izraz napišemo unazad i računamo kao postfix oćemo dobit isto rješenje?
Dakle ako
+ * 13 2 -8 7
napisemo kao 8 7 - 13 2 * + pa izracnamo kao postfix?
Naravno pitanje se odnosi na općeniti prefix izraz.

EDIT: Bolje pitanje je jel smijemo to koristit? (Mislim da se dokaže indukcijom po broju operatora)


ja sam isto na taj nacin radila, hmmm Confused

#27:  Autor/ica: Joker PostPostano: 19:46 ned, 6. 11. 2011
    —
kak se zaokruzi tip double, da mi ne ispisuje 3.00000 nego samo tri? zaboravih =D

#28:  Autor/ica: pravipurger PostPostano: 9:52 pon, 7. 11. 2011
    —
matmih (napisa):
pravipurger (napisa):

2. Da li kad mi ćelija sadrži koeficijent, eksponent i pointer trebam pisati dvije funckije RETRIEVE1 i RETRIEVE2, jednu koja vraća koef, drugu koja vraća exp ili jednu koja će vraćati nešto drugo?


2. U ATP postoji samo jedna funkcija RETRIEVE i samo tu morate implementirati, ona vraća element koji se nalazi na poziciji p u listi. Dakle vraća element, kojeg god tipa on bio u vašem zadatku.


je li onda ovo npr. u funkciji main neovisno o implementaciji?
Kod:

element1=RETRIEVE(p,L1);
element2=RETRIEVE(q,L2);
if(element1.exp==element2.exp)
element3.koef=element1.koef

#29:  Autor/ica: BorgcubeLokacija: Tu i tamo. PostPostano: 10:08 pon, 7. 11. 2011
    —
Joker (napisa):
kak se zaokruzi tip double, da mi ne ispisuje 3.00000 nego samo tri? zaboravih =D

Stavi %lg

#30:  Autor/ica: jabuka PostPostano: 10:54 pon, 7. 11. 2011
    —
pitanje..moram napisat funkciju MERGE_SORT(LIST L1, LIST *L2) koja omogucuje silazno i uzlazno sortiranje..jel to mogu napravit tako da prvo u funkciji pitam dal je sortiranje uzlazno ili silazno (u zadatku mi je medu ulaznim podacima i nacin sortiranja) i onda ako je npr. uzlazno prolazim cijelom listom i trazim najmanji element i onda ga spremim u listu 2, trazim drugi po velicini element i spremim ga u listu 2 itd.?

Zadnja promjena: jabuka; 9:13 uto, 8. 11. 2011; ukupno mijenjano 1 put.

#31:  Autor/ica: Dama Herc PostPostano: 12:14 pon, 7. 11. 2011
    —
Mene zanima kako provjeriti postoji li node i u binarnom stablu.
Tj kako prije nego što dođe do greške to shvatiti. Postoje li već takve neke funkcije implementirane u C?

Ja bih to mogla rekurzivno napisati pomoću funkcija LEFT i RIGHT CHILD,
no one same zahtijevaju provjeru pa se tako vrtimo u krug.

#32:  Autor/ica: akolak PostPostano: 21:13 pon, 7. 11. 2011
    —
Sekanta (napisa):
akolak (napisa):
Ako prefix izraz napišemo unazad i računamo kao postfix oćemo dobit isto rješenje?
Dakle ako
+ * 13 2 -8 7
napisemo kao 8 7 - 13 2 * + pa izracnamo kao postfix?
Naravno pitanje se odnosi na općeniti prefix izraz.

EDIT: Bolje pitanje je jel smijemo to koristit? (Mislim da se dokaže indukcijom po broju operatora)


ja sam isto na taj nacin radila, hmmm Confused


Ja sam prvo zaboravio slučaj kad mi je broj negativan, pa podsjećam ako ima još takvih...

#33:  Autor/ica: mini PostPostano: 17:48 uto, 8. 11. 2011
    —
imam implementaciju btree pomoću polja. složila sam si sve implementacije osim famoznog create-a. zbrljala sam svakakve petlje, al mi ne ide. molim vas, ako nekom nije problem da napiše create.

#34:  Autor/ica: zvonkec PostPostano: 19:25 uto, 8. 11. 2011
    —
void create(labeltype l, BTREE TL,BTREE TR, BTREE* T){

*T=(celltype*)malloc(sizeof(celltype));
(*T)->label=l;
(*T)->leftchild=TL;
(*T)->rightchild=TR;}

#35:  Autor/ica: mini PostPostano: 19:47 uto, 8. 11. 2011
    —
hvala, al to je pomoću pointera.

#36:  Autor/ica: integral PostPostano: 19:49 uto, 8. 11. 2011
    —
Treba mi funkcija INSERT za liste pomoću pointera. Jel mi može neko reći gdje je u ovom kodu greška? Tj., znam da ne smije bili taj malloc, već da treba drukčije odrediti next poziciju, ali ne kužim kako:

void INSERT (elementtype x, position p, LIST *L){
position temp=FIRST(*L);
do{
temp = NEXT(temp,*L);
} while (temp!= NEXT(p,*L));

p→next = (celltype *) malloc (sizeof(celltype));
p→next→element = x;
p→next→next = temp;
}

#37:  Autor/ica: ivaa PostPostano: 10:38 sri, 9. 11. 2011
    —
molim za pomoć, kako bi za unesene podatke provjerila jesu li u inorderu, postorderu ili preorderu?

u dz mi piše:
Ulazni podaci: sami osmislite način na koji ćete omogućiti korisniku da unese bilo koje stablo sa oznakama tipa char

ili mogu odmah odredit da se podaci unose u npr. preorderu?

#38:  Autor/ica: CROmpir PostPostano: 11:27 sri, 9. 11. 2011
    —
Kako mogu kod BINARNOG STABLA provjeriti je li NODE iz STABLA??

samo if(n==LAMBDA) error("Cvor nije iz stabla") ???

BTREE impl. pomocu pointera

#39:  Autor/ica: Malina_1 PostPostano: 13:57 sri, 9. 11. 2011
    —
Za zadaću imam zadatak : Implementirajte a.t.p. STACK pomoću pointera i napišite potprogram koji logički izraz iz infix oblika prebacuje u postfix oblik. Problem trebate riješiti pomoću stoga.
Na primjer, za ulazne podatke:
A|B&(C^E|D)
treba ispisati:
ABCE^D|&|

Program mi radi dobro ako u ulaznom podatku ne spomenem : ^, što je taj ^, mislim inače je to matematički simbol za &. Ali ovdje valjda nije. I kako idu prioriteti među logičkim simbolima? Unaprijed hvala nekome tko će odgovoriti na ovo pitanje. Smile

#40:  Autor/ica: satja PostPostano: 15:10 sri, 9. 11. 2011
    —
Malina_1 (napisa):

Program mi radi dobro ako u ulaznom podatku ne spomenem : ^, što je taj ^, mislim inače je to matematički simbol za &. Ali ovdje valjda nije. I kako idu prioriteti među logičkim simbolima? Unaprijed hvala nekome tko će odgovoriti na ovo pitanje. Smile


To je XOR, vraća istinu ako je točno jedan od dva operanda istinit.

Prioriteti su AND, XOR, OR iliti &, ^, |

#41:  Autor/ica: minnie m. PostPostano: 15:51 sri, 9. 11. 2011
    —
Mene također zanima:
yellow submarine (napisa):
Ako u zadatku piše:

Kod:

Za ulazne podatke:
7
2 2 7
2 1 4
1 6
3 2 7 5
1 4
1 3
2 1 4
treba ispisati:
1 2 4 5 7


Je li to znači da ispis mora nužno biti tim redoslijedom ili je točno i ako se ispiše npr. 12754 ?

Hvala. Smile

Help! Wink

#42:  Autor/ica: Buki PostPostano: 15:59 sri, 9. 11. 2011
    —
pitanje u vezi funkcije DEQUEUE kod implementacije reda pomocu pointera:

Kod:

void DEQUEUE (QUEUE *Q ptr) {
celltype *temp;
if (EMPTY(*Q ptr)) error("queue is empty");
else {
temp = Q ptr->front;
Q ptr->front = Q ptr->front->next;
free(temp);
}
}


cemu sluzi ovaj temp? jel ne bi moglo samo biti:

Kod:

void DEQUEUE (QUEUE *Q ptr) {
celltype *temp;
if (EMPTY(*Q ptr)) error("queue is empty");
else {
Q ptr->front = Q ptr->front->next;
free(Q ptr->front);
}
}

#43:  Autor/ica: Tomislav PostPostano: 16:10 sri, 9. 11. 2011
    —
Ima li tko zadatak:

"Implementirajte a.t.p. STACK pomoću pointera i napišite potprogram koji računa vrijednost aritmetičkog izraza zadanog u postfix obliku. Problem trebate riješiti pomoću stoga."?

#44:  Autor/ica: CobsLokacija: Geto PostPostano: 16:52 sri, 9. 11. 2011
    —
Buki (napisa):
pitanje u vezi funkcije DEQUEUE kod implementacije reda pomocu pointera:

Kod:

void DEQUEUE (QUEUE *Q ptr) {
celltype *temp;
if (EMPTY(*Q ptr)) error("queue is empty");
else {
temp = Q ptr->front;
Q ptr->front = Q ptr->front->next;
free(temp);
}
}


cemu sluzi ovaj temp? jel ne bi moglo samo biti:

Kod:

void DEQUEUE (QUEUE *Q ptr) {
celltype *temp;
if (EMPTY(*Q ptr)) error("queue is empty");
else {
Q ptr->front = Q ptr->front->next;
free(Q ptr->front);
}
}


nije jer bi u drugom slučaju pobrisao novi prvi element u redu... ajd jedan primjer:

recimo da imaš red od 5 elementa i da su poredani kako ih pišem: 1,2,3,4,5
( znači prvi element koji ide van je 1 )
i neka adrese na kojima su ti elementi su redom: 234, 238, 242, 246, 250

u prvom primjeru ( onom točnom ) stavio bi:
temp = 234;
red→prvi_element = 238;
oslobodi_alociranu_memoriju_na_adresi( temp ); // 234

i sad bi red zgledo: 2,3,4,5 ( sa adresama 238,242,246,250 )

u drugom primjeru bi stavio:
red→prvi_element = 238;
oslobodi_alociranu_memoriju_na_adresi( red→prvi_element ); // 238

znači uništio si si prvi element u redu i više nemreš uopće pristupiti samom redu jer ti sad red→prvi_element pokazuje na NULL pokazivač ( taj dio memorije je oslobođen ). Znači nemreš pristupit redu + kaj si prvi element ( onaj na adresi 234 ) zanemario i ta memorija ostaje alocirana

#45:  Autor/ica: mrma PostPostano: 17:52 sri, 9. 11. 2011
    —
Ovako glasi zadata:
Implementirajte a.t.p. QUEUE pomoću vezane liste. Vezana lista je implementirana pomoću kursora. Nadalje napravite algoritam za pronalaženje skupa svih čvorova neusmjerenog grafa do kojih se može doći iz vrha 1. Neusmjereni graf implementirajte kao (simetričnu) matricu nula i jedinica (pretpostavimo da su vrhovi numerirani 1, 2, …, n).
Zanima ne da li se misli pod ovu implementaciju QUEUE-a pomocu vezane liste na implementaciju pomocu cirkularnog polja ili sta, tj je li mogu imati u structu kursor na zadnji i prvi clan ili samo jedan kursor tipa na sljedeci clan?

#46:  Autor/ica: FikusLokacija: Somewhere around the world PostPostano: 20:34 sri, 9. 11. 2011
    —
Moze pomoc oko liste, ja imam implementaciju iz skripte pa me zanima di je tocno grecka

Kod:

typedef struct _celija {
  elementtype element;
  struct _celija *next;
} celija;

position MAKE_NULL_L(LIST *L) {
  *L = (celija*) malloc(sizeof(celija));
  (*L)->next = NULL;
  return *L;
}

Dakle kod prvog mi ocita gresku kod elementtypea (expected specifier list before elementtype)
i kod make null a i ostalih funkcija mi kaze da u mojoj strukturi nema člana koji se zove next
i jos mi ocitava gresku za malloc, kaze :incompatibile implicit declaration of built-in function malloc
Eto to bi bilo sve sto me zanima, dakle glavno pitanje je kako to sve popravit da bi radilo, hvala Smile

#47:  Autor/ica: pedro PostPostano: 20:59 sri, 9. 11. 2011
    —
Fikus (napisa):
Moze pomoc oko liste, ja imam implementaciju iz skripte pa me zanima di je tocno grecka

Kod:

typedef struct _celija {
  elementtype element;
  struct _celija *next;
} celija;

position MAKE_NULL_L(LIST *L) {
  *L = (celija*) malloc(sizeof(celija));
  (*L)->next = NULL;
  return *L;
}

Dakle kod prvog mi ocita gresku kod elementtypea (expected specifier list before elementtype)
i kod make null a i ostalih funkcija mi kaze da u mojoj strukturi nema člana koji se zove next
i jos mi ocitava gresku za malloc, kaze :incompatibile implicit declaration of built-in function malloc
Eto to bi bilo sve sto me zanima, dakle glavno pitanje je kako to sve popravit da bi radilo, hvala Smile


jesi definirao listu i position?

#48:  Autor/ica: kikyca PostPostano: 21:52 sri, 9. 11. 2011
    —
Jel moze mala pomoc. U mainu mi nesto cudno dodaje na kraj polja pa zbog toga ne rade pozivi funkcija. Zadatak je:
Dvostrani red DQUEUE je lista kojoj se elementi mogu ubacivati i izbacivati na
bilo kojem kraju (no ne u sredini). Implementirajte dvostrani red pomocu polja.
Definirajte elementtype kao int.

Ulazni podaci: niz naredbi koje opisuju operacije nad poljem
(naredbe su UBACI KRAJ n, UBACI POCETAK n, IZBACI KRAJ, IZBACI POCETAK).
Izlazni podaci: za svaku naredbu ispisati sadrzaj cijelog reda
u tom trenutku (mozete ispisivati odmah nakon sto ucitate pojedinu naredbu, a ne tek nakon sto ucitate sve).
Na primjer, za ulazne podatke:
UBACI POCETAK 3
UBACI KRAJ 7
UBACI POCETAK 17
IZBACI KRAJ
IZBACI POCETAK
treba ispisati:
3
3 7
17 3 7
17 3

a ovo je moj kod
Kod:
 #include<stdio.h>
 #include<stdlib.h>
 #include<ctype.h>
 #include<string.h>

 #define MAXL 100

 typedef int elementtype;

 typedef struct{
 elementtype elements[MAXL];
 int pocetak, kraj;
 } DQUEUE;

 int addone(int i){
 return((i+1)% MAXL);
 }

 void MAKE_NULL(DQUEUE *Q){
 Q->pocetak=0;
 Q->kraj=MAXL-1;
 }

 int EMPTY(DQUEUE Q){
 if (Q.pocetak == addone(Q.kraj))
 return 1;
 else
 return 0;
 }

 elementtype FRONT(DQUEUE Q){
 if (EMPTY(Q))
 printf("Red je prazan!");
 else
 return Q.elements[Q.pocetak];
 }

 void UBACI_KRAJ(elementtype x, DQUEUE *Q){
 if(addone(addone(Q->kraj))==(Q->pocetak))
 printf("Red je pun!");
 else{
 Q->kraj=addone(Q->kraj);
 Q->elements[Q->kraj]=x;
 }
 }

 void IZBACI_POCETAK(DQUEUE *Q){
 if(EMPTY(*Q))
 printf("Red je prazan!");
 else
 Q->pocetak=addone(Q->pocetak);
 }

 void IZBACI_KRAJ(DQUEUE *Q){
 if(EMPTY(*Q))
 printf("Red je prazan!\n");
 else if(Q->kraj>0)
 --Q->kraj;
 else Q->kraj=MAXL-1;
 }

 void UBACI_POCETAK(elementtype x, DQUEUE *Q) {
 if(addone(addone(Q->kraj))==(Q->pocetak))
 printf("Red je pun!\n");
 else {
 Q->kraj=addone(addone(Q->kraj));
 int i=Q->kraj;
 while(i!=Q->pocetak) {
 Q->elements[i]=Q->elements[i-1];
 if(i>0) --i;
 else i=MAXL-1;
 }
 Q->elements[Q->pocetak]=x;
 }
 }


 int main() {

 DQUEUE Q;
 elementtype x;
 char funkcija[MAXL], pomocni[MAXL], broj[MAXL];
 int i, j, br=0, n;

 MAKE_NULL(&Q);

 while(1) {
 i=0; j=0;
 gets(funkcija);
 n=strlen(funkcija);
 while(i<n) {
 if(funkcija[i]==' ') {
 if(br==0) pomocni[i]=funkcija[i];
 br++;
 }
 else if(isdigit(funkcija[i])) {
 broj[j]=funkcija[i];
 j++;
 }
 else pomocni[i]=funkcija[i];
 i++;
 }
 x=atoi(broj);

 if(pomocni=="UBACI POCETAK") UBACI_POCETAK(x, &Q);
 else if(pomocni=="IZBACI POCETAK") IZBACI_POCETAK(&Q);
 else if(pomocni=="UBACI KRAJ") UBACI_KRAJ(x, &Q);
 else if(pomocni=="IZBACI KRAJ") IZBACI_KRAJ(&Q);
 else break;
 if(!EMPTY(Q)) {
 i=Q.pocetak;
 while(i!=Q.kraj) {
 printf("%d ", Q.elements[i]);
 addone(i);
 }
 printf("\n");
 }
 }

 system("pause");
 return 0;

 }

#49:  Autor/ica: Gea_ PostPostano: 22:31 sri, 9. 11. 2011
    —
Pejstam dio koda koji mi se skroz cudno ponasa.Svaki put kad mi uđe u petlju preskoči prvi scanf. Dakle 'čeka' tek kada treba upisati desno dijete.
Probala sam svakako, ili totalno zablokira kad prođe petlju jednom, dvaput ili samo 'čeka' na drugom scanf-u u petlji. Svaka pomoć je dobrodošla.

Kod:

 while ( i < MAXLENGHT )
    {
        if ( (*B).labels[i] != LAMBDA )
        {
            // ni L ni D dijete ne stanu u polje, pa idem na sljedeci node
            if ( 2*i+1 > MAXLENGHT && 2*i+2 > MAXLENGHT )
            {
                i++;
                break;
            }
            printf("Unesi lijevo dijete cvora %d na mjesto %d:\n", i,2*i+1);
            scanf ("%c", &c);
            (*B).labels[2*i+1]=c;
            if ( (*B).labels[2*i+1] == '#' )
                return;

            printf("Unesi desno dijete cvora %d na mjesto %d:\n", i,2*i+2);
            scanf ("%c ", &c);
            (*B).labels[2*i+2]=c;
            if ( (*B).labels[2*i+2] == '#' )
                return;
        }
        ++i;
    }

#50:  Autor/ica: lucka PostPostano: 22:55 sri, 9. 11. 2011
    —
Moze netko pomoci oko ovog zadatka:
Implementirajte a.t.p. LIST pomoću pointera i napišite funkciju
void MERGE_SORT (LIST L1, LIST *L2)
za sortiranje liste. Program treba omogućiti sortiranje silazno i uzlazno.


Ulazni podaci: broj članova liste, članovi liste, način sortiranja
Izlazni podaci: sortirana lista
Na primjer, za ulazne podatke:
5
7 3 8 5 2
silazno
treba ispisati:
8 7 5 3 2
Javlja mi svakojake greske u kodu i ne znam vise sta napravit...



#include <stdio.h>
#include <stdlib.h>

typedef int elementtype;

typedef int element;

typedef struct cell_tag{
elementtype element;
struct cell_tag *next;
}celltype;

typedef celltype *LIST;

typedef celltype *position;

position END (LIST L) {
position q;
q=L;
while (q→next != NULL)
q=q→next;
return q;
}

position MAKE_NULL (LIST *Lptr) {
*Lptr=(celltype*)malloc(sizeof(celltype));
(*Lptr)→next=NULL;
return (*Lptr);
}

void INSERT (elementtype x, position p, LIST *Lptr) {
position temp;
temp=p→next;
p→next=(celltype*)malloc(sizeof(celltype));
p→next→element=x;
p→next→next=temp;
}

void DELETE (position p) {
position temp;
temp=p→next;
p→next=p→next→next;
free (temp);
}

position FIRST (LIST *L) {
return (*L);
}

position NEXT (position p, LIST L) {
position q;
q=p→next;
return q;
}

element RETRIEVE (position p, LIST L) {
element q;
q=p→element;
return q;
}

position PREVIOUS (position p, LIST L) {
position q;
q=L;
while (q→next != p)
q=q→next;
return q;
}

void ISPISI (LIST L) {
position q;
for (q=L; q!=NULL; q=q→next)
printf ("%d ", q→element);
}

void MERGE_SORT(int nacin, LIST L1, LIST *L2) {
position p1, p2;
element najmanji, najveci;
p2=MAKE_NULL(L2);

if (nacin == 1) {
p1=FIRST(L1);
najmanji=RETRIEVE(p1,L1);
for (p1; p1=NEXT(p1, L1); p1 != END(L1)){
if (najmanji < RETRIEVE(p1,L1)) {
INSERT(najmanji,p2, L2);
}
}
p1=NEXT(p1, L1);
}

else if (nacin == -1) {
p1=FIRST(L1);
najveci=RETRIEVE(p1,L1);
for (p1; p1=NEXT(p1, L1); p1!= END(L1)){
if (najveci > RETRIEVE(p1,L1)) {
INSERT(najveci,p2, L2);
}
}
p1=NEXT(p1, L1);
}

}

int main (void) {

int n, i, a, value_uzl;
LIST *L1, *header=NULL, L2;
char nacin_sorta [8];
char s[]="uzlazno";
L2=MAKE_NULL(&L2);
value_uzl=atoi(s);

printf ("Ucitaj broj elemenata liste: ");
scanf ("%d", &n);

for (i=0; i<n; i++) {
L1=(celltype*)malloc(sizeof(celltype));
L1→next=header;
header=L1;

printf ("Ucitaj element liste: ");
scanf ("%d", &(*L1)→element);
}

printf ("Zelite li sortirati listu uzlazno ili silazno?");
scanf ("%s", nacin_sorta);
a=atoi(nacin_sorta);

if (a==value_uzl) {
MERGE_SORT(1, &L1, L2);
ISPISI(&L1);
}
else {
MERGE_SORT(-1, &L1, L2);
ISPISI(&L1);
}


}
[/code]

#51:  Autor/ica: mini PostPostano: 23:04 sri, 9. 11. 2011
    —
@gea
probaj napisat scanf (" %c") . dakle, razmak između navodnika i %

#52:  Autor/ica: Gea_ PostPostano: 23:11 sri, 9. 11. 2011
    —
mini (napisa):
@gea
probaj napisat scanf (" %c") . dakle, razmak između navodnika i %


HVALAAA karma ++++++++++++++++++++++++++
Sad vidim da sam i krivi kod poslala u biti ovdje, zbog svih promjena i promjenica. Ali dobro, rješeno Smile

#53:  Autor/ica: Lepi91 PostPostano: 0:04 čet, 10. 11. 2011
    —
napišite potprogram koji kreira binarno stablo iz prefix oblika aritmetičkog izraza.
to mi je jedino ostalo u zadatku...sve ostalo imam i ovo nikako nemogu napravit,neznam kako...MOLIM POMOĆ Rolling Eyes Rolling Eyes
raspravljali smo i nesto ovako bi trebalo ali nemogu to pretocit u c...Uzmemo prvi znak
to stavimo u korijen
Onda stavljamo
idući znak u lijevo dijete
i nastavimo stavljati znakove
u lijevo dijete
dokle god su operatori
dakle npr ako ti je input
+*+
onda ćemo staviti + u korijen
pa * kao lijevo dijete od korijena
pa idući + kao lijevo dijete od *
A kad naiđeš na prvi koji nije operator
njega staviš kao desno dijete
Mislim da je nešto u tom stilu...ako itko zna i moze napisati kako to ide stvarno bi bio jako jako zahvalan...

#54:  Autor/ica: pbakic PostPostano: 0:47 čet, 10. 11. 2011
    —
Ako je zadana implementacija stabla pomocu pointera (koja omogucuje lagani CREATE), onda se moze napraviti isto kao i evaluacija prefix izraza pomocu stacka:
1) Napravimo STACK koji ce cuvati stabla

2) krecemo se po zadanom izrazu, zdesna nalijevo
-ako je trenutni znak operand, stavi ga na stack
(pri stavljanju na stack moramo pretvoriti operand u jednocvorno stablo kojemu je u korijenu zapisan taj operand. to mozemo napraviti pomocu 2 makenull-a i jednog create-a)

-ako je trenutni znak operator, "digni" prva dva elementa sa stacka (opcenito, to ce biti neka 2 stabla) i sastavi stablo kojemu je u korijenu operator, lijevo dijete jedan element, a desno drugi od ova dva koja smo digli sa stacka (pritom moramo paziti na poredak lijevo/desno dijete, jer postoje i nekomutativne operacije)
dobiveno stablo stavi na stack (dva iskoristena elementa smo maknuli)

Kad zavrsimo postupak (tj procitamo cijeli izraz), na stacku bi se trebao nalaziti samo jedan element - trazeno stablo.

Nap:
ovdje je stack koristen samo teoretski... u jednom trenutku moramo dici 2 elementa sa stacka pa buduci da nemamo funkciju koja (neovisno o implementaciji) kopira stabla, moramo biti u mogucnosti direktno pozvati CREATE na zadnja 2 elementa stacka u ulozi podstabala. Zato je vjerojatno prakticnije koristiti obican niz umjesto stacka

P.S: vjerojatno si je najbolje nacrtat ovaj algoritam na nekom malom primjeru i "isprobat" ga tako

#55:  Autor/ica: Lepi91 PostPostano: 0:52 čet, 10. 11. 2011
    —
a ako je implementacija binarnog pomocu polja,kako onda?

#56:  Autor/ica: minora665 PostPostano: 1:17 čet, 10. 11. 2011
    —
Molim vas ako je tko budan neka mi pomogne!

Ugl, gotova sam s programom osim sto mi javlja tri greska:
(1) kaze compiler da exit() nije definirana pa sta nije to neka funkcija koja postoji u C-u? ako ne sta da radim kako da ju napisem...
(2) kaze da ne mogu usporedivati pointer i integer a samo sam napisala T→labels[2*i+1]!='$' ok kuzim da bi bilo bolje da je T.labels a ne T→labels
ali kakve to veze ima s integerom gdje je tu integer?
(3) slicno, javlja mi kao invalid conversion izmedu char i char*... kako da charu* pridruzim komkretan char npr '$' ?

Hvala unaprijed!

#57:  Autor/ica: pbakic PostPostano: 2:19 čet, 10. 11. 2011
    —
Ako je s poljem, onda je stvarno lakse umetati djecu...

Slicno kao sto si vec napisao, uglavnom:
Umeces djecu lijevo sve dok ne dodjes do operanda. Njega isto umetnes
lijevo, al nakon toga se dizes gore do prvog slobodnog desnog mjesta. Na to desno mjesto umeces iduci znak, a od tamo ponavljas postupak
I tako sve dok ne iskoristis cijeli string Smile

#58:  Autor/ica: Lepi91 PostPostano: 3:55 čet, 10. 11. 2011
    —
Implementirajte a.t.p. BTREE pomoću polja i napišite potprogram koji kreira binarno stablo iz prefix oblika aritmetičkog izraza. Za kontrolu napravite i preorder obilazak dobivenog stabla.


Ulazni podaci: string koji sadrži prefix oblik izraza
Izlazni podaci: binarno stablo koje odgovara unešenom izrazu: ako stablo ima n čvorova onda treba ispisati n redova, svaki red je oblika cvor, lijevo dijete, desno dijete (ako nekog djeteta nema, ispišite NULL). Na kraju još ispišite PREORDER oblilazak dobivenog stabla.
Na primjer, za ulazne podatke:
+A*B-*CED
treba ispisati:
+ A *
A NULL NULL
* B -
B NULL NULL
- * D
* C E
C NULL NULL
E NULL NULL
D NULL NULL
+A*B-*CED

Kod:

#include<stdio.h>

#define MAXL 100

typedef char labeltype;

typedef int node;

const node LAMBDA=-1;

typedef struct
    {
    labeltype LABELS[MAXL];
    } BTREE;

void MAKE_NULL(BTREE *B)
    {
        int i;
        for(i=0;i<MAXL;i++)
            B->LABELS[i]='-';
    }

int EMPTY(BTREE B)
    {
        int i=1,j=0;
        while(i && j<MAXL)
            {
                if (B.LABELS[j]!='-')
                    i=0;
                j++;
            }
        return i;
    }

node CREATE (labeltype l, BTREE TL, BTREE TR, BTREE *B)
    {
        int i=0,k1=1,m=1,k2=2,j;
        B->LABELS[0]=l;
        while(k1<MAXL && k2<MAXL)
            {
                j=m;
                while(j>0)
                    {
                        B->LABELS[k1]=TL.LABELS[i];
                        B->LABELS[k2]=TR.LABELS[i];
                        i++;
                        k1++;
                        k2++;
                        j--;
                    }
                k1=k1+m;
                m=m*2;
                k2=k2+m;
            }
        return 0;
    }

void LEFT_SUBTREE(BTREE B, BTREE *TL)
    {
        int i=0,k=1,l=1,j;
        while(k<MAXL)
            {
                j=l;
                while(j>0)
                    {
                        TL->LABELS[i]=B.LABELS[k];
                        i++;
                        k++;
                        j--;
                    }
                k=k+l;
                l=l*2;
            }
    }

void RIGHT_SUBTREE(BTREE B, BTREE *TR)
    {
        int i=0,k=2,l=1,j;
        while(k<MAXL)
            {
                j=l;
                while(j>0)
                    {
                        TR->LABELS[i]=B.LABELS[k];
                        i++;
                        k++;
                        j--;
                    }
                l=l*2;
                k=k+l;
            }
    }

node INSERT_LEFT_CHILD(labeltype l, node n, BTREE *B)
    {
        B->LABELS[n*2+1]=l;
        return n*2+1;
    }

node INSERT_RIGHT_CHILD(labeltype l, node n, BTREE *B)
    {
        B->LABELS[n*2+2]=l;
        return n*2+2;
    }

void DELETE(node n, BTREE *B)
    {
        B->LABELS[n]='-';
    }

node ROOT(BTREE B)
    {
        return 0;
    }

node LEFT_CHILD(node n, BTREE B)
    {
        if ((2*n+1)>=MAXL || B.LABELS[2*n+1]=='-')
            return LAMBDA;
        return 2*n+1;
    }

node RIGHT_CHILD(node n, BTREE  B)
    {
        if ((2*n+2)>=MAXL || B.LABELS[2*n+2]=='-')
            return LAMBDA;
        return 2*n+2;
    }

node PARENT(node n, BTREE B)
    {
        if (n==0)
            return LAMBDA;
        return (n-1)/2;
    }

labeltype LABEL(node n, BTREE B)
    {
        return B.LABELS[n];
    }

void CHANGE_LABEL(labeltype l, node n, BTREE *B)
    {
        B->LABELS[n]=l;
    }

int UNOS(int i, node j, char prefix[MAXL], BTREE *B)
    {
        node n1,n2;
        n1=INSERT_LEFT_CHILD(prefix[i], j, B);
        if (prefix[i]=='+' || prefix[i]=='-' || prefix[i]=='*' || prefix[i]=='/')
            i=UNOS(i+1,n1, prefix, B);
        i++;
        n2=INSERT_RIGHT_CHILD(prefix[i], j, B);
        if (prefix[i]=='+' || prefix[i]=='-' || prefix[i]=='*' || prefix[i]=='/')
            i=UNOS(i+1,n2, prefix, B);
        return i;
    }

void OBILAZAK(node i,BTREE B)
    {
        node n1,n2;
        printf("%c ", LABEL(i,B));
        n1=LEFT_CHILD(i,B);
        if (n1==LAMBDA)
                printf("NULL ");
            else
            printf("%c ",LABEL(n1,B));
        n2=RIGHT_CHILD(i,B);
        if (n2==LAMBDA)
                printf("NULL");
            else
            printf("%c",LABEL(n2,B));
        printf("\n");
        if (n1!=LAMBDA)
            OBILAZAK(n1,B);
        if (n2!=LAMBDA)
            OBILAZAK(n2,B);
    }

void PREORDER(node n,BTREE B)
    {
        if (n==LAMBDA) return;
        printf("%c", LABEL(n,B));
        PREORDER(LEFT_CHILD(n,B),B);
        PREORDER(RIGHT_CHILD(n,B),B);
    }

int main()
{
    BTREE P, prazno;
    char prefix[MAXL];
    scanf("%s", prefix);
    MAKE_NULL(&P);
    MAKE_NULL(&prazno);
    CREATE(prefix[0], prazno, prazno, &P);
    UNOS(1,0, prefix, &P);
    OBILAZAK(0,P);
    PREORDER(0,P);
    return 0;
}



uglavnom neznam sta mi je krivo ali krivo mi ispisuje,pa ako itko ista vidi,zna neka mi molim vas napise sta moram promijenit...prva dva reda dobro ispise vec treci fula...*B NULL a treba *B-...hvala unaprijed

#59:  Autor/ica: sailor m PostPostano: 11:28 čet, 10. 11. 2011
    —
ulazni podaci su inorder i postorder
Izlazni podaci: ako stablo ima n čvorova, onda treba ispisati n redova: u svakom redu je oznaka jednog vrha i oznake njegove lijevog i desnog djeteta (NULL ako ih nema). Te redove možete ispisati u bilo kojem redoslijedu.
Na primjer, za ulazne podatke:
DGBFCEA
GDFECAB
treba ispisati:
B D A
D NULL G
A C NULL
C F E
F NULL NULL
E NULL NULL


Kod:
char REKONSTRUIRAJ( char *IN, char *POST)
{   char *Left_IN, *Right_IN, *Left_POST, *Right_POST, right, left;
    int n, i, j, t;
    char roditelj;
    n=strlen(POST);
    roditelj=POST[n-1];

    for(i=0;i<n; i++)
      {
          if(IN[i]==roditelj)
             {
                 Left_IN=(char*)malloc((i)*sizeof(char));
                 for(j=0; j<i; j++)
                    {
                        Left_IN[j]=IN[j];
                    }

                 Right_IN=(char*)malloc((n-i-1)*sizeof(char));
                 for(j=0; j+i+1<n; j++)
                    {
                        Right_IN[j]=IN[j+i+1];
                    }

                 break;
             }
      }


             Left_POST=(char*)malloc(i*sizeof(char));

             for(j=0; j<i; j++)
                {
                    Left_POST[j]=POST[j];
                }

             Right_POST=(char*)malloc((n-i-1)*sizeof(char));
             for(j=0; j+i<n-1; j++)
                {
                   Right_POST[j]=POST[j+i];
                }



    if (strlen (Left_IN) == 0)
          left = '-'; // to je NULL
        else
           left = REKONSTRUIRAJ (Left_IN, Left_POST);


    if (strlen (Right_IN) == 0)
         right = '-'; // to je NULL
       else
           right = REKONSTRUIRAJ (Right_IN, Right_POST);


    printf ("Cvor: %c %c %c\n", roditelj, left, right);

    free (Left_IN);
   free (Left_POST);
   free (Right_POST);

   return roditelj;

}

int main(void)
{
   int n;
   char *IN, *POST;

    printf("unesi broj cvorova:\n");
    scanf("%d", &n);

    IN=(char*)malloc((n)*sizeof(char));
    POST=(char*)malloc((n)*sizeof(char));

    printf("Unesi INORDER:\n");
    scanf("%s", IN);

    printf("Unesi POSTORDER:\n");
    scanf("%s", POST);


   REKONSTRUIRAJ (IN, POST);

   return 0;
}

kad unesem podatke program mi nista ne vrati...?
može pomoć.


i pitanje:
kada je int i=0, char *IN i IN=(char*)malloc(i*sizeof(char))
koliki će biti strlen(IN)?

#60:  Autor/ica: CobsLokacija: Geto PostPostano: 14:39 pet, 11. 11. 2011
    —
prvo bi trebo u ovoj alokaciji u main funkcijij nadodat +1
znaci (n+1)*sizeof(...)
jer ti treba mjesto i zadnji znak '\0'

( za i = 0 mislim da vrati NULL pointer, jer alociraš ništa memorije, ili baci neku grešku.. )

algoritam za rekonstrukciju nisam ni gledo, ali google ti daje masu ideja ( rješenja Very Happy )



Forum@DeGiorgi -> Strukture podataka i algoritmi


output generated using printer-friendly topic mod. Vremenska zona: GMT + 01:00.

Stranica 1 / 1.

Powered by phpBB © 2001,2002 phpBB Group
Theme created by Vjacheslav Trushkin