Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
.anchy. Forumaš(ica)
Pridružen/a: 14. 11. 2007. (20:03:46) Postovi: (1BC)16
Lokacija: Zgb
|
Postano: 12:51 čet, 6. 1. 2011 Naslov: 2.domaća zadaća |
|
|
trebam implementirati a.t.p MULTISKUP pomoću sortirane vezane liste,gdje svaka ćelija liste sadrži i podatak o broju pojavljivanja danog elementa u skupu. veze su pomoću kursora.
Jesam li dobro deklarirala Multiskup kao struct, i zašto mi BubbleSort ne radi? edit:
rješila sam BubbleSort,sada je sve ok! jedino još ova impl.pomoću kursora..
[code:1]#define N 1000
typedef char elementtype;
typedef struct {
elementtype element;
int koliko;
int next;
}MULTISET;
void BubbleSort(char c[]){
int i,j;
int n=strlen(c);
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
if((strcmp(c[j+1],c[j])<0)
swap(&c[j],&c[j+1]);
}
void swap(char *x, char *y){
char tmp;
tmp=*x;
*x=*y;
*y=tmp;
}
...
BubbleSort(a);
...
[/code:1]
javlja mi " invalid conversion from `char' to `const char*' " u strcmp, i tako nešto slično kod poziva swapa.
pretp.da ima veze s pointerima,s kojima sam na vi..
još mi nije jasno, kako ću se "kretati" po listi? sa pointerima smo imali npr.[code:1]for (pom = f i r s t ; pom; pom = pom−>next )[/code:1], pa kako bi bilo sa kursorima,nemam ideje..
edit:sada vidim da smo na vježbama ovako radili:
[code:1]struct celltype{
elementtype element;
int koliko;
int next;
} MULTISET[N];
[/code:1]
trebam li tako deklarirati multiskup?ili? buni me što tu imamo polje..
trebam implementirati a.t.p MULTISKUP pomoću sortirane vezane liste,gdje svaka ćelija liste sadrži i podatak o broju pojavljivanja danog elementa u skupu. veze su pomoću kursora.
Jesam li dobro deklarirala Multiskup kao struct, i zašto mi BubbleSort ne radi? edit:
rješila sam BubbleSort,sada je sve ok! jedino još ova impl.pomoću kursora..
Kod: | #define N 1000
typedef char elementtype;
typedef struct {
elementtype element;
int koliko;
int next;
}MULTISET;
void BubbleSort(char c[]){
int i,j;
int n=strlen(c);
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
if((strcmp(c[j+1],c[j])<0)
swap(&c[j],&c[j+1]);
}
void swap(char *x, char *y){
char tmp;
tmp=*x;
*x=*y;
*y=tmp;
}
...
BubbleSort(a);
...
|
javlja mi " invalid conversion from `char' to `const char*' " u strcmp, i tako nešto slično kod poziva swapa.
pretp.da ima veze s pointerima,s kojima sam na vi..
još mi nije jasno, kako ću se "kretati" po listi? sa pointerima smo imali npr. Kod: | for (pom = f i r s t ; pom; pom = pom−>next ) | , pa kako bi bilo sa kursorima,nemam ideje..
edit:sada vidim da smo na vježbama ovako radili:
Kod: | struct celltype{
elementtype element;
int koliko;
int next;
} MULTISET[N];
|
trebam li tako deklarirati multiskup?ili? buni me što tu imamo polje..
|
|
[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
|
|
[Vrh] |
|
pmli Forumaš(ica)
Pridružen/a: 09. 11. 2009. (12:03:05) Postovi: (2C8)16
Spol:
|
Postano: 15:07 čet, 6. 1. 2011 Naslov: |
|
|
[quote=".anchy."]i tada deklarirala liste kao:
[code:1]MULTISET avail, A, B;[/code:1]
je li to dobro?[/quote]
Ne. Ideja je da imaš jedno veliko polje SPACE i da se u njemu nalazi avail, A, B i ostalo. MULTISET ti je onda kursor na header (int). SPACE deklariraš kao polje sa svim potrebnim.
[quote=".anchy."]sada mi je sve avail,pa sam napravila for petlju:
[code:1]for(i=0;i<N;i++) avail.next=i+1;[/code:1]
ali mi javlja grešku za to..[/quote]
Trebaš paziti što ti je oznaka za kraj liste, tj. jesu li to samo negativni brojevi i/ili brojevi veći od N-1.
I naravno, to treba raditi na polju SPACE. avail, A i B trebaju biti int-ovi.
.anchy. (napisa): | i tada deklarirala liste kao:
Kod: | MULTISET avail, A, B; |
je li to dobro? |
Ne. Ideja je da imaš jedno veliko polje SPACE i da se u njemu nalazi avail, A, B i ostalo. MULTISET ti je onda kursor na header (int). SPACE deklariraš kao polje sa svim potrebnim.
.anchy. (napisa): | sada mi je sve avail,pa sam napravila for petlju:
Kod: | for(i=0;i<N;i++) avail.next=i+1; |
ali mi javlja grešku za to.. |
Trebaš paziti što ti je oznaka za kraj liste, tj. jesu li to samo negativni brojevi i/ili brojevi veći od N-1.
I naravno, to treba raditi na polju SPACE. avail, A i B trebaju biti int-ovi.
|
|
[Vrh] |
|
.anchy. Forumaš(ica)
Pridružen/a: 14. 11. 2007. (20:03:46) Postovi: (1BC)16
Lokacija: Zgb
|
|
[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] |
|
kakt00s Forumaš(ica)
Pridružen/a: 17. 10. 2007. (12:19:40) Postovi: (183)16
Spol:
Lokacija: :ɐɾıɔɐʞoן
|
Postano: 21:37 pet, 7. 1. 2011 Naslov: |
|
|
[i]Implementirajte a.t.p. MAPPING pomoću otvorenog hashiranja sa B pretinaca (sami predložite funkciju hashiranja). Elementi domene su uredjeni parovi oblika (a, b), za a, b∈{0, 1, 2, …, n}. Kodomena je skup {0, 1, 2, …, n}. [/i]
Zezam se sa tom domenom. Kako da to rješim?
Prvo sam mislio napravit strukturu unutar strukture, ali ipak nebi. :)
E sad... ako napravim domenu kao polje od 2 člana, onda mi implementacije neće biti točne.
Može neki hint/ideja?
EDIT: [b]Solved[/b] Struktura unutar strukture...P.S. Baš je divlji ovaj rumfo :D
Implementirajte a.t.p. MAPPING pomoću otvorenog hashiranja sa B pretinaca (sami predložite funkciju hashiranja). Elementi domene su uredjeni parovi oblika (a, b), za a, b∈{0, 1, 2, …, n}. Kodomena je skup {0, 1, 2, …, n}.
Zezam se sa tom domenom. Kako da to rješim?
Prvo sam mislio napravit strukturu unutar strukture, ali ipak nebi.
E sad... ako napravim domenu kao polje od 2 člana, onda mi implementacije neće biti točne.
Može neki hint/ideja?
EDIT: Solved Struktura unutar strukture...P.S. Baš je divlji ovaj rumfo
_________________ Muy importante!
Zadnja promjena: kakt00s; 17:39 uto, 11. 1. 2011; ukupno mijenjano 1 put.
|
|
[Vrh] |
|
Tomy007 Forumaš(ica)
Pridružen/a: 08. 11. 2009. (19:45:28) Postovi: (94)16
|
Postano: 17:20 sub, 8. 1. 2011 Naslov: |
|
|
[code:1]
#include <stdio.h>
#include <stdlib.h>
#define MAXN 1000
#define LAMBDA -1
#define PRAZNO '-'
typedef char labeltype
typedef int node;
typedef node TREE;
typedef struct {
labeltype label;
node parent, first_child, next_sibling;
}SPACE [MAXN]
void MAKE_NULL(int n) {
node avail;
for (i=n, i<MAXN, i++) {
SPACE[I].label=PRAZNO;
SPACE[i].next_sibling=i+1;
SPACE[MAXN].next_sibling=LAMBDA;
avail=n;
}
node MAKE_ROOT(labeltype l, TREE *T) {
if (avail==LAMBDA){
printf("Polje SPACE je puno!");
system("pause");
exit(1);
}
T=avail
avail=SPACE[avail].next_sibling;
SPACE[T].label=l;
SPACE[T].parent=LAMBDA;
SPACE[T].first_child=LAMBDA
SPACE[T].next_sibling=LAMBDA
return T;
}
node INSERT_CHILD(labeltype l, node i, TREE *T) {
node j;
if (SPACE[i].label==PRAZNO) { /* ? */
printf("Taj cvor nije u stablu!");
system("pause");
exit(1);
}
if (avail==LAMBDA){
printf("Polje SPACE je puno!");
system("pause");
exit(1);
}
j=avail;
avail=SPACE[avail].next_sibling;
SPACE[j].parent=i;
SPACE[j].first_child=LAMBDA;
SPACE[j].next_sibling=SPACE[i].first_child;
SPACE[i].first_child=j;
return j;
}
node INSERT_SIBLING(labeltype l, node i, TREE *T) {
node j,t;
if (SPACE[i].label==PRAZNO) { /* ? */
printf("Taj cvor nije u stablu!");
system("pause");
exit(1);
}
if (avail==LAMBDA){
printf("Polje SPACE je puno!");
system("pause");
exit(1);
}
j=avail;
avail=SPACE[avail].next_sibling;
SPACE[j].next_sibling=SPACE[i].next_sibling;
SPACE[j].parent=SPACE[i].parent;
SPACE[j].first_child=LAMBDA;
SPACE[i].next_sibling=j;
return j;
}
void DELETE(node i, TREE *T) {
node j,k,g;
if (SPACE[i].label==PRAZNO) { /* ? */
printf("Taj cvor nije u stablu!");
system("pause");
exit(1);
}
if (SPACE[i].parent==LAMBDA) {
printf("Taj cvor je korijen!");
system("pause");
exit(1);
}
if (SPACE[i].first_child!=LAMBDA) {
printf("Taj cvor ima djece!");
system("pause");
exit(1);
}
j=SPACE[i].parent;
k=SPACE[i].next_sibling;
g=SPACE[j].first_child;
if (g!=i) {
while (SPACE[g].next_sibling!=i)
g=SPACE[g].next_sibling;
}
if (i==SPACE[j].first_child)
SPACE[j].first_child=k;
else
SPACE[g].next_sibling=k;
SPACE[i].label=PRAZNO;
SPACE[i].next_sibling=avail;
avail=i;
}
node ROOT(TREE T) {
return T;
}
node FIRST_CHILD(node i; TREE T) {
if (SPACE[i].label==PRAZNO) { /* ? */
printf("Taj cvor nije u stablu!");
system("pause");
exit(1);
}
return SPACE[i].first_child;
}
node NEXT_SIBLING(node i; TREE T) {
if (SPACE[i].label==PRAZNO) { /* ? */
printf("Taj cvor nije u stablu!");
system("pause");
exit(1);
}
return SPACE[i].next_sibling;
}
node PARENT(node i; TREE T) {
if (SPACE[i].label==PRAZNO) { /* ? */
printf("Taj cvor nije u stablu!");
system("pause");
exit(1);
}
return SPACE[i].parent;
}
labeltype LABEL(node i; TREE T) {
if (SPACE[i].label==PRAZNO) { /* ? */
printf("Taj cvor nije u stablu!");
system("pause");
exit(1);
}
return SPACE[i].label;
}
void CHANGE_LABEL(labeltype l, node i; TREE *T) {
if (SPACE[i].label==PRAZNO) { /* ? */
printf("Taj cvor nije u stablu!");
system("pause");
exit(1);
}
SPACE[i].label=l;
}
int main (void) {
TREE T;
MAKE_NULL(0);
system("pause");
return 0;
}
[/code:1]
PITANJA:
1. Bili ovo bila dobra implementacija za TREE pomoću polja na osnovi veze "čvor → (roditelj, (prvo dijete, idući brat))" ili sam nešto krivo razunio/kodirao (ako nešto nije u redu bio bi jako zahvalan da mi ukažete što je krivo i date mi neku ideju kako da to ispravim)
2.Sa komentarom /* ? */ sam označio mjesto u kodu gdje sam iskodirao samo za jednu stablo. Ako je label = '-' onda je u listi avail ako nije onda je sigurno u tom jedinom stablo. Zna li netko kako bi taj problem riješio univerzalno tj. da vrijedi i za više stabala u polju SPACE (znaći da provjerim jeli taj i baš u tom konkretnom stablu)?
3.Kako bi mogao učitati stablo izvana u program. Jedna moja zamisao je bila da se prvo napiše korijen pa onda njegova djeca, a poslje zadnjeg djeteta znak '-'. Nakon toga bi to ponavio za njegovo prvo dijete, pa svako sljedeće i tako u krug dok se ne upiše znak '*' što bi značilo da je cijelo stablo učitano ali nisam siguran bili to bilo ok i kako bi to izveo.
Hvala puno svima koji pokušaju bar nešto od ovoga odgovoriti jer sam malo u stisci s vremenom, a i zato jer je ovo gradivo obrađeno samo apstraktno i nismo radili nikakve konkretnije primjere sa npr. konstruiranjem liste avail ali ni sa večinom implementacija drugih funkcija u ovom obliku sa poljem za obično stablo, a nismo radili ni učitavanje običnog stabla izvana.
Kod: |
#include <stdio.h>
#include <stdlib.h>
#define MAXN 1000
#define LAMBDA -1
#define PRAZNO '-'
typedef char labeltype
typedef int node;
typedef node TREE;
typedef struct {
labeltype label;
node parent, first_child, next_sibling;
}SPACE [MAXN]
void MAKE_NULL(int n) {
node avail;
for (i=n, i<MAXN, i++) {
SPACE[I].label=PRAZNO;
SPACE[i].next_sibling=i+1;
SPACE[MAXN].next_sibling=LAMBDA;
avail=n;
}
node MAKE_ROOT(labeltype l, TREE *T) {
if (avail==LAMBDA){
printf("Polje SPACE je puno!");
system("pause");
exit(1);
}
T=avail
avail=SPACE[avail].next_sibling;
SPACE[T].label=l;
SPACE[T].parent=LAMBDA;
SPACE[T].first_child=LAMBDA
SPACE[T].next_sibling=LAMBDA
return T;
}
node INSERT_CHILD(labeltype l, node i, TREE *T) {
node j;
if (SPACE[i].label==PRAZNO) { /* ? */
printf("Taj cvor nije u stablu!");
system("pause");
exit(1);
}
if (avail==LAMBDA){
printf("Polje SPACE je puno!");
system("pause");
exit(1);
}
j=avail;
avail=SPACE[avail].next_sibling;
SPACE[j].parent=i;
SPACE[j].first_child=LAMBDA;
SPACE[j].next_sibling=SPACE[i].first_child;
SPACE[i].first_child=j;
return j;
}
node INSERT_SIBLING(labeltype l, node i, TREE *T) {
node j,t;
if (SPACE[i].label==PRAZNO) { /* ? */
printf("Taj cvor nije u stablu!");
system("pause");
exit(1);
}
if (avail==LAMBDA){
printf("Polje SPACE je puno!");
system("pause");
exit(1);
}
j=avail;
avail=SPACE[avail].next_sibling;
SPACE[j].next_sibling=SPACE[i].next_sibling;
SPACE[j].parent=SPACE[i].parent;
SPACE[j].first_child=LAMBDA;
SPACE[i].next_sibling=j;
return j;
}
void DELETE(node i, TREE *T) {
node j,k,g;
if (SPACE[i].label==PRAZNO) { /* ? */
printf("Taj cvor nije u stablu!");
system("pause");
exit(1);
}
if (SPACE[i].parent==LAMBDA) {
printf("Taj cvor je korijen!");
system("pause");
exit(1);
}
if (SPACE[i].first_child!=LAMBDA) {
printf("Taj cvor ima djece!");
system("pause");
exit(1);
}
j=SPACE[i].parent;
k=SPACE[i].next_sibling;
g=SPACE[j].first_child;
if (g!=i) {
while (SPACE[g].next_sibling!=i)
g=SPACE[g].next_sibling;
}
if (i==SPACE[j].first_child)
SPACE[j].first_child=k;
else
SPACE[g].next_sibling=k;
SPACE[i].label=PRAZNO;
SPACE[i].next_sibling=avail;
avail=i;
}
node ROOT(TREE T) {
return T;
}
node FIRST_CHILD(node i; TREE T) {
if (SPACE[i].label==PRAZNO) { /* ? */
printf("Taj cvor nije u stablu!");
system("pause");
exit(1);
}
return SPACE[i].first_child;
}
node NEXT_SIBLING(node i; TREE T) {
if (SPACE[i].label==PRAZNO) { /* ? */
printf("Taj cvor nije u stablu!");
system("pause");
exit(1);
}
return SPACE[i].next_sibling;
}
node PARENT(node i; TREE T) {
if (SPACE[i].label==PRAZNO) { /* ? */
printf("Taj cvor nije u stablu!");
system("pause");
exit(1);
}
return SPACE[i].parent;
}
labeltype LABEL(node i; TREE T) {
if (SPACE[i].label==PRAZNO) { /* ? */
printf("Taj cvor nije u stablu!");
system("pause");
exit(1);
}
return SPACE[i].label;
}
void CHANGE_LABEL(labeltype l, node i; TREE *T) {
if (SPACE[i].label==PRAZNO) { /* ? */
printf("Taj cvor nije u stablu!");
system("pause");
exit(1);
}
SPACE[i].label=l;
}
int main (void) {
TREE T;
MAKE_NULL(0);
system("pause");
return 0;
}
|
PITANJA:
1. Bili ovo bila dobra implementacija za TREE pomoću polja na osnovi veze "čvor → (roditelj, (prvo dijete, idući brat))" ili sam nešto krivo razunio/kodirao (ako nešto nije u redu bio bi jako zahvalan da mi ukažete što je krivo i date mi neku ideju kako da to ispravim)
2.Sa komentarom /* ? */ sam označio mjesto u kodu gdje sam iskodirao samo za jednu stablo. Ako je label = '-' onda je u listi avail ako nije onda je sigurno u tom jedinom stablo. Zna li netko kako bi taj problem riješio univerzalno tj. da vrijedi i za više stabala u polju SPACE (znaći da provjerim jeli taj i baš u tom konkretnom stablu)?
3.Kako bi mogao učitati stablo izvana u program. Jedna moja zamisao je bila da se prvo napiše korijen pa onda njegova djeca, a poslje zadnjeg djeteta znak '-'. Nakon toga bi to ponavio za njegovo prvo dijete, pa svako sljedeće i tako u krug dok se ne upiše znak '*' što bi značilo da je cijelo stablo učitano ali nisam siguran bili to bilo ok i kako bi to izveo.
Hvala puno svima koji pokušaju bar nešto od ovoga odgovoriti jer sam malo u stisci s vremenom, a i zato jer je ovo gradivo obrađeno samo apstraktno i nismo radili nikakve konkretnije primjere sa npr. konstruiranjem liste avail ali ni sa večinom implementacija drugih funkcija u ovom obliku sa poljem za obično stablo, a nismo radili ni učitavanje običnog stabla izvana.
|
|
[Vrh] |
|
homesweethome Forumaš(ica)
Pridružen/a: 21. 10. 2009. (16:25:25) Postovi: (1C)16
|
|
[Vrh] |
|
ante003 Forumaš(ica)
Pridružen/a: 13. 10. 2008. (17:45:10) Postovi: (3C5)16
Spol:
|
Postano: 19:38 pon, 10. 1. 2011 Naslov: |
|
|
[quote="homesweethome"]:arrow: Treba mi program za ispis INORDER obilaska binarnog stabla, implementiranog pomocu pointera? ne treba biti neovisan o implementaciji.. :?:[/quote]
:S
napravi si funkciju void inorder i samo napisi kako ti ide definicija inorder ispisa.
lijevo podstablo, korijen, desno podstablo.
najlaksa rekurzivna funkcija koju mozes pitat.
[code:1]inorder(LEFT_CHILD(..),...);
printf("..",korijen);
inorder(RIGHT_CHILD(..),...);
[/code:1]
i jos si dodaj jedan if koji provjerava jel postoji nesto na tom cvoru i voila. to je to :) (ako nisam nesto zaboravio, ako jesam, skuzit ces valjda sto fali :) )
homesweethome (napisa): | Treba mi program za ispis INORDER obilaska binarnog stabla, implementiranog pomocu pointera? ne treba biti neovisan o implementaciji.. |
:S
napravi si funkciju void inorder i samo napisi kako ti ide definicija inorder ispisa.
lijevo podstablo, korijen, desno podstablo.
najlaksa rekurzivna funkcija koju mozes pitat.
Kod: | inorder(LEFT_CHILD(..),...);
printf("..",korijen);
inorder(RIGHT_CHILD(..),...);
|
i jos si dodaj jedan if koji provjerava jel postoji nesto na tom cvoru i voila. to je to (ako nisam nesto zaboravio, ako jesam, skuzit ces valjda sto fali )
_________________ Ako ste previše otvorenog uma, ispast će vam mozak
------------------------------------------------------
Racunalo bez Windowsa je kao riba bez bicikla
|
|
[Vrh] |
|
c.p.-23 Forumaš(ica)
Pridružen/a: 04. 06. 2010. (10:21:02) Postovi: (8)16
|
|
[Vrh] |
|
eve Forumaš(ica)
Pridružen/a: 13. 07. 2009. (23:07:06) Postovi: (192)16
Spol:
|
|
[Vrh] |
|
Cobs Forumaš(ica)
Pridružen/a: 21. 01. 2008. (13:32:15) Postovi: (206)16
Spol:
Lokacija: Geto
|
Postano: 19:03 sri, 12. 1. 2011 Naslov: |
|
|
[quote="c.p.-23"]ima li itko živ implementaciju:
a.t.p. SET pomoću nesortirane vezane liste (veze u listi su uspostavljene pomoću kursora) i pretpostavku da skupovi sadrže podatke tipa char?
:cry: :oops:[/quote]
s obzirom da se radi o implementaciji pomoću nesortirane vezane liste ( implementirane pomoću pointera ) ta lista ne treba biti SORTIRANA , pa po čemu se to razlikuje od obične liste ( implementirane pomoću pointera ).
Ne razlikuje se. Nabavi običnu implementaciju liste pomoću pointera, tog bar ima na internetu na 100 strana.
znači umjesto onog position pointera koji je tam u svakoj funkciji oznaka koji element ubacit,brisat..., sam stavi pointer na prvi element liste. Jer ti pozicija u skupu nije bitna.
Funkcija MAKE_NULL je ista.
Kod funkcije INSERT uvijek ubacuj elemente na početak liste.
Kod funkcije DELETE šećeš po listi od početka dok ne naletiš na neki element ( koji je tamo jedini jer se radi o skupu ) i pobrišeš ga.
Funkcija MEMBER je gotovo ista kao DELETE, sam ne brišeš podatak na koji eventualno naletiš.
Funkcija MIN ( MAX ). Šećeš po cijeloj listi i najveći ( najmanji ) element spremiš u pomoćnu varijablu koju ćeš vratiti.
Ostale funkcije su niš drugo nego kombinacija navedenih.
[quote="eve"]
jel ima netko implementaciju rječnika (sadrži podatke tima char) pomoću otvorene hash tablice?
muci me kakvu funkciju uzet.. i probala sam sa implementacijom koja je u skripti ali izbacuje hrpu grešaka...
plizz help ak neko to ima...
[/quote]
si ovo stavila?
[code:1]#define B 20[/code:1]
ak je u nečem drugom problem napiši tu u čem ili meni na pm.
[size=9][color=#999999]Added after 32 minutes:[/color][/size]
[quote="Tomy007"][code:1]
...
typedef struct {
labeltype label;
node parent, first_child, next_sibling;
}SPACE [MAXN]
void MAKE_NULL(int n) {
node avail;
for (i=n, i<MAXN, i++) {
SPACE[I].label=PRAZNO;
SPACE[i].next_sibling=i+1;
SPACE[MAXN].next_sibling=LAMBDA;
avail=n;
}
void CHANGE_LABEL(labeltype l, node i; TREE *T) {
if (SPACE[i].label==PRAZNO) { /* ? */
printf("Taj cvor nije u stablu!");
system("pause");
exit(1);
}
SPACE[i].label=l;
}
...
[/code:1]
[/quote]
nisam htjel quotat cijeli post jer je malo prevelik...
uglavnom... nije dobro. ( bar ovaj mali dio koji sam ti pogledo )
U startu imaš par početničkih grešaka tipa:
[code:1]SPACE[MAXN][/code:1]
- zatim funkcija MAKE_NULL nije dobro zatvorena. ( tj. for petlja u njoj )
- zatim:
[code:1]node avail[/code:1]
u istoj funkciji. Čemu služi? vidim da je koristiš odmah u sljedećoj funkciji bez da si je u istoj deklarirao. Ta varijabla ne postoji u nekoj drugoj funkciji jer se uništi na kraju one na kojoj je deklarirana.
-funkcija CHANGE_LABEL bi trebala mjenjat ime nekog čvora u određenom stablu.
TREE *T je pokazivač na stablo ( pretpostavljam vjerojatno na korijen ). Što ako čvor ( node i ) koji ulazi u funkciju postoji u nekom drugom stablu iz SPACE - a ( ako imaš više stabla u space -u, ako u space -u imaš samo jedno stablo, zašto koristiš pointer na njega? ) ?
Što ako postoji ( čvor i ) u baš ovom stablu kojeg mjenjaš, ali u tom istom stablu postoji još jedan čvor koji ima ime koje pokušavaš postavit kao novo ( labeltype l )?
Nemoj krivo shvatit ovaj post, kao samu kritiku, ali ti moram reć da nisi na pravom putu...
Probaj napravit nešto najjednostavnije što možeš ( ako govorimo o bilo kojoj implementaciji ), a ako ti to proradi ili kad ti proradi malo počni komplicirat...
c.p.-23 (napisa): | ima li itko živ implementaciju:
a.t.p. SET pomoću nesortirane vezane liste (veze u listi su uspostavljene pomoću kursora) i pretpostavku da skupovi sadrže podatke tipa char?
|
s obzirom da se radi o implementaciji pomoću nesortirane vezane liste ( implementirane pomoću pointera ) ta lista ne treba biti SORTIRANA , pa po čemu se to razlikuje od obične liste ( implementirane pomoću pointera ).
Ne razlikuje se. Nabavi običnu implementaciju liste pomoću pointera, tog bar ima na internetu na 100 strana.
znači umjesto onog position pointera koji je tam u svakoj funkciji oznaka koji element ubacit,brisat..., sam stavi pointer na prvi element liste. Jer ti pozicija u skupu nije bitna.
Funkcija MAKE_NULL je ista.
Kod funkcije INSERT uvijek ubacuj elemente na početak liste.
Kod funkcije DELETE šećeš po listi od početka dok ne naletiš na neki element ( koji je tamo jedini jer se radi o skupu ) i pobrišeš ga.
Funkcija MEMBER je gotovo ista kao DELETE, sam ne brišeš podatak na koji eventualno naletiš.
Funkcija MIN ( MAX ). Šećeš po cijeloj listi i najveći ( najmanji ) element spremiš u pomoćnu varijablu koju ćeš vratiti.
Ostale funkcije su niš drugo nego kombinacija navedenih.
eve (napisa): |
jel ima netko implementaciju rječnika (sadrži podatke tima char) pomoću otvorene hash tablice?
muci me kakvu funkciju uzet.. i probala sam sa implementacijom koja je u skripti ali izbacuje hrpu grešaka...
plizz help ak neko to ima...
|
si ovo stavila?
ak je u nečem drugom problem napiši tu u čem ili meni na pm.
Added after 32 minutes:
Tomy007 (napisa): | Kod: |
...
typedef struct {
labeltype label;
node parent, first_child, next_sibling;
}SPACE [MAXN]
void MAKE_NULL(int n) {
node avail;
for (i=n, i<MAXN, i++) {
SPACE[I].label=PRAZNO;
SPACE[i].next_sibling=i+1;
SPACE[MAXN].next_sibling=LAMBDA;
avail=n;
}
void CHANGE_LABEL(labeltype l, node i; TREE *T) {
if (SPACE[i].label==PRAZNO) { /* ? */
printf("Taj cvor nije u stablu!");
system("pause");
exit(1);
}
SPACE[i].label=l;
}
...
|
|
nisam htjel quotat cijeli post jer je malo prevelik...
uglavnom... nije dobro. ( bar ovaj mali dio koji sam ti pogledo )
U startu imaš par početničkih grešaka tipa:
- zatim funkcija MAKE_NULL nije dobro zatvorena. ( tj. for petlja u njoj )
- zatim:
u istoj funkciji. Čemu služi? vidim da je koristiš odmah u sljedećoj funkciji bez da si je u istoj deklarirao. Ta varijabla ne postoji u nekoj drugoj funkciji jer se uništi na kraju one na kojoj je deklarirana.
-funkcija CHANGE_LABEL bi trebala mjenjat ime nekog čvora u određenom stablu.
TREE *T je pokazivač na stablo ( pretpostavljam vjerojatno na korijen ). Što ako čvor ( node i ) koji ulazi u funkciju postoji u nekom drugom stablu iz SPACE - a ( ako imaš više stabla u space -u, ako u space -u imaš samo jedno stablo, zašto koristiš pointer na njega? ) ?
Što ako postoji ( čvor i ) u baš ovom stablu kojeg mjenjaš, ali u tom istom stablu postoji još jedan čvor koji ima ime koje pokušavaš postavit kao novo ( labeltype l )?
Nemoj krivo shvatit ovaj post, kao samu kritiku, ali ti moram reć da nisi na pravom putu...
Probaj napravit nešto najjednostavnije što možeš ( ako govorimo o bilo kojoj implementaciji ), a ako ti to proradi ili kad ti proradi malo počni komplicirat...
|
|
[Vrh] |
|
nike Forumaš(ica)
Pridružen/a: 11. 02. 2010. (13:05:01) Postovi: (58)16
|
Postano: 13:11 čet, 13. 1. 2011 Naslov: |
|
|
Trebala bi mi pomoć: imam implementaciju atp TREE preko veze čvor->roditelj,prvo dijete,idući brat...početnu implementaciju pomoću typedef struct sam napravio..Ono što me buni jest kako povezat polje space[maxn] sa imenom TREE...Znači imam ovo:
typedef int node; //index u polju
typedef char labeltype;
typedef struct{
labeltype label;
node parent , first.child , next.sibling;
}SPACE[MAXN];
Gdje je sad tu TREE? jer ja u svim potprogramima koristim kao varijablu TREE,al neznam kako polje space povezat sa TREE....
Kada napravim ovo :
int main(void){
SPACE[MAXN] T;
javlja mi grešku (nešto tipa da sam zaboravio napisat neki točka zarez)..Al zapravo bi želio implementirat TREE T...kako da to postignem?
Trebala bi mi pomoć: imam implementaciju atp TREE preko veze čvor→roditelj,prvo dijete,idući brat...početnu implementaciju pomoću typedef struct sam napravio..Ono što me buni jest kako povezat polje space[maxn] sa imenom TREE...Znači imam ovo:
typedef int node; //index u polju
typedef char labeltype;
typedef struct{
labeltype label;
node parent , first.child , next.sibling;
}SPACE[MAXN];
Gdje je sad tu TREE? jer ja u svim potprogramima koristim kao varijablu TREE,al neznam kako polje space povezat sa TREE....
Kada napravim ovo :
int main(void){
SPACE[MAXN] T;
javlja mi grešku (nešto tipa da sam zaboravio napisat neki točka zarez)..Al zapravo bi želio implementirat TREE T...kako da to postignem?
|
|
[Vrh] |
|
Cobs Forumaš(ica)
Pridružen/a: 21. 01. 2008. (13:32:15) Postovi: (206)16
Spol:
Lokacija: Geto
|
|
[Vrh] |
|
Tomy007 Forumaš(ica)
Pridružen/a: 08. 11. 2009. (19:45:28) Postovi: (94)16
|
|
[Vrh] |
|
Cobs Forumaš(ica)
Pridružen/a: 21. 01. 2008. (13:32:15) Postovi: (206)16
Spol:
Lokacija: Geto
|
|
[Vrh] |
|
luna5 Forumaš(ica)
Pridružen/a: 15. 01. 2011. (00:11:50) Postovi: (6)16
|
Postano: 0:18 sub, 15. 1. 2011 Naslov: |
|
|
[quote="Cobs"]najpojednostavljeniji oblik rekurzivne funkcije:
[code:1]
void unesi_cvorove( TREE *T ){
upisi broj djece za cvor *T;
while( broj_djece > 0 ){
unesi dijete za cvor *T;
broj_djece--;
}
// sada su unesena sva djeca od cvora *T
sada pomocnim pointerom odi po svoj djeci od *T
i unosi djecu za njih
// pozovi funkciju unesi_cvorove( ... ) na pomocnom pointeru
}
[/code:1]
kako unositi djecu, ovisi o načinu implementacije, kao i "hodanje" po djeci nekog čvora.
Naravno ja sam pretpostavio da je početni čvor ( KORIJEN ) već alociran i ima neku oznaku, te da u main funkciji samo pozoveš tu funkciju na njemu.[/quote]
meni je isto zadatak osmisliti unos podataka tipa char, s tim da mi je implementacije cvor->(prvo dijete, brat) pomocu pointera
probala sam nerekurzivnu verziju, nije mi jasno sto ne funkcionira
[code:1]
int main()
{
node n;
labeltype l;
int d,b;
scanf("%c",&l);
TREE T;
n=MAKE_ROOT(l,&T);
while(1)
{
scanf("%d", &d); scanf("%d", &b); //tu unosim 0 ili 1 jer svaki put ispitujem ima li cvor dijete i prvog brata
if(d==1)
{
scanf("%c",&l);printf("\n%c\n",l);
n=INSERT_CHILD(l,n,&T);
n=PARENT(n,T);
}
if(b==1)
{
scanf("%c",&l);
n=INSERT_SIBLING(l,n,&T);
n=FIRST_CHILD(PARENT(n,T),T);
}
if(FIRST_CHILD(n,T)!=LAMBDA)
{
n=FIRST_CHILD(n,T);
continue;
}
if(NEXT_SIBLING(n,T)!=LAMBDA)
{
n=NEXT_SIBLING(n,T);
continue;
}
while((NEXT_SIBLING(n,T)==LAMBDA)&&(PARENT(n,T)!=LAMBDA))
{
n=PARENT(n,T);
}
if(PARENT(n,T)==LAMBDA)
break;
else
{
n=NEXT_SIBLING(n,T);
}
}
return 0;
}
[/code:1][/code]
Cobs (napisa): | najpojednostavljeniji oblik rekurzivne funkcije:
Kod: |
void unesi_cvorove( TREE *T ){
upisi broj djece za cvor *T;
while( broj_djece > 0 ){
unesi dijete za cvor *T;
broj_djece--;
}
// sada su unesena sva djeca od cvora *T
sada pomocnim pointerom odi po svoj djeci od *T
i unosi djecu za njih
// pozovi funkciju unesi_cvorove( ... ) na pomocnom pointeru
}
|
kako unositi djecu, ovisi o načinu implementacije, kao i "hodanje" po djeci nekog čvora.
Naravno ja sam pretpostavio da je početni čvor ( KORIJEN ) već alociran i ima neku oznaku, te da u main funkciji samo pozoveš tu funkciju na njemu. |
meni je isto zadatak osmisliti unos podataka tipa char, s tim da mi je implementacije cvor→(prvo dijete, brat) pomocu pointera
probala sam nerekurzivnu verziju, nije mi jasno sto ne funkcionira
Kod: |
int main()
{
node n;
labeltype l;
int d,b;
scanf("%c",&l);
TREE T;
n=MAKE_ROOT(l,&T);
while(1)
{
scanf("%d", &d); scanf("%d", &b); //tu unosim 0 ili 1 jer svaki put ispitujem ima li cvor dijete i prvog brata
if(d==1)
{
scanf("%c",&l);printf("\n%c\n",l);
n=INSERT_CHILD(l,n,&T);
n=PARENT(n,T);
}
if(b==1)
{
scanf("%c",&l);
n=INSERT_SIBLING(l,n,&T);
n=FIRST_CHILD(PARENT(n,T),T);
}
if(FIRST_CHILD(n,T)!=LAMBDA)
{
n=FIRST_CHILD(n,T);
continue;
}
if(NEXT_SIBLING(n,T)!=LAMBDA)
{
n=NEXT_SIBLING(n,T);
continue;
}
while((NEXT_SIBLING(n,T)==LAMBDA)&&(PARENT(n,T)!=LAMBDA))
{
n=PARENT(n,T);
}
if(PARENT(n,T)==LAMBDA)
break;
else
{
n=NEXT_SIBLING(n,T);
}
}
return 0;
}
| [/code]
|
|
[Vrh] |
|
Vanja_ Forumaš(ica)
Pridružen/a: 21. 11. 2009. (14:38:39) Postovi: (2C)16
|
Postano: 15:42 sub, 15. 1. 2011 Naslov: |
|
|
imam zadatak za domacu zadacu sa dinamickim programiranjem...
kako funkcionira sljedeci problem:
duljina niza, odnosno velicina polja mi nije zadana. tj. korisnik unosi duljinu niza, odnosno velicinu polja, i tek nakon toga bi se valjda trebalo sve kreirati.
u skripti je to opisano ovako:
'' float M[D1][D2];
int w[D1];
float p[D1]; ''
kako to funkcionira u sintaksi? tipa korisnik unese n i m, a meni bi trebali: polje M[n][m], i w[n] i p[n].
Hvala! :)
imam zadatak za domacu zadacu sa dinamickim programiranjem...
kako funkcionira sljedeci problem:
duljina niza, odnosno velicina polja mi nije zadana. tj. korisnik unosi duljinu niza, odnosno velicinu polja, i tek nakon toga bi se valjda trebalo sve kreirati.
u skripti je to opisano ovako:
'' float M[D1][D2];
int w[D1];
float p[D1]; ''
kako to funkcionira u sintaksi? tipa korisnik unese n i m, a meni bi trebali: polje M[n][m], i w[n] i p[n].
Hvala!
|
|
[Vrh] |
|
|