Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
hipernova Forumaš(ica)
Pridružen/a: 25. 09. 2011. (20:15:21) Postovi: (C)16
Lokacija: Zagreb
|
Postano: 1:04 čet, 25. 10. 2012 Naslov: 1. domaca zadaca |
|
|
Pozdrav!
Pokusavam implementirati atp stog sa pointerima, ali ima par stvari koje ne kuzim.
Evo kod:
[code:1]#include<stdio.h>
typedef struct _stack
{
char zn;
struct _stack *next;
}stack;
typedef stack *stog;
void MAKE_NULL(stog *s)
{
*s=(stack*)malloc(sizeof(stack));
(*s)->next= NULL;
return;
}
main()
{
stack *s;
MAKE_NULL(s);
return 0;
}
[/code:1]
prvi typedeff je zapravo struktura celija, drugi typedeff nisam siguran za sto tocno sluzi, ali mi nikako drugacije nece kompajlirati(iako i za ovo baca warninge)
također nisam siguran kako tocno ide funkcija MAKE_NULL jer u skripit pise da s=NULL, ali to mi sa ovime ne radi, a u nekoj drugoj skripti sam procitao da pointer next mora biti postavljen na NULL.
Ako bi mi netko mogao objasnit dal je prvi typedeff dobar, cemu tocno ovaj drugi typedeff i kako se to moze napraviti bez njega, i kako tocno MAKE_NULL napraviti.
Hvala
Pozdrav!
Pokusavam implementirati atp stog sa pointerima, ali ima par stvari koje ne kuzim.
Evo kod:
Kod: | #include<stdio.h>
typedef struct _stack
{
char zn;
struct _stack *next;
}stack;
typedef stack *stog;
void MAKE_NULL(stog *s)
{
*s=(stack*)malloc(sizeof(stack));
(*s)->next= NULL;
return;
}
main()
{
stack *s;
MAKE_NULL(s);
return 0;
}
|
prvi typedeff je zapravo struktura celija, drugi typedeff nisam siguran za sto tocno sluzi, ali mi nikako drugacije nece kompajlirati(iako i za ovo baca warninge)
također nisam siguran kako tocno ide funkcija MAKE_NULL jer u skripit pise da s=NULL, ali to mi sa ovime ne radi, a u nekoj drugoj skripti sam procitao da pointer next mora biti postavljen na NULL.
Ako bi mi netko mogao objasnit dal je prvi typedeff dobar, cemu tocno ovaj drugi typedeff i kako se to moze napraviti bez njega, i kako tocno MAKE_NULL napraviti.
Hvala
|
|
[Vrh] |
|
hipernova Forumaš(ica)
Pridružen/a: 25. 09. 2011. (20:15:21) Postovi: (C)16
Lokacija: Zagreb
|
Postano: 16:07 čet, 25. 10. 2012 Naslov: |
|
|
evo nasao sam rjesenje tu: [url]http://degiorgi.math.hr/forum/viewtopic.php?t=10333[/url]
ali imam drugi problem :)
[code:1]#include<stdio.h>
typedef struct _stack
{
char zn;
struct _stack *next;
}stack;
typedef stack *stog;
void MAKE_NULL(stog *s)
{
s=NULL;
}
void PUSH(char x, stog *s)
{
stack *n;
n=(stack*)malloc(sizeof(stack));
n->zn=x;
n->next=s;
*s=n;
}
int main()
{
stog s;
MAKE_NULL(&s);
PUSH('a',&s);
printf("\n slovo je %c", s->zn);
PUSH('B',&s);
printf("\n sljedece je %c", s->zn);
return 0;
}[/code:1]
program radi, ali mi izbacuje 2 warninga
[quote]warning: incompatible implicit declaration of built-in function 'malloc'|
warning: assignment from incompatible pointer type|
[/quote]
zna li netko zbog cega se javljaju ova upozorenja?
evo nasao sam rjesenje tu: http://degiorgi.math.hr/forum/viewtopic.php?t=10333
ali imam drugi problem
Kod: | #include<stdio.h>
typedef struct _stack
{
char zn;
struct _stack *next;
}stack;
typedef stack *stog;
void MAKE_NULL(stog *s)
{
s=NULL;
}
void PUSH(char x, stog *s)
{
stack *n;
n=(stack*)malloc(sizeof(stack));
n->zn=x;
n->next=s;
*s=n;
}
int main()
{
stog s;
MAKE_NULL(&s);
PUSH('a',&s);
printf("\n slovo je %c", s->zn);
PUSH('B',&s);
printf("\n sljedece je %c", s->zn);
return 0;
} |
program radi, ali mi izbacuje 2 warninga
Citat: | warning: incompatible implicit declaration of built-in function 'malloc'|
warning: assignment from incompatible pointer type|
|
zna li netko zbog cega se javljaju ova upozorenja?
|
|
[Vrh] |
|
Loo Forumaš(ica)
Pridružen/a: 11. 06. 2012. (16:02:07) Postovi: (D0)16
Spol:
|
|
[Vrh] |
|
hipernova Forumaš(ica)
Pridružen/a: 25. 09. 2011. (20:15:21) Postovi: (C)16
Lokacija: Zagreb
|
|
[Vrh] |
|
Loo Forumaš(ica)
Pridružen/a: 11. 06. 2012. (16:02:07) Postovi: (D0)16
Spol:
|
|
[Vrh] |
|
hipernova Forumaš(ica)
Pridružen/a: 25. 09. 2011. (20:15:21) Postovi: (C)16
Lokacija: Zagreb
|
Postano: 19:05 čet, 25. 10. 2012 Naslov: |
|
|
da, tako radi, ali nisam siguran dal je to tocno. jer i dalje izbacuje warning :/
EDIT: Evo sad sam stoposto siguran da push radi jer sam ubacio provjere malo bolje.Ali ne radi pop :(
evo kod za ovo sta sam dosad napravio, ako netko vidi razlog zasto pop ne radi vicite
[code:1]#include<stdio.h>
#include<stdlib.h>
typedef struct _stack
{
char zn;
struct _stack *next;
}stack;
typedef stack *stog;
void MAKE_NULL(stog *s)
{
s=NULL;
}
void PUSH(char x, stog *s)
{
stack *n=*s;
*s=(stack*)malloc(sizeof(stack));
(*s)->zn=x;
(*s)->next=n;
}
void POP(stog *s)
{
printf("\n funkcija pop");
(*s)=(*s)->next->next;
}
int main()
{
stog s;
s=(stack*)malloc(sizeof(stack));
MAKE_NULL(&s);
PUSH('a',&s);
printf("\n Prvo slovo u stogu je %c", s->zn);
PUSH('b',&s);
printf("\n Drugo %c, prije %c", s->zn, s->next->zn);
PUSH('c',&s);
printf("\n trece je %c, drugo %c, prvo %c", s->zn,s->next->zn, s->next->next->zn);
POP(&s);
printf("\n poslije pop-a %c", s->zn);
return 0;
}
[/code:1]
EDIT2: evo sredio sam i pop sad radi, malo je ruzna provjera
da, tako radi, ali nisam siguran dal je to tocno. jer i dalje izbacuje warning
EDIT: Evo sad sam stoposto siguran da push radi jer sam ubacio provjere malo bolje.Ali ne radi pop
evo kod za ovo sta sam dosad napravio, ako netko vidi razlog zasto pop ne radi vicite
Kod: | #include<stdio.h>
#include<stdlib.h>
typedef struct _stack
{
char zn;
struct _stack *next;
}stack;
typedef stack *stog;
void MAKE_NULL(stog *s)
{
s=NULL;
}
void PUSH(char x, stog *s)
{
stack *n=*s;
*s=(stack*)malloc(sizeof(stack));
(*s)->zn=x;
(*s)->next=n;
}
void POP(stog *s)
{
printf("\n funkcija pop");
(*s)=(*s)->next->next;
}
int main()
{
stog s;
s=(stack*)malloc(sizeof(stack));
MAKE_NULL(&s);
PUSH('a',&s);
printf("\n Prvo slovo u stogu je %c", s->zn);
PUSH('b',&s);
printf("\n Drugo %c, prije %c", s->zn, s->next->zn);
PUSH('c',&s);
printf("\n trece je %c, drugo %c, prvo %c", s->zn,s->next->zn, s->next->next->zn);
POP(&s);
printf("\n poslije pop-a %c", s->zn);
return 0;
}
|
EDIT2: evo sredio sam i pop sad radi, malo je ruzna provjera
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
mamba Forumaš(ica)
Pridružen/a: 09. 07. 2012. (17:11:16) Postovi: (16)16
|
|
[Vrh] |
|
izvanzemaljka Forumaš(ica)
Pridružen/a: 31. 05. 2012. (13:40:59) Postovi: (7)16
|
Postano: 16:26 sub, 27. 10. 2012 Naslov: |
|
|
Zadatak: Implementirajte a.t.p. BTREE pomoću polja
Odnosno, zanima me kako implementirati fju CREATE ili LEFT/RIGHT_SUBTREE, koje su podosta povezane. tražila sam u skripti, ali općenito nema nešto puno o binarnim stablima, a o imlementaciji BTREE preko polja još manje, također ni na internetu nisam uspjela naći puno toga. sama sam uspjela jedino napisati create koja izgleda kao rekurzija i poziva stalno left/right subtree. našla sam neke prijedloge da create napišem pomoću kursora, što mi izgleda podosta lagano, ali kasnije s tom fjom create neću moći ništa.
ukratko zanima me kako čuvati neko podstablo? neki hint za implementaciju, bilo šta?
Zadatak: Implementirajte a.t.p. BTREE pomoću polja
Odnosno, zanima me kako implementirati fju CREATE ili LEFT/RIGHT_SUBTREE, koje su podosta povezane. tražila sam u skripti, ali općenito nema nešto puno o binarnim stablima, a o imlementaciji BTREE preko polja još manje, također ni na internetu nisam uspjela naći puno toga. sama sam uspjela jedino napisati create koja izgleda kao rekurzija i poziva stalno left/right subtree. našla sam neke prijedloge da create napišem pomoću kursora, što mi izgleda podosta lagano, ali kasnije s tom fjom create neću moći ništa.
ukratko zanima me kako čuvati neko podstablo? neki hint za implementaciju, bilo šta?
|
|
[Vrh] |
|
PermutiranoPrase Forumaš(ica)
Pridružen/a: 10. 09. 2011. (16:08:19) Postovi: (F4)16
Spol:
|
|
[Vrh] |
|
R2-D2 Forumaš(ica)
Pridružen/a: 11. 10. 2011. (20:32:10) Postovi: (2F)16
|
|
[Vrh] |
|
PermutiranoPrase Forumaš(ica)
Pridružen/a: 10. 09. 2011. (16:08:19) Postovi: (F4)16
Spol:
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 22:16 sub, 27. 10. 2012 Naslov: |
|
|
[quote="R2-D2"]samo elementtype labels[N], a N si možeš staviti na npr. 1000[/quote]
U [tex]n[/tex] nivoa ima najvise [tex]2^n-1[/tex] cvorova. Nije li onda logicnije uzeti takvu granicu (1023, na primjer)? Uz predlozenu "okruglu" granicu, najdesniji cvor u 10. nivou (i ponesto njegovih susjeda) nece stati, dok vecina njih ipak hoce, sto mi se bas i ne cini kao razumno ogranicenje.
R2-D2 (napisa): | samo elementtype labels[N], a N si možeš staviti na npr. 1000 |
U [tex]n[/tex] nivoa ima najvise [tex]2^n-1[/tex] cvorova. Nije li onda logicnije uzeti takvu granicu (1023, na primjer)? Uz predlozenu "okruglu" granicu, najdesniji cvor u 10. nivou (i ponesto njegovih susjeda) nece stati, dok vecina njih ipak hoce, sto mi se bas i ne cini kao razumno ogranicenje.
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
|
|
[Vrh] |
|
hipernova Forumaš(ica)
Pridružen/a: 25. 09. 2011. (20:15:21) Postovi: (C)16
Lokacija: Zagreb
|
|
[Vrh] |
|
štrumfeta Forumaš(ica)
Pridružen/a: 02. 11. 2011. (19:36:55) Postovi: (36)16
|
|
[Vrh] |
|
PermutiranoPrase Forumaš(ica)
Pridružen/a: 10. 09. 2011. (16:08:19) Postovi: (F4)16
Spol:
|
Postano: 18:22 ned, 28. 10. 2012 Naslov: |
|
|
Ovo bi bilo moje nerekurzivno rješenje za stvaranje bin.stabla: [code:1]
node CREATE ( labeltype l, BTREE TL, BTREE TR, BTREE *T )
{
int maxlvlTL = VISINA ( 0, TL );
int maxlvlTR = VISINA ( 0, TR );
int maxlvl = ( maxlvlTL < maxlvlTR ? maxlvlTR : maxlvlTL );
MAKE_NULL(T);
T->labels[0] = l;
int razina, brojac;
node cvor_od_T = 1; // pocinjem od cvora 1 jer smo korijen vec rijesili
node cvor_od_TL = 0; // oznacavaju nam kretanje po TL i TR, krecemo od korijena
node cvor_od_TR = 0;
for ( razina = 1; razina <= maxlvl; ++razina ) // stablo popunjavam razinu po razinu, od 1. do zadnje = maxlvl
{
int i, ukupno = 1;
for ( i = 0; i < razina; ++i ) ukupno *=2; // na svakoj razini imam ukupno 2^razina cvorova
brojac = 1; // na svakoj razini resetiram brojac koji broji jesmo li prosli kroz sve cvorove na razini
while ( brojac <= ukupno / 2) // prvu polovicu razine cine cvorovi iz TL
{ // povecavam brojac prolaska, brojace cvorova stabla T i cvorova TL
T->labels[cvor_od_T] = TL.labels[cvor_od_TL];
++cvor_od_TL;
++cvor_od_T;
++brojac;
}
while ( brojac <= ukupno ) // drugu polovicu razine cine cvorovi iz TR
{ // povecavam brojac prolaska, brojac cvorova stabla T i cvorova TR
T->labels[cvor_od_T] = TR.labels[cvor_od_TR];
++cvor_od_TR;
++cvor_od_T;
++brojac;
}
}
return 0;
} [/code:1]
Kako to obično biva, u teoriji mi radi, u praksi ne. Itko vidi grešku? Dobit će moje štovanje. :lol:
Ovo bi bilo moje nerekurzivno rješenje za stvaranje bin.stabla: Kod: |
node CREATE ( labeltype l, BTREE TL, BTREE TR, BTREE *T )
{
int maxlvlTL = VISINA ( 0, TL );
int maxlvlTR = VISINA ( 0, TR );
int maxlvl = ( maxlvlTL < maxlvlTR ? maxlvlTR : maxlvlTL );
MAKE_NULL(T);
T->labels[0] = l;
int razina, brojac;
node cvor_od_T = 1; // pocinjem od cvora 1 jer smo korijen vec rijesili
node cvor_od_TL = 0; // oznacavaju nam kretanje po TL i TR, krecemo od korijena
node cvor_od_TR = 0;
for ( razina = 1; razina <= maxlvl; ++razina ) // stablo popunjavam razinu po razinu, od 1. do zadnje = maxlvl
{
int i, ukupno = 1;
for ( i = 0; i < razina; ++i ) ukupno *=2; // na svakoj razini imam ukupno 2^razina cvorova
brojac = 1; // na svakoj razini resetiram brojac koji broji jesmo li prosli kroz sve cvorove na razini
while ( brojac <= ukupno / 2) // prvu polovicu razine cine cvorovi iz TL
{ // povecavam brojac prolaska, brojace cvorova stabla T i cvorova TL
T->labels[cvor_od_T] = TL.labels[cvor_od_TL];
++cvor_od_TL;
++cvor_od_T;
++brojac;
}
while ( brojac <= ukupno ) // drugu polovicu razine cine cvorovi iz TR
{ // povecavam brojac prolaska, brojac cvorova stabla T i cvorova TR
T->labels[cvor_od_T] = TR.labels[cvor_od_TR];
++cvor_od_TR;
++cvor_od_T;
++brojac;
}
}
return 0;
} |
Kako to obično biva, u teoriji mi radi, u praksi ne. Itko vidi grešku? Dobit će moje štovanje.
Zadnja promjena: PermutiranoPrase; 0:35 pon, 29. 10. 2012; ukupno mijenjano 2 put/a.
|
|
[Vrh] |
|
Ryssa Forumaš(ica)
Pridružen/a: 18. 12. 2011. (00:10:28) Postovi: (57)16
|
|
[Vrh] |
|
ap Forumaš(ica)
Pridružen/a: 16. 01. 2012. (20:57:13) Postovi: (3)16
|
|
[Vrh] |
|
JovanaHy Forumaš(ica)
Pridružen/a: 15. 11. 2011. (00:01:02) Postovi: (4)16
|
Postano: 15:54 pon, 29. 10. 2012 Naslov: |
|
|
Zadatak mi je da implem BTREE pomocu polja i napisem potprogram koji ispisuje oznake cvorova koji imaju samo jedno dijete u binarnom stablu u inorder redoslijedu, ulazni podaci: stablo sa oznakama tipa char
ne radi mi funkcija unos. stablo na kraju bilježi samo čvor. zasebno radi za prvih par, ali kao rekurzija ne. može pomoć?
[code:1]
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxlength 100
typedef char labeltype;
typedef int node;
const node LAMBDA = -1;
typedef struct
{
labeltype labels[maxlength];
} BTREE;
void MAKE_NULL(BTREE *T)
{
int i;
for(i = 0;i < maxlength;i++)
T->labels[i]='-';
}
int EMPTY(BTREE T)
{
int i = 1,j = 0;
while(i && j < maxlength)
{
if (T.labels[j]!='-')
i = 0;
j++;
}
return i;
}
void pomocna(node i, BTREE *T, node j, BTREE *T1) {
if (j >= maxlength || i >= maxlength || 2*i>=maxlength || 2*j>=maxlength) return;
T->labels[i] = T1->labels[j];
pomocna(2*i + 1, T, 2*j + 1, T1);
pomocna(2*i + 2, T, 2*j + 2, T1);
}
node CREATE(labeltype l, BTREE TL, BTREE TR, BTREE *T) {
T->labels[0]=l;
pomocna(1, T, 0, &TL);
pomocna(2, T, 0, &TR);
return 0;
}
void LEFT_SUBTREE (BTREE T, BTREE *TL) {
MAKE_NULL(TL);
if(T.labels[0]=='-')
printf("Stablo je prazno!");
else pomocna(0, TL, 1, &T);
}
void RIGHT_SUBTREE (BTREE T, BTREE *TR) {
MAKE_NULL(TR);
if(T.labels[0]=='-')
printf("Stablo je prazno!");
else pomocna(0, TR, 2, &T);
}
node LEFT_CHILD(node i, BTREE T)
{
if (i < 0 || i > maxlength) printf("Taj cvor u stablu ne postoji!");
if (T.labels[i] == '-') printf("Taj cvor u stablu ne postoji!");
if ((2*i + 1) > maxlength) printf("Ne postoji lijevo dijete tog cvora u stablu!");
if (T.labels[2*i + 1] == '-') return LAMBDA;
return 2*i + 1;
}
node RIGHT_CHILD(node i, BTREE T)
{
if (i < 0 || i > maxlength) printf("Taj cvor u stablu ne postoji!");
if (T.labels[i] == '-') printf("Taj cvor u stablu ne postoji!");
if ((2*i + 2) > maxlength) printf("Ne postoji desno dijete tog cvora u stablu!");
if (T.labels[2*i + 2]=='-') return LAMBDA;
return 2*i + 2;
}
node INSERT_LEFT_CHILD(labeltype l, node i, BTREE *T)
{
T->labels[i*2 + 1]=l;
return i*2 + 1;
}
node INSERT_RIGHT_CHILD(labeltype l, node i, BTREE *T)
{
T->labels[i*2 + 2]=l;
return i*2 + 2;
}
void DELETE(node i, BTREE *T)
{
T->labels[i]='-';
}
node ROOT(BTREE T)
{
if(T.labels[0] == '-')
return LAMBDA;
return 0;
}
node PARENT(node i, BTREE T)
{
if (i < 0 || i > maxlength) printf("Taj cvor u stablu ne postoji!");
if (T.labels[i] == '-') printf("Taj cvor u stablu ne postoji!");
if (i == 0) return LAMBDA;
return (i-1)/2;
}
labeltype LABEL(node i, BTREE T)
{
return T.labels[i];
}
void CHANGE_LABEL(labeltype l, node i, BTREE *T)
{
T->labels[i]=l;
}
int POTOMAK(node n, BTREE T)
{
if(LEFT_CHILD(n, T) == LAMBDA && RIGHT_CHILD(n, T) == LAMBDA)
return 0;
if(LEFT_CHILD(n, T) != LAMBDA && RIGHT_CHILD(n, T) != LAMBDA)
return 0;
return 1;
}
void INORDER (node n, BTREE T)
{
if (n == LAMBDA) return;
INORDER (LEFT_CHILD(n, T), T);
if(POTOMAK(n, T))
printf ("%c ", LABEL(n, T));
INORDER (RIGHT_CHILD(n, T), T);
}
void UNOS(node n, BTREE T)
{
node nL, nR;
labeltype kL, kR;
if ( n == LAMBDA ) return;
if(LABEL(n,T) != '-')
{
printf("Lijevo dijete od %c: ", LABEL(n,T));
scanf(" %c", &kL);
if(kL != '-'){
nL = INSERT_LEFT_CHILD(kL,n,&T);
UNOS(nL,T);
}
printf("Desno dijete od %c: ", LABEL(n,T));
scanf(" %c", &kR);
if(kR != '-'){
nR = INSERT_RIGHT_CHILD(kR,n,&T);
UNOS(nR,T);
}
}
}
int main()
{
BTREE B, BL, BR;
node n;
labeltype k;
MAKE_NULL(&B);
MAKE_NULL(&BL);MAKE_NULL(&BR);
printf("Korijen: ");
scanf(" %s", &k);
CREATE(k, BL, BR, &B);
n = ROOT(B);
UNOS(n, B);
INORDER(n, B);
return 0;
}
[/code:1]
Zadatak mi je da implem BTREE pomocu polja i napisem potprogram koji ispisuje oznake cvorova koji imaju samo jedno dijete u binarnom stablu u inorder redoslijedu, ulazni podaci: stablo sa oznakama tipa char
ne radi mi funkcija unos. stablo na kraju bilježi samo čvor. zasebno radi za prvih par, ali kao rekurzija ne. može pomoć?
Kod: |
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxlength 100
typedef char labeltype;
typedef int node;
const node LAMBDA = -1;
typedef struct
{
labeltype labels[maxlength];
} BTREE;
void MAKE_NULL(BTREE *T)
{
int i;
for(i = 0;i < maxlength;i++)
T->labels[i]='-';
}
int EMPTY(BTREE T)
{
int i = 1,j = 0;
while(i && j < maxlength)
{
if (T.labels[j]!='-')
i = 0;
j++;
}
return i;
}
void pomocna(node i, BTREE *T, node j, BTREE *T1) {
if (j >= maxlength || i >= maxlength || 2*i>=maxlength || 2*j>=maxlength) return;
T->labels[i] = T1->labels[j];
pomocna(2*i + 1, T, 2*j + 1, T1);
pomocna(2*i + 2, T, 2*j + 2, T1);
}
node CREATE(labeltype l, BTREE TL, BTREE TR, BTREE *T) {
T->labels[0]=l;
pomocna(1, T, 0, &TL);
pomocna(2, T, 0, &TR);
return 0;
}
void LEFT_SUBTREE (BTREE T, BTREE *TL) {
MAKE_NULL(TL);
if(T.labels[0]=='-')
printf("Stablo je prazno!");
else pomocna(0, TL, 1, &T);
}
void RIGHT_SUBTREE (BTREE T, BTREE *TR) {
MAKE_NULL(TR);
if(T.labels[0]=='-')
printf("Stablo je prazno!");
else pomocna(0, TR, 2, &T);
}
node LEFT_CHILD(node i, BTREE T)
{
if (i < 0 || i > maxlength) printf("Taj cvor u stablu ne postoji!");
if (T.labels[i] == '-') printf("Taj cvor u stablu ne postoji!");
if ((2*i + 1) > maxlength) printf("Ne postoji lijevo dijete tog cvora u stablu!");
if (T.labels[2*i + 1] == '-') return LAMBDA;
return 2*i + 1;
}
node RIGHT_CHILD(node i, BTREE T)
{
if (i < 0 || i > maxlength) printf("Taj cvor u stablu ne postoji!");
if (T.labels[i] == '-') printf("Taj cvor u stablu ne postoji!");
if ((2*i + 2) > maxlength) printf("Ne postoji desno dijete tog cvora u stablu!");
if (T.labels[2*i + 2]=='-') return LAMBDA;
return 2*i + 2;
}
node INSERT_LEFT_CHILD(labeltype l, node i, BTREE *T)
{
T->labels[i*2 + 1]=l;
return i*2 + 1;
}
node INSERT_RIGHT_CHILD(labeltype l, node i, BTREE *T)
{
T->labels[i*2 + 2]=l;
return i*2 + 2;
}
void DELETE(node i, BTREE *T)
{
T->labels[i]='-';
}
node ROOT(BTREE T)
{
if(T.labels[0] == '-')
return LAMBDA;
return 0;
}
node PARENT(node i, BTREE T)
{
if (i < 0 || i > maxlength) printf("Taj cvor u stablu ne postoji!");
if (T.labels[i] == '-') printf("Taj cvor u stablu ne postoji!");
if (i == 0) return LAMBDA;
return (i-1)/2;
}
labeltype LABEL(node i, BTREE T)
{
return T.labels[i];
}
void CHANGE_LABEL(labeltype l, node i, BTREE *T)
{
T->labels[i]=l;
}
int POTOMAK(node n, BTREE T)
{
if(LEFT_CHILD(n, T) == LAMBDA && RIGHT_CHILD(n, T) == LAMBDA)
return 0;
if(LEFT_CHILD(n, T) != LAMBDA && RIGHT_CHILD(n, T) != LAMBDA)
return 0;
return 1;
}
void INORDER (node n, BTREE T)
{
if (n == LAMBDA) return;
INORDER (LEFT_CHILD(n, T), T);
if(POTOMAK(n, T))
printf ("%c ", LABEL(n, T));
INORDER (RIGHT_CHILD(n, T), T);
}
void UNOS(node n, BTREE T)
{
node nL, nR;
labeltype kL, kR;
if ( n == LAMBDA ) return;
if(LABEL(n,T) != '-')
{
printf("Lijevo dijete od %c: ", LABEL(n,T));
scanf(" %c", &kL);
if(kL != '-'){
nL = INSERT_LEFT_CHILD(kL,n,&T);
UNOS(nL,T);
}
printf("Desno dijete od %c: ", LABEL(n,T));
scanf(" %c", &kR);
if(kR != '-'){
nR = INSERT_RIGHT_CHILD(kR,n,&T);
UNOS(nR,T);
}
}
}
int main()
{
BTREE B, BL, BR;
node n;
labeltype k;
MAKE_NULL(&B);
MAKE_NULL(&BL);MAKE_NULL(&BR);
printf("Korijen: ");
scanf(" %s", &k);
CREATE(k, BL, BR, &B);
n = ROOT(B);
UNOS(n, B);
INORDER(n, B);
return 0;
}
|
|
|
[Vrh] |
|
linus Forumaš(ica)
Pridružen/a: 20. 11. 2011. (16:59:13) Postovi: (46)16
Lokacija: subnet mask
|
|
[Vrh] |
|
|