2.domaća zadaća
Select messages from
# through # FAQ
[/[Print]\]

Forum@DeGiorgi -> Strukture podataka i algoritmi

#1: 2.domaća zadaća Autor/ica: .anchy.Lokacija: Zgb PostPostano: 12:51 čet, 6. 1. 2011
    —
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..

#2:  Autor/ica: pmli PostPostano: 14:46 čet, 6. 1. 2011
    —
.anchy. (napisa):
javlja mi " invalid conversion from `char' to `const char*' " u strcmp, i tako nešto slično kod poziva swapa.

strcmp služi za uspoređivanje stringova, ne znakova. Ne vidim zašto bi se bunio kod poziva swapa.

Što se tiče kursora, možda ti pomogne skripta (str. 15).

#3:  Autor/ica: .anchy.Lokacija: Zgb PostPostano: 14:59 čet, 6. 1. 2011
    —
vidjela sam to u skripti,ali mi još uvijek nije jasno..

promjenila sam ovo:
Kod:
typedef struct {
        elementtype element;
        int koliko;
        int next;
}MULTISET[N];


i tada deklarirala liste kao:
Kod:
MULTISET avail, A, B;

je li to dobro?

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..

#4:  Autor/ica: pmli PostPostano: 15:07 čet, 6. 1. 2011
    —
.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.

#5:  Autor/ica: .anchy.Lokacija: Zgb PostPostano: 16:30 čet, 6. 1. 2011
    —
opet ne kužim Sad
sada sam napravila ovako pa kaže" expected primary-expression before '[' token "
Kod:
for(i=0;i<N-1;i++)
       SPACE[i]->next=i+1;
    avail=SPACE[0].next;
    SPACE[N-1]=-1;

#6:  Autor/ica: pmli PostPostano: 16:55 čet, 6. 1. 2011
    —
.anchy. (napisa):
Kod:
       SPACE[i]->next=i+1;

Treba biti točka, ne strelica.

.anchy. (napisa):
Kod:
    avail=SPACE[0].next;

Valjda treba biti avail = 0;

#7:  Autor/ica: kakt00sLokacija: :ɐɾıɔɐʞoן PostPostano: 17:30 pet, 7. 1. 2011
    —
Moram implementirat atp MAPPING pomoću otvorene hash tablice i muči me f-ja MAKE_NULL. Evo kod koji sam napisao...

Kod:
void MAKE_NULL(MAPPING *M){
    int i;
    for(i=0;i<B;i++) (*M)[i]= NULL;
}


Čim program dođe do trenutka izvođenja te f-je se 'blokira'... Sad


EDIT: Solved. Zaboravio alocirati memoriju Smile

#8:  Autor/ica: kakt00sLokacija: :ɐɾıɔɐʞoן PostPostano: 21:37 pet, 7. 1. 2011
    —
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. Smile
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 Very Happy


Zadnja promjena: kakt00s; 17:39 uto, 11. 1. 2011; ukupno mijenjano 1 put.

#9:  Autor/ica: Tomy007 PostPostano: 17:20 sub, 8. 1. 2011
    —
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.

#10:  Autor/ica: homesweethome PostPostano: 16:29 pon, 10. 1. 2011
    —
Arrow Treba mi program za ispis INORDER obilaska binarnog stabla, implementiranog pomocu pointera? ne treba biti neovisan o implementaciji.. Question

#11:  Autor/ica: ante003 PostPostano: 19:38 pon, 10. 1. 2011
    —
homesweethome (napisa):
Arrow Treba mi program za ispis INORDER obilaska binarnog stabla, implementiranog pomocu pointera? ne treba biti neovisan o implementaciji.. Question


: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 Smile (ako nisam nesto zaboravio, ako jesam, skuzit ces valjda sto fali Smile )

#12:  Autor/ica: c.p.-23 PostPostano: 21:29 uto, 11. 1. 2011
    —
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?
Crying or Very sad Embarassed

#13:  Autor/ica: eve PostPostano: 22:05 uto, 11. 1. 2011
    —
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...

#14:  Autor/ica: CobsLokacija: Geto PostPostano: 19:03 sri, 12. 1. 2011
    —
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?
Crying or Very sad Embarassed


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?

Kod:
#define B 20


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:

Kod:
SPACE[MAXN]


- zatim funkcija MAKE_NULL nije dobro zatvorena. ( tj. for petlja u njoj )

- zatim:
Kod:
node avail

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...

#15:  Autor/ica: nike PostPostano: 13:11 čet, 13. 1. 2011
    —
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?

#16:  Autor/ica: CobsLokacija: Geto PostPostano: 16:58 čet, 13. 1. 2011
    —
možeš recimo stavit:

Kod:
typedef node TREE;


to bi bilo ok ako imaš samo jedno stablo u SPACE - u.

ak bi ih imo više onda bi bilo pogodnijie

Kod:
typedef node* TREE;


uglavnom, ovaj SPACE u mainu ne spominješ nigdje, to ti je samo prostor svih čvorova koje možeš koristiti u main funkciji ( sva memorija koju možeš koristiti za čvorove, pa ona nema nikakve veze s nekim stablom posebno )

znači ak bi imo jedno stablo u cijelom prostoru...
( typedef node TREE; )
Kod:
int main(){

         TREE stablo;
         MAKE_NULL( &stablo ); // SPACE[0] je korijen ovog jedinog stabla
         // ovak bi ga mogo koristit
         stablo.first_child.next_sibiling.label;
         ....
}


ili više stabla u prostoru:

( typedef node* TREE; )
Kod:
int main(){

         TREE stablo1;
         TREE stablo2;

         MAKE_NULL( &stablo1 );
         MAKE_NULL( &stablo2 );
         // sada funkcija MAKE_NULL ne stavlja
         // da je korijen na SPACE[0] neg kak je ti namjestis
         ....
        // ovak bi ih mogo koristit
        stablo1-> first_child.next_sibiling.label;
        stablo2->first_child.first_child.next_sibiling.label;
       ...
}


Zadnja promjena: Cobs; 23:11 pet, 14. 1. 2011; ukupno mijenjano 1 put.

#17:  Autor/ica: Tomy007 PostPostano: 21:40 pet, 14. 1. 2011
    —
Zna li netko neki jednostavan način kako omogučiti korisniku da u program izvana unese bilo koje stablo(obično stablo, ne binarno) sa oznakama tipa char?

#18:  Autor/ica: CobsLokacija: Geto PostPostano: 23:09 pet, 14. 1. 2011
    —
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.

#19:  Autor/ica: luna5 PostPostano: 0:18 sub, 15. 1. 2011
    —
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]

#20:  Autor/ica: Vanja_ PostPostano: 15:42 sub, 15. 1. 2011
    —
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! Smile

#21:  Autor/ica: CobsLokacija: Geto PostPostano: 17:47 sub, 15. 1. 2011
    —
luna5 (napisa):

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


u while petlji u svakoj scanf funkciji gdje učitavaš znak moraš stavit razmak ispred %c:

Kod:
scanf(" %c",&l);


možda ti se tu već sve pošemeri kad učitavaš čvorove?
ostatak koda nisam ni gledo... ( al mi se sve skup čini malo prekomlicirano )

#22:  Autor/ica: ante003 PostPostano: 18:16 sub, 15. 1. 2011
    —
Jel mogu prikazat hrpu kao "lanac" ? da mi svaki cvor ima samo jedno dijete i td. ? manevriranje bi mi bilo olaksano a i dalje je to hrpa

#23:  Autor/ica: CobsLokacija: Geto PostPostano: 19:43 sub, 15. 1. 2011
    —
ante003 (napisa):
Jel mogu prikazat hrpu kao "lanac" ? da mi svaki cvor ima samo jedno dijete i td. ? manevriranje bi mi bilo olaksano a i dalje je to hrpa


Ak je nešto vezano za zadaću, ne bih preporučio da tak nešto radiš, jer onda hrpa gubi svoju funkcionalnost i smisao. Pa bi neki asistenti mogli skidati bodove na tome.
Ak nije vezano za zadaću, onda radi što hoćeš, a takva struktura već postoji ( sortirana lista ).

#24:  Autor/ica: pmli PostPostano: 20:27 sub, 15. 1. 2011
    —
ante003 (napisa):
...a i dalje je to hrpa

Nije. Hrpa je po (našoj) definiciji potpuno binarno stablo (uz još nešto). Wink

#25:  Autor/ica: ante003 PostPostano: 20:29 sub, 15. 1. 2011
    —
sjetio se 10 sek nakon postanja da nece vise bit hrpa, a posto neznam kako obrisat post nisam nista mjenjao Smile

#26:  Autor/ica: luna5 PostPostano: 13:32 ned, 16. 1. 2011
    —
Cobs (napisa):
luna5 (napisa):

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


u while petlji u svakoj scanf funkciji gdje učitavaš znak moraš stavit razmak ispred %c:

Kod:
scanf(" %c",&l);


možda ti se tu već sve pošemeri kad učitavaš čvorove?
ostatak koda nisam ni gledo... ( al mi se sve skup čini malo prekomlicirano )

hvala Smile
sad radi, no mislim da mi ova fje stvara problem !? Rolling Eyes
Kod:

node INSERT_SIBLING(labeltype l,node i, TREE *T)
{
     node n;
     if(i==NULL)
       {
        printf("Cvor ne pripada stablu");
        exit(1);
     }
     else
        if(i->parent==NULL)
        {
        printf("Cvor je korijen");
        exit(1);
        }
        else
        {   
            n=(celltype*)malloc(sizeof(celltype));
            n->label=l;
            n->first_child=NULL;
            n->next_sib=NULL;
            n->parent=i->parent;
            if(i->next_sib==NULL)
              i->next_sib=n;
            else
            {
                n->next_sib=i->next_sib;
                i->next_sib=n;
            }
        }
        return n;
}

#27:  Autor/ica: king_oberon PostPostano: 14:39 ned, 16. 1. 2011
    —
Err... ovako:

Zadaću moram napraviti pomoću implementacija za atp mapping pomoću sortiranog polja, i to sve imam, i sve štima.. ALI..

U domeni i kodomeni mi je tip podataka char, i sad recimo da moram upisivati domene i kodomene, i moj program mora biti u mogućnosti raditi razne naredbe(upiši ime i broj od tog imena, nađi broj od.., obriši broj od .., itd...

E sad, problem na koji sam naišao je taj da ja za ulazni podatak trebam odabrati naredbu, znači tipa, ako ja u kompajler upišem "BROJ OD", on mi tad treba ponuditi da upišem neko ime, i broj od te osobe... će reći da mi je cjelokupni ulazni podatak "BROJ OD mirko JE 098 765 4321" recimo. Isto tako i naredba "NAĐI BROJ OD mirko", ili "OBRIŠI BROJ OD mirko"...

Ima li itko ideju kako da postignem to da ja ako upišem u kompajler "BROJ OD __ JE __ " da to meni bude naredba..? ja nemam! Ehm?

#28:  Autor/ica: kakt00sLokacija: :ɐɾıɔɐʞoן PostPostano: 15:21 ned, 16. 1. 2011
    —
Kod:
Elementi domene su uredjeni parovi oblika (a, b), za a, b∈{0, 1, 2, …, n}. Kodomena je skup {0, 1, 2, …, n}. Svako ovakvo preslikavanje f je zapravo jedna binarna operacija * na skupu {0, 1, 2, …, n} (stavimo a * b = f(a,b)). Napišite potprograme koji odredjuju je li ta operacija komutativna, asocijativna, te postoji li jedinični element (to je element e za kojeg vrijedi a*e=e*a=a za sve a).


Ulazni podaci: broj n, te nekoliko redaka oblika a b c. Svaki takav redak postavlja da je f(a,b)=c (to jest da je a*b=c). Zadnji redak je oblika -1 -1 -1 i njega treba ignorirati.
Izlazni podaci: ispišite koja svojstva ima funkcija (tj. binarna operacija) definirana u ulaznim podacima.
Na primjer, za ulazne podatke:
2
2 2 2
2 0 0
2 1 1
0 2 0
0 0 1
0 1 2
1 2 1
1 0 2
1 1 0
-1 -1 -1
treba ispisati:
komutativna je
asocijativna je
ima jedinicni element: 2


Nije važno koji atp imam... mene buni zadatak... rješio sam ga na način koji sam ja shvatio... npr...

Kod:
1
0 0 1
0 1 0
1 0 0
1 1 1
Komutativna je.
Asocijativna je.
Ima jedinični element: 1


Kod:
1
0 0 1
0 1 0
1 0 0
1 1 1
Nije komutativna.
Nije asocijativna
Nema jedinični element.


Jesam ja to dobro shvatio? Jel postoji neka poveznica između ta 3 svojstva? Jasno mi je da funkcija ne može imati jedinični element ako nije komutativna...

#29:  Autor/ica: kratki89Lokacija: Zemlja i okolica PostPostano: 21:31 ned, 16. 1. 2011
    —
imam pitanje u vezi svoje zadaće koja glasi:

Sažmite m uzlazno sortiranih listi pomoću hrpe. Hrpa je prikazana pomoću pointera, a lista je vezana lista i veze su prikazane pomoću kursora. Pretpostavimo da lista sadrži elemente tipa char. Ne trebate implementirati sve funkcije iz atp LIST, nego samo one koje su vam potrebne u zadatku. Pretpostavite da ukupno ima najviše 10 lista, svaka ima najviše po 20 elemenata.
Pitanje: ako je lista vezana lista koje veze su onda prikazane pomoću kursora, tj. za što koristimo kursor ako se vezana lista implementira pomoću pointera (bar tako piše u skripti)

#30:  Autor/ica: ante003 PostPostano: 21:39 ned, 16. 1. 2011
    —
kratki89 (napisa):
imam pitanje u vezi svoje zadaće koja glasi:

Sažmite m uzlazno sortiranih listi pomoću hrpe. Hrpa je prikazana pomoću pointera, a lista je vezana lista i veze su prikazane pomoću kursora. Pretpostavimo da lista sadrži elemente tipa char. Ne trebate implementirati sve funkcije iz atp LIST, nego samo one koje su vam potrebne u zadatku. Pretpostavite da ukupno ima najviše 10 lista, svaka ima najviše po 20 elemenata.
Pitanje: ako je lista vezana lista koje veze su onda prikazane pomoću kursora, tj. za što koristimo kursor ako se vezana lista implementira pomoću pointera (bar tako piše u skripti)

pa ti mozes implementirati listu na vise nacina a ne samo preko pointera.
U skripti imas na 8 stranici implementaciju pomocu polja recimo a na 10 pomocu pointera.

#31:  Autor/ica: kratki89Lokacija: Zemlja i okolica PostPostano: 22:07 ned, 16. 1. 2011
    —
znam da se lista može implementirati pomoću polja, ali piše vezana lista, a u skripti piše da se implementacija liste pomoću pointera obično zove vezana lista. bojim se napraviti pomoću polja pa da mi uzmu bodove jer se trebalo pomoću pointera, nedoumica još traje... Sad

#32:  Autor/ica: CobsLokacija: Geto PostPostano: 2:10 pon, 17. 1. 2011
    —
luna5 (napisa):

hvala Smile
sad radi, no mislim da mi ova fje stvara problem !? Rolling Eyes
Kod:

node INSERT_SIBLING(labeltype l,node i, TREE *T)
{
    ...
}


meni se čini ok... na čem radiš zadaću? devcpp - u?
ako je tako stavi si ispred svake linije:
Kod:
exit(1);

ovu liniju:
Kod:
system("pause");


( inače će devcpp samo iskočiti iz programa, pa nećeš vidjet ispis, tj. razlog izlaska iz programa )

#33:  Autor/ica: tricky PostPostano: 15:41 pon, 17. 1. 2011
    —
jel zna možda netko:

implementacija dictionarya preko zatvorenog hasha

#34:  Autor/ica: .anchy.Lokacija: Zgb PostPostano: 16:01 pon, 17. 1. 2011
    —
kratki89 (napisa):
znam da se lista može implementirati pomoću polja, ali piše vezana lista, a u skripti piše da se implementacija liste pomoću pointera obično zove vezana lista. bojim se napraviti pomoću polja pa da mi uzmu bodove jer se trebalo pomoću pointera, nedoumica još traje... Sad

vezana lista može biti vezana pomoću pointera i pomoću kursora(možda pomoću još nečeg,ali ja neznam,nismo do sada radili),tebi je pomoću kursora..tak i meni,i to stvara puuuno problema,bilo bi mi lakše da su pointeri,to smo bar na programiranju detaljnije radili!

p.s.tak i u skripti piše,da su to dvije različite stvari,a i radili smo 2,3 primjera sa vezanom listom pomoću kursora na kojima se vidi da su to razl.stvari!
i nemoj pomoću polja,to je pak treća stvar!

#35:  Autor/ica: kakt00sLokacija: :ɐɾıɔɐʞoן PostPostano: 16:51 pon, 17. 1. 2011
    —
Jel postoji razlika u ponašanju ova 2 ASSIGNA? (ako da... koja???)

Kod:
scanf("%[^\n]", &s1); //upisujem BUREK
scanf("%[^\n]", &s2); //upisujem SIR

ASSIGN(&M,s1,s2);
ASSIGN(&M,"BUREK","SIR");

#36:  Autor/ica: ante003 PostPostano: 17:19 pon, 17. 1. 2011
    —
kakt00s (napisa):
Jel postoji razlika u ponašanju ova 2 ASSIGNA? (ako da... koja???)

Kod:
scanf("%[^\n]", &s1); //upisujem BUREK
scanf("%[^\n]", &s2); //upisujem SIR

ASSIGN(&M,s1,s2);
ASSIGN(&M,"BUREK","SIR");

u prvom saljes varijable a u drugom neki odredeni string
ali ono sto ce funkcija radit ostaje isto.

#37:  Autor/ica: .anchy.Lokacija: Zgb PostPostano: 17:57 pon, 17. 1. 2011
    —
kakt00s (napisa):
Jel postoji razlika u ponašanju ova 2 ASSIGNA? (ako da... koja???)

Kod:
scanf("%[^\n]", &s1); //upisujem BUREK
scanf("%[^\n]", &s2); //upisujem SIR

ASSIGN(&M,s1,s2);
ASSIGN(&M,"BUREK","SIR");


umm,da nije možda 'BUREK' a ne "BUREK"?
ako ti se buni,pretp.da je zbog tog?

#38:  Autor/ica: kakt00sLokacija: :ɐɾıɔɐʞoן PostPostano: 18:05 pon, 17. 1. 2011
    —
.anchy. (napisa):
kakt00s (napisa):
Jel postoji razlika u ponašanju ova 2 ASSIGNA? (ako da... koja???)

Kod:
scanf("%[^\n]", &s1); //upisujem BUREK
scanf("%[^\n]", &s2); //upisujem SIR

ASSIGN(&M,s1,s2);
ASSIGN(&M,"BUREK","SIR");


umm,da nije možda 'BUREK' a ne "BUREK"?
ako ti se buni,pretp.da je zbog tog?


Nope... već kad upisujem stringove ručno (npr.... "BUREK", "PITA",...)
onda sve lijepo šljaka.

Ali kad pokušam učitavat stringove sa scanf, onda svaki put cijeli MAPPING prešprica sa posljednjim upisanim stringom (tj. svi elementi MAPPINGA su jednaki zadnjem upisanom)

#39:  Autor/ica: .anchy.Lokacija: Zgb PostPostano: 18:35 pon, 17. 1. 2011
    —
neznam..možda da staviš razmak ispred % u drugom učitavanju,možda je to? makar sumnjam,mislim da je u funkciji problem?

#40:  Autor/ica: kakt00sLokacija: :ɐɾıɔɐʞoן PostPostano: 20:07 pon, 17. 1. 2011
    —
Provjeravao... u funkciju ulaze dobre vrijednosti...

i funkcija radi savršeno kada ubacujem podatke na način ASSIGN(&M,"riječ1","riječ2")

...ali ne kad učitavam stringove pa pozovem ASSIGN(&M,string1,string2)

P.S. Ako je netko voljan pomoći (ako ima malo više vremena) nek se javi u PM... pweeeezzzz

Added after 42 minutes:

Pmli, inbox ti je pun. Smile

#41:  Autor/ica: Fruc PostPostano: 20:27 pon, 17. 1. 2011
    —
Trebao bi učitat sve rezervirane riječi iz C-a u jedan rječnik, piše da može iz datoteke, a mene zanima kako se to radi, a ako neko zna neki drugi način a da nije ručno upisivanje također može, hvala

#42:  Autor/ica: ante003 PostPostano: 21:12 pon, 17. 1. 2011
    —
citanje iz datoteke si trebao naucit u prog 2.
ucitas rijec iz datoteke u varijablu word;
insert(word,R); ili kako vec ide funkcija za ubacivanje u rijecnik
ako hoces sve rijeci pokupit iz datoteke, napravi while petlju.

#43:  Autor/ica: CobsLokacija: Geto PostPostano: 21:13 pon, 17. 1. 2011
    —
Fruc (napisa):
Trebao bi učitat sve rezervirane riječi iz C-a u jedan rječnik, piše da može iz datoteke, a mene zanima kako se to radi, a ako neko zna neki drugi način a da nije ručno upisivanje također može, hvala


http://degiorgi.math.hr/prog2/materijali/p2-vjezbe.pdf

pogledaj zadnju lekciju, imaš par početničkih primjera, a imaš još 1000 primjera na internetu, sam malo proćaćkaj

#44:  Autor/ica: Fruc PostPostano: 23:01 pon, 17. 1. 2011
    —
fala riješio sam

#45:  Autor/ica: čungalungaLokacija: varaždin/zagreb PostPostano: 0:10 uto, 18. 1. 2011
    —
jel mi može neko napisati implementaciju za COMPUTE za MAPPING pomoću otvorenog linearnog hashiranja?

Edit: napisano Razz


Zadnja promjena: čungalunga; 2:34 uto, 18. 1. 2011; ukupno mijenjano 2 put/a.

#46:  Autor/ica: -georges- PostPostano: 0:30 uto, 18. 1. 2011
    —
Osmislite algoritam i napišite odgovarajući program za sortiranje m vektora oblika: X(r)=(x1(r),...,xn(r)), r=1,..,m. Kažemo da je vektor X(j) < X(k) ako postoji i, 1 ≤ i ≤ n takav da vrijedi: xr(j) = xr(k) za sve 1 ≤ r < i i xi(j) < xi(k) (to jest, sortira se leksikografski). Nemojte uvoditi ograničenja na veličinu brojeva m i n.


Ulazni podaci: u prvom retku brojevi m i n; u svakom od idućih m redaka po n brojeva koji čine koordinate u pojedinom vektoru.
Izlazni podaci: m redaka, svaki sa po n redaka; u svakom retku nalazi se koordinatni zapis jednog vektora; vektori trebaju biti navedeni u sortiranom redoslijedu.
Na primjer, za ulazne podatke:
4 3
5 2 3
1 4 2
5 2 1
6 2 3
treba ispisati:
1 4 2
5 2 1
5 2 3
6 2 3



ako ima neka dobra duša da mi da neke smjernice jer ja uopće nemam pojma koji atp bi koristil.

i da, znam da sam se rano sjetil. Wink

#47: Makar jos nije dosla... Autor/ica: kkarlo PostPostano: 21:13 sub, 17. 12. 2011
    —
Nest sam poceo radit, i zapeo vec na pocetku... Pa da ne odustanem tako brzo, ak moze netko rec di je problem.
Znaci atp set, preko sortirane vezane liste.
Kod:

typedef int elementtype;
typedef struct cell_tag{
    elementtype element;
    struct cell_tag *next;
}celltype;
typedef celltype *SET;
void MAKE_NULL(SET A)
{
    A=(celltype*)malloc(sizeof(celltype));
    A->next=NULL;
}
int MEMBER(int x, SET A)
{
    SET pom=A;
    while(pom->next != NULL){
        if(pom->element==x)
        return 1;
        pom=pom->next;
    }

    if(pom->element==x) return 1;

    return 0;
}
void INSERT(int x, SET A)
{
    celltype *novi,*pom=A;
    if(!MEMBER(x,A)){
            novi=(celltype*)malloc(sizeof(celltype));
            while(pom->next != NULL){
                pom=pom->next;
            }
            pom->next=novi;
            novi->next=NULL;
            novi->element=x;
            sortiraj(A);
    }
}

I tu mi vec steka... Prvi insert nekog broja i vec pada. Ne kuzim zasto, gledao sam gdje se srusi, i rusi se u memberu, ali nije mi jasno zasto jer prije poziva funkcije insert sam pozvao make null?

#48:  Autor/ica: ivstojic PostPostano: 21:26 sub, 17. 12. 2011
    —
Problem je sto funkciji MAKE_NULL saljes pointer, a ne pointer na pointer. Ako u C-u zelis u funkciji mijenjati argument, onda saljes pointer na njega. Ti ovdje zelis mijenjati pointer tipa celltype* (zelis u njega spremiti adresu koju vraca malloc), pa funkciji moras dati pointer na to, dakle pointer na pointer.

Nesto ovako bi trebalo raditi:

Kod:

void MAKE_NULL (SET *A)
{
    *A = (celltype*) malloc(sizeof(celltype));
    (*A)->next = NULL;
}

#49:  Autor/ica: kkarlo PostPostano: 21:53 sub, 17. 12. 2011
    —
ivstojic (napisa):
Problem je sto funkciji MAKE_NULL saljes pointer, a ne pointer na pointer. Ako u C-u zelis u funkciji mijenjati argument, onda saljes pointer na njega. Ti ovdje zelis mijenjati pointer tipa celltype* (zelis u njega spremiti adresu koju vraca malloc), pa funkciji moras dati pointer na to, dakle pointer na pointer.

Nesto ovako bi trebalo raditi:

Kod:

void MAKE_NULL (SET *A)
{
    *A = (celltype*) malloc(sizeof(celltype));
    (*A)->next = NULL;
}

Hvala. Ali i dalje mi ne radi... Mislim nisam korisito double pointere od prog2, a ni tamo nismo nest forsali double pointere, tak da bi svaka pomoc dobro dosla... Evo par pitanja:
Znači u mainu imam SET *A (sto je ustvari **celltype). I sad kad ga šaljem u MAKE_NULL kao argument, da li stavljam *A?
I da li moram prije poziva alocirat memoriju za A?
Tj. da li bi to izgledalo ovako:
SET *A;
A=(SET*)malloc(sizeof(SET));
MAKE_NULL(*A);
I dalje pitanje...
Što kada imam funkciju MEMBER u kojoj ne želim mijenjat ništa kako njoj predajem A? MEMBER(?)
Malko me zbunjuju ti double pointeri...
Confused

#50:  Autor/ica: ivstojic PostPostano: 22:24 sub, 17. 12. 2011
    —
U ovom tvom primjeru bi se slao samo A (jer je tipa celltype**, a MAKE_NULL prima stvar tipa celltype**), pa bi onda radilo.
ali A mozes deklarirati i kao SET A, pa bi onda u MAKE_NULL slao adresu od A:

Kod:

SET A;
MAKE_NULL(&A);
INSERT(3, A);
INSERT(5, A);
...


Princip je isti kao kad imas int koji zelis mijenjati u funkciji – funkcija prima pointer na int, a kad ju zoves posaljes adresu. Dvostruki pointer je samo najobicniji pointer koji pokazuje na nesto sto je takodjer pointer.

Ostalim funkcijama mozes slati samo SET A kao u funkcijama INSERT i MEMBERS u gornjem kodu, ako te funkcije nemaju potrebu mijenjati samu varijablu A. Ako one samo mijenjaju neke pointere dalje u vezanoj listi, ne trebas im slati pointer na A.

#51:  Autor/ica: kkarlo PostPostano: 9:46 ned, 18. 12. 2011
    —
ivstojic (napisa):
U ovom tvom primjeru bi se slao samo A (jer je tipa celltype**, a MAKE_NULL prima stvar tipa celltype**), pa bi onda radilo.
ali A mozes deklarirati i kao SET A, pa bi onda u MAKE_NULL slao adresu od A:

Kod:

SET A;
MAKE_NULL(&A);
INSERT(3, A);
INSERT(5, A);
...


Princip je isti kao kad imas int koji zelis mijenjati u funkciji – funkcija prima pointer na int, a kad ju zoves posaljes adresu. Dvostruki pointer je samo najobicniji pointer koji pokazuje na nesto sto je takodjer pointer.

Ostalim funkcijama mozes slati samo SET A kao u funkcijama INSERT i MEMBERS u gornjem kodu, ako te funkcije nemaju potrebu mijenjati samu varijablu A. Ako one samo mijenjaju neke pointere dalje u vezanoj listi, ne trebas im slati pointer na A.

Hvala, uspio sam!
Very Happy

#52:  Autor/ica: kkarlo PostPostano: 10:24 čet, 5. 1. 2012
    —
Sta nije danas trebala bit objavljena zadaca?
Ili je to sutra a meni su se malo datumi pomijesali...?
Surprised

#53:  Autor/ica: kkarlo PostPostano: 21:18 čet, 5. 1. 2012
    —
kkarlo (napisa):
Sta nije danas trebala bit objavljena zadaca?
Ili je to sutra a meni su se malo datumi pomijesali...?
Surprised

I da sam sebi odgovorim:

http://web.math.pmf.unizg.hr/nastava/spa/zadaci.php

Cool

#54:  Autor/ica: kkarlo PostPostano: 18:24 sri, 11. 1. 2012
    —
Moj zadatak:
Implementirajte a.t.p. SET pomoću nesortirane vezane liste (veze u listi su uspostavljene pomoću pointera) i pretpostavku da skupovi sadrže podatke tipa char.


Ulazni podaci: dva niza znakova koji predstavljaju elemente dvaju skupova A i B.
Izlazni podaci: 5 nizova znakova, svaki u jednom redu – unija, presjek, razlika A∖ B, maximalni element skupa A; zadnji string je DA ako je A⊆ B, a NE u protivnom. Elemente skupova možete ispisati u bilo kojem redoslijedu, ali svaki se mora javljati točno jednom!

I sad me muci ako imam A=SONJA i B=ANA, da li u uniju idu oba A ili samo jedno?
Unija=SONJA ili SONJAA ??
Pretpostavljam da je ovo drugo, ali da provjerim...
Jer ako je prvo tocno, onda ako je A=KOKO i B=KOKOLO, AUB bi imala manje elemenata od samog B.
I jel presjek onda isto KOKO kod ovog zadnjeg primjera?

#55:  Autor/ica: @na PostPostano: 20:18 sri, 11. 1. 2012
    —
pa piše ti: "Elemente skupova možete ispisati u bilo kojem redoslijedu, ali svaki se mora javljati točno jednom!"

znači..unija ti je npr. od SONJA i ANA → SONJA, tj. od KOKO i KOKOLO → KOL
isto tako ako trebaš presjek od prvog će biti samo AN, odnosno od drugog KO

...tako sam barem ja skužila...da si dobio MULTISET onda bi se u uniji i presjeku brojalo koliko je kojih slova pa bi ih sve morao ispisati..
inače, ovdje kako prolaziš po elementima jednog i drugog skupa moraš provjeriti nalazi li se taj element već u skupu, ako da - ne ubacuješ ga više Wink

#56:  Autor/ica: kkarlo PostPostano: 20:30 sri, 11. 1. 2012
    —
@na (napisa):
pa piše ti: "Elemente skupova možete ispisati u bilo kojem redoslijedu, ali svaki se mora javljati točno jednom!"

znači..unija ti je npr. od SONJA i ANA → SONJA, tj. od KOKO i KOKOLO → KOL
isto tako ako trebaš presjek od prvog će biti samo AN, odnosno od drugog KO

...tako sam barem ja skužila...da si dobio MULTISET onda bi se u uniji i presjeku brojalo koliko je kojih slova pa bi ih sve morao ispisati..
inače, ovdje kako prolaziš po elementima jednog i drugog skupa moraš provjeriti nalazi li se taj element već u skupu, ako da - ne ubacuješ ga više Wink

Ma napravio sam ja vec na oba nacina...
Samo pitam s kojim da se pojavim na predaji zadace...
Laughing
Ali, hvala.

#57:  Autor/ica: minora665 PostPostano: 20:51 sri, 11. 1. 2012
    —
Dobila sam zadatak (između ostalog) implementirati TREE pomoću polja na temelju veze čvor - prvo dijete - slijedeći brat. Nije mi jasno sto je "globalni kursor avail" koji se koristi u skripti u poglavlju o toj implementaciji. Dakle ako itko zna please sto je to ne kuzim jel to nesto u c-u, moram li ga ja definirati, kako? Kuzim kako ga koristit u implementaciji (on je prvi slobodni node za cvor koji stvaramo) ali ne znam kako njega samog da deklariram implementiram ili sto vec trebam.... Confused

#58:  Autor/ica: kkarlo PostPostano: 21:17 sri, 11. 1. 2012
    —
minora665 (napisa):
Dobila sam zadatak (između ostalog) implementirati TREE pomoću polja na temelju veze čvor - prvo dijete - slijedeći brat. Nije mi jasno sto je "globalni kursor avail" koji se koristi u skripti u poglavlju o toj implementaciji. Dakle ako itko zna please sto je to ne kuzim jel to nesto u c-u, moram li ga ja definirati, kako? Kuzim kako ga koristit u implementaciji (on je prvi slobodni node za cvor koji stvaramo) ali ne znam kako njega samog da deklariram implementiram ili sto vec trebam.... Confused

Trebas ga ti definirat, u to sam siguran, a kako ga definirat, e u to nisam siguran.
Mozda ovako:
node avail;
u njega spremis prvog slobodnog, a onda kako pise u skripti, tom slobodnom u next_sibling stavis node od slijedeceg slobodnog, pa slijedecem opet...itd. a zadnjem stavis -1.(tj.svakom kojeg ubacis stavis next_sibling=-1, pa ako ima jos slobodnih onda mjenjas)
Naravno moras pazit kako uzmes neki koji je bio slobodan da kad ga maknes iz liste, da onom prije njega u next_sibling stavis next_sibling od ovog kojeg si iskoristila.
Naravno, nisam siguran da li je to tocno, ali mozes probat.

#59:  Autor/ica: michelangelo PostPostano: 20:34 čet, 12. 1. 2012
    —
može neko pojašnjenje ovako zadane strukture nisam sigurna s čime tu zapravo raspolažem... ovaj labels mi nije jasan, što mi tu zapravo ulazi???

Neka je uredjeno stablo prikazano pomoću slijedeće strukture podataka:

typedef struct {
LIST header[maxnodes] ;
labeltype labels[maxnodes] ;
node root;
} TREE;

Uz ovakvu reprezentaciju implementirajte a.t.p. TREE. Pretpostavljamo da je node tipa int, labeltype je podatak tipa char, dok je a.t.p. LIST implementiran pomoću pointera, a header[i] predstavlja listu djece čvora i.

#60:  Autor/ica: jabuka PostPostano: 18:07 pet, 13. 1. 2012
    —
ako bi mi mogao netko dati bilo kakav hint za zadatak, stvarno ne znam ni od kud poceti Sad

Sažmite m silazno sortiranih listi pomoću hrpe. Hrpa je prikazana pomoću pointera, a lista je vezana lista i veze su prikazane pomoću kursora. Pretpostavimo da lista sadrži elemente tipa char. Ne trebate implementirati sve funkcije iz atp LIST, nego samo one koje su vam potrebne u zadatku. Pretpostavite da ukupno ima najviše 10 lista, svaka ima najviše po 20 elemenata. Ideja: u definiciji hrpe zamijenite "≤" sa "≥".


Ulazni podaci: broj m, pa m sortiranih nizova znakova koji čine elemente sortiranih listi koje treba spojiti.
Izlazni podaci: nakon svake operacije ubacivanja i izbacivanja u hrpu ispisujte što se i iz koje liste ubacuje/izbacuje; na kraju ispišite i cijelu sažetu sortiranu listu.
Na primjer, za ulazne podatke:
3 HA UJ KIH
treba ispisati:
ubacujem H iz liste 1
ubacujem U iz liste 2
ubacujem K iz liste 3
izbacujem U iz liste 2
ubacujem J iz liste 2
izbacujem K iz liste 3
ubacujem I iz liste 3
izbacujem J iz liste 2
izbacujem I iz liste 3
ubacujem H iz liste 3
izbacujem H iz liste 1
ubacujem A iz liste 1
izbacujem H iz liste 3
izbacujem A iz liste 1
sortirana lista: UKJIHHA

#61:  Autor/ica: yellow submarine PostPostano: 23:36 pet, 13. 1. 2012
    —
@ jabuka

Pogledaj slajdove iz "Vježbe - Poglavlje 4: Skupovi (samo prioritetni red - zadnji zadatak)" na stranicama kolegija, tamo imaš prilično dobar hint. Very Happy

#62:  Autor/ica: Buki PostPostano: 20:48 ned, 15. 1. 2012
    —
imam u zadatku implementaciju rjecnika preko otvorene hash tablice i sad kad sam to napisala, build log mi ne javlja nikakve greske niti upozorenja, ali program prestane raditi cim ga pokrenem, prije ikakvog unosa pa molim ako netko vidi u cemu je problem da se javi Smile

ovo je kod:
Kod:
void MAKE_NULL (DICTIONARY *A){
    int i;
    for (i=0; i<B; i++) (*A)[i] = NULL;
}

int MEMBER(char x[], DICTIONARY A){
    celltype *current;
    current = A[h(x)];                     

while (current != NULL){
    if (strcmp(current->element, x)==0) return 1;
            else current = current->next;
    }
return 0;                                   
}

void INSERT(char x[], DICTIONARY *A){
    celltype *temp;
    temp = (*A)[h(x)];

    (*A)[h(x)] = (celltype*)malloc(sizeof(celltype));
    strcpy((*A)[h(x)]->element, x);
    (*A)[h(x)]->next = temp;

return;
}

void DELETE(char x[], DICTIONARY *A){
    celltype *current, *temp;

if ( (*A)[h(x)] != NULL) {

if (strcmp((*A)[h(x)]->element,x)==0) {
        temp = (*A)[h(x)];
        (*A)[h(x)] = (*A)[h(x)]->next;
        free(temp);
}else{                                     
        current = (*A)[h(x)];
while (current->next != NULL)
    if (strcmp(current->next->element, x)==0) {
            temp = current->next;
            current->next = current->next->next;
            free(temp);
            return;
        }else
            current = current->next;
    }
    }
}

#63:  Autor/ica: kkarlo PostPostano: 21:14 ned, 15. 1. 2012
    —
Buki (napisa):
imam u zadatku implementaciju rjecnika preko otvorene hash tablice i sad kad sam to napisala, build log mi ne javlja nikakve greske niti upozorenja, ali program prestane raditi cim ga pokrenem, prije ikakvog unosa pa molim ako netko vidi u cemu je problem da se javi Smile

ovo je kod:
Kod:
void MAKE_NULL (DICTIONARY *A){
    int i;
    for (i=0; i<B; i++) (*A)[i] = NULL;
}

int MEMBER(char x[], DICTIONARY A){
    celltype *current;
    current = A[h(x)];                     

while (current != NULL){
    if (strcmp(current->element, x)==0) return 1;
            else current = current->next;
    }
return 0;                                   
}

void INSERT(char x[], DICTIONARY *A){
    celltype *temp;
    temp = (*A)[h(x)];

    (*A)[h(x)] = (celltype*)malloc(sizeof(celltype));
    strcpy((*A)[h(x)]->element, x);
    (*A)[h(x)]->next = temp;

return;
}

void DELETE(char x[], DICTIONARY *A){
    celltype *current, *temp;

if ( (*A)[h(x)] != NULL) {

if (strcmp((*A)[h(x)]->element,x)==0) {
        temp = (*A)[h(x)];
        (*A)[h(x)] = (*A)[h(x)]->next;
        free(temp);
}else{                                     
        current = (*A)[h(x)];
while (current->next != NULL)
    if (strcmp(current->next->element, x)==0) {
            temp = current->next;
            current->next = current->next->next;
            free(temp);
            return;
        }else
            current = current->next;
    }
    }
}

A gdje ti je main i to ucitavanje koje se ne dogodi?
Wink
Nisam siguran isto da li bi u MAKE_NULL trebala radit i alokaciju, ili ces to u mainu...iako mislim da bi to trebala u MAKE_NULL. Mislim radis ti kasnije alokaciju kad ubacujes element, ali ako sam dobro shvatio to bi trebali bit double pointeri, te kad u MAKE_NULL staviš (*A)[i] = NULL; to nemože radit, jer nisi alocirala tu memoriju...

#64:  Autor/ica: Buki PostPostano: 22:18 ned, 15. 1. 2012
    —
aha, kuzim otprilike, sad sam izmjenila make_null da mi izgleda ovako

Kod:
void MAKE_NULL (DICTIONARY *A){
    int i;
    for (i=0; i<B; i++){ (*A)[i] = (celltype*)malloc(sizeof(celltype));
                         (*A)[i] = NULL;
                        }
return;
}


i sad mi se vise ne rusi kad ga pokrenem vec se jednostavno nista ne dogada, a mogu pisat normalno u onom crnom prozoru

ovo mi je prvi dio main-a, dalje je sve vezano za konkretan zadatak:

Kod:
int main (void){
DICTIONARY A;
char naredba[30], rijec[30];

MAKE_NULL(&A);

INSERT("auto", &A);
INSERT("break", &A);
INSERT("case", &A);
INSERT("char", &A);
INSERT("const", &A);


EDIT: puno ti hvala, sad mi radi normalno, ali samo ako mi je B<5, imas ideju kako da to ispravim?

#65:  Autor/ica: kkarlo PostPostano: 22:46 ned, 15. 1. 2012
    —
Buki (napisa):
aha, kuzim otprilike, sad sam izmjenila make_null da mi izgleda ovako

Kod:
void MAKE_NULL (DICTIONARY *A){
    int i;
    for (i=0; i<B; i++){ (*A)[i] = (celltype*)malloc(sizeof(celltype));
                         (*A)[i] = NULL;
                        }
return;
}


i sad mi se vise ne rusi kad ga pokrenem vec se jednostavno nista ne dogada, a mogu pisat normalno u onom crnom prozoru

ovo mi je prvi dio main-a, dalje je sve vezano za konkretan zadatak:

Kod:
int main (void){
DICTIONARY A;
char naredba[30], rijec[30];

MAKE_NULL(&A);

INSERT("auto", &A);
INSERT("break", &A);
INSERT("case", &A);
INSERT("char", &A);
INSERT("const", &A);


EDIT: puno ti hvala, sad mi radi normalno, ali samo ako mi je B<5, imas ideju kako da to ispravim?

Mislim da bi ti dobar MAKE_NULL izgledao otprilike ovako:
{
int i;
(*A)=(DICTIONARY*)malloc(B*sizeof(DICTIONARY));
for (i=0; i<B; i++){ (*A)[i] = (celltype*)malloc(sizeof(celltype));
(*A)[i] = NULL;
}
}
To je onak na prvu, ak nije to, budem sutra navecer pogledao malo detaljnije, nemogu sada...
Naravno ako ti netko drugi vec ne pomogne...
Mislim da bi trebala imat polje[B] a svaki član tog polja je pointer. Prema tome prvo moras alocirat polje od B elemenata, a potom za svaki clan dodatno...
Valjda...

#66:  Autor/ica: Buki PostPostano: 23:01 ned, 15. 1. 2012
    —
Hvala, hvala, hvala Very Happy sad radi Laughing

#67:  Autor/ica: butterfly PostPostano: 17:44 uto, 17. 1. 2012
    —
Da li ima netko ideju kako učitati stablo (npr. sa tipkovnice)?

#68:  Autor/ica: pecinaLokacija: Happily traveling through space since 1986! PostPostano: 10:35 sri, 18. 1. 2012
    —
Unesi prvo oznaku korijena i koristi MAKE_ROOT.

Zatim učitaj oznaku djeteta.
Zatim učitaj oznaku njegovog djeteta.
Na STOP se vraćaš natrag.

Dakle rekurzivno za svaki čvor unosiš djecu, ali prvo ideš po dubini.

Možeš i ovako:
Unesi korijen
pozovi foo(korijen)
foo(node i)
unesi broj djece od i
for i = 1 to n
unesi i-to dijete
for i = 1 to n
foo(i-to dijete)


Prvi ti je unos DFS, drugi BFS (google it).

#69:  Autor/ica: butterfly PostPostano: 11:38 sri, 18. 1. 2012
    —
Hvala Very Happy

#70:  Autor/ica: travana PostPostano: 1:17 čet, 19. 1. 2012
    —
imam problema s funkcijom delete_max za hrpu, nikako ne vidim u cemu je greska, pogotovo jer je prakticki prepisana iz skripte, a na njoj mi se program rusi Rolling Eyes
pa ako vidite gresku slobodno ukazite na nju Very Happy


Kod:

typedef struct {
    int last;
    elementtype labels[MAXLENGHT];
} HEAP;


elementtype DELETE_MAX (HEAP *H) {
    int i, j;
    elementtype max;

    if (H->last < 0) {
        error("Hrpa je prazna!");

}
    else {
        max = H->labels[0]; //u korijenu je najveci element
        H->labels[0] = H->labels[H->last];
        (H->last)--;
        i = 0;
        while (i <= (H->last+1)/2-1) {
            if ((2*i + 1 == H->last) || (H->labels[2*i + 1] > H->labels[2*i + 2]))
                j = 2*i + 1;
            else
                j = 2*i + 2;
            if (H->labels[i] < H->labels[j]) {
                swap(H->labels[i], H->labels[j]);
                i = j;
            }
            else
                return max;
        }
        return max;
    }
}

#71:  Autor/ica: mini PostPostano: 10:04 čet, 19. 1. 2012
    —
michelangelo (napisa):
može neko pojašnjenje ovako zadane strukture nisam sigurna s čime tu zapravo raspolažem... ovaj labels mi nije jasan, što mi tu zapravo ulazi???

Neka je uredjeno stablo prikazano pomoću slijedeće strukture podataka:

typedef struct {
LIST header[maxnodes] ;
labeltype labels[maxnodes] ;
node root;
} TREE;

Uz ovakvu reprezentaciju implementirajte a.t.p. TREE. Pretpostavljamo da je node tipa int, labeltype je podatak tipa char, dok je a.t.p. LIST implementiran pomoću pointera, a header[i] predstavlja listu djece čvora i.


trebalo bi i meni par odgovora. kako uopće implementirati listu. može li mi netko dati primjer za bar jednu funkciju? malo me to sve skupa zbunilo Ehm?

#72:  Autor/ica: pecinaLokacija: Happily traveling through space since 1986! PostPostano: 10:13 čet, 19. 1. 2012
    —
mini (napisa):
michelangelo (napisa):
može neko pojašnjenje ovako zadane strukture nisam sigurna s čime tu zapravo raspolažem... ovaj labels mi nije jasan, što mi tu zapravo ulazi???

Neka je uredjeno stablo prikazano pomoću slijedeće strukture podataka:

typedef struct {
LIST header[maxnodes] ;
labeltype labels[maxnodes] ;
node root;
} TREE;

Uz ovakvu reprezentaciju implementirajte a.t.p. TREE. Pretpostavljamo da je node tipa int, labeltype je podatak tipa char, dok je a.t.p. LIST implementiran pomoću pointera, a header predstavlja listu djece čvora i.


trebalo bi i meni par odgovora. kako uopće implementirati listu. može li mi netko dati primjer za bar jednu funkciju? malo me to sve skupa zbunilo Ehm?


Piše ti: LIST implementirajte pomoću pointera.
Kod:
typedef struct tag_celltype
{
    struct tag_celltype *next;
    node childIndex;
} celltype;


Dakle, svi čvorovi stabla su zapisani u linearnom polju. root ti je 0 tj. na 0. mjestu se nalazi oznaka korijena u polju labels

labels[root] - oznaka korijena
header[root] - lista nodeova djece, npr [1, 2, 7]

Sad, ako želiš doći do djece od nekog node-a, samo pogledaš u header polje na njegovom mjestu. Dobit ćeš listu [i]novih indeksa
u oba polja labels i header koji ti definiraju tim redom oznaku tog čvora i popis djece.

Jasnije?

#73:  Autor/ica: pajopatak PostPostano: 17:45 pet, 20. 1. 2012
    —
može mala pomoć,imam implementaciju SET-a pomoću vezane liste, to sam sve napravila i sad kao zadani elementtype mi je char i to nikako nemogu ukomponirat u f-je,stalno mi grešku javlja,evo samo dio koda, pa ako netko zna u čemu je problem:

Kod:
typedef struct cell_tag {
char element[100];
struct cell_tag *next;
} celltype;

typedef celltype *SET;

void MAKE_NULL(SET *A){
*A = (celltype*) malloc(sizeof(celltype));
(*A)->next = NULL;
}

void INSERT(char x[], SET *A){
celltype *novi, *prethodni, *trenutni;
prethodni = *A;
trenutni = prethodni->next;
while(trenutni != NULL && strcmp(trenutni->element,x)<0){
prethodni = trenutni;
trenutni = prethodni->next;
}
if (trenutni != NULL && strcmp(trenutni->element,x)==0)
return;
else{
novi = (celltype*) malloc(sizeof(celltype));
strcpy(novi->element,x);
novi->next=trenutni;
prethodni->next = novi;
}
}

#74:  Autor/ica: satja PostPostano: 19:03 pet, 20. 1. 2012
    —
pajopatak (napisa):
može mala pomoć,imam implementaciju SET-a pomoću vezane liste, to sam sve napravila i sad kao zadani elementtype mi je char i to nikako nemogu ukomponirat u f-je,stalno mi grešku javlja,evo samo dio koda, pa ako netko zna u čemu je problem:

Kod:
typedef struct cell_tag {
char element[100];
struct cell_tag *next;
} celltype;

typedef celltype *SET;

void MAKE_NULL(SET *A){
*A = (celltype*) malloc(sizeof(celltype));
(*A)->next = NULL;
}

void INSERT(char x[], SET *A){
celltype *novi, *prethodni, *trenutni;
prethodni = *A;
trenutni = prethodni->next;
while(trenutni != NULL && strcmp(trenutni->element,x)<0){
prethodni = trenutni;
trenutni = prethodni->next;
}
if (trenutni != NULL && strcmp(trenutni->element,x)==0)
return;
else{
novi = (celltype*) malloc(sizeof(celltype));
strcpy(novi->element,x);
novi->next=trenutni;
prethodni->next = novi;
}
}


Kakvu ti grešku javlja? Meni se tvoj kod, uz
Kod:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
normalno kompajlira.

#75:  Autor/ica: viki PostPostano: 19:09 pet, 20. 1. 2012
    —
da li ima netko implementaciju a.t.p. TREE pomoću polja na osnovi veze "čvor → (roditelj, (prvo dijete, idući brat))" ? Smile

#76:  Autor/ica: pupi PostPostano: 19:35 pet, 20. 1. 2012
    —
Zadatak glasi ovako :

Sortirajte zadanu listu pomoću binarnog stabla traženja uzlazno i silazno koristeći isto binarno stablo traženja. Pretpostavimo da lista sadrži elemente tipa char. Binarno stablo traženja je prikazano pomoću polja, a implementaciju liste odaberite sami. Ne trebate implementirati sve funkcije iz atp LIST, nego samo one koje su vam potrebne u zadatku. Na binarnom stablu implementirajte sve operacije iz atp DICTIONARY osim DELETE.


Ulazni podaci: niz znakova koji čine elemente liste koje treba sortirati; ubacujte ih u BST točno redom kojim su navedeni.
Izlazni podaci: 3 retka: u prvom su elementi uzlazno sortirane liste, u drugom silazno sortirane, a u trećem je (za kontrolu) PREORDER obilazak konstruiranog stabla.
Na primjer, za ulazne podatke:
MIRKO
treba ispisati:
uzlazno sortirana lista: IKMOR
silazno sortirana lista: ROMKI
preorder: MIKRO


Funkcija insert mi uđe u beskonačnu petlju :


Kod:
void INSERT(char x, BTREE *T)
{
   int i;
   if (T->labels[0] == PRAZNO)
   {
      T->labels[0] = x;
      return;
   }
   else if (x < T->labels[0]) {
      i = 1;
      while(1)
      {
         if (T->labels[i] == PRAZNO) { T->labels[i] = x; break; }
         else if (x < T->labels[i]) i = 2*i+1;
         else if (x > T->labels[i]) i = 2*i+2;
      }
      return;
   }
   else if(x > T->labels[0]) {
      i = 2;
      while(1)
      {
         if (T->labels[i] == PRAZNO)  { T->labels[i] = x; break; }
         else if (x < T->labels[i]) i = 2*i+1;
         else if (x > T->labels[i]) i = 2*i+2;
      }
      return;
   }
}


Jel može pomoć u pronalasku greške? Smile

#77:  Autor/ica: satja PostPostano: 19:45 pet, 20. 1. 2012
    —
pupi (napisa):
Zadatak glasi ovako :

Sortirajte zadanu listu pomoću binarnog stabla traženja uzlazno i silazno koristeći isto binarno stablo traženja. Pretpostavimo da lista sadrži elemente tipa char. Binarno stablo traženja je prikazano pomoću polja, a implementaciju liste odaberite sami. Ne trebate implementirati sve funkcije iz atp LIST, nego samo one koje su vam potrebne u zadatku. Na binarnom stablu implementirajte sve operacije iz atp DICTIONARY osim DELETE.


Ulazni podaci: niz znakova koji čine elemente liste koje treba sortirati; ubacujte ih u BST točno redom kojim su navedeni.
Izlazni podaci: 3 retka: u prvom su elementi uzlazno sortirane liste, u drugom silazno sortirane, a u trećem je (za kontrolu) PREORDER obilazak konstruiranog stabla.
Na primjer, za ulazne podatke:
MIRKO
treba ispisati:
uzlazno sortirana lista: IKMOR
silazno sortirana lista: ROMKI
preorder: MIKRO


Funkcija insert mi uđe u beskonačnu petlju :


Kod:
void INSERT(char x, BTREE *T)
{
   int i;
   if (T->labels[0] == PRAZNO)
   {
      T->labels[0] = x;
      return;
   }
   else if (x < T->labels[0]) {
      i = 1;
      while(1)
      {
         if (T->labels[i] == PRAZNO) { T->labels[i] = x; break; }
         else if (x < T->labels[i]) i = 2*i+1;
         else if (x > T->labels[i]) i = 2*i+2;
      }
      return;
   }
   else if(x > T->labels[0]) {
      i = 2;
      while(1)
      {
         if (T->labels[i] == PRAZNO)  { T->labels[i] = x; break; }
         else if (x < T->labels[i]) i = 2*i+1;
         else if (x > T->labels[i]) i = 2*i+2;
      }
      return;
   }
}


Jel može pomoć u pronalasku greške? Smile


Čini mi se da, ako se u nekom trenutku petlje dogodi da je x == T→labels[i], brojač i se neće promijeniti i ostat ćeš u beskonačnoj petlji.

#78:  Autor/ica: pupi PostPostano: 19:59 pet, 20. 1. 2012
    —
Hvala, tu je bila greška Smile

#79:  Autor/ica: pajopatak PostPostano: 20:11 pet, 20. 1. 2012
    —
Implementirajte a.t.p. SET pomoću sortirane vezane liste (veze u listi su uspostavljene pomoću pointera) i pretpostavku da skupovi sadrže podatke tipa char. Nadopunite skupovne operacije iz implementacije sa simetričnom razlikom, tj. napišite dodatni potprogram koji računa simetričnu razliku skupova.


Ulazni podaci: dva stringa čiji znakovi predstavljaju elemente dvaju skupova A i B.
Izlazni podaci: 5 stringova, svaki u jednom redu – unija, presjek, razlika A∖ B, simetrična razlika; zadnji string je DA ako je A⊆ B, a NE u protivnom.
Na primjer, za ulazne podatke:
MIRKO
SLAVKO
treba ispisati:
unija: AIKLMORSV
presjek: KO
razlika: IMR
sim. razlika: AILMRSV
podskup: NE



Ovo je zadatak,ja sad ne razumijem dali ja trebam napravit impl.pomoću vezane liste za slova ili stringove,i kad npr.imam INSERT dali unosim samo slovo u skup ili string?

#80:  Autor/ica: pupi PostPostano: 20:25 pet, 20. 1. 2012
    —
Kako napraviti inorder za BST koje je prikazano preko polja ? :S

I kad napravim uzlazni sort kako koresteći isto BST silazno sortitrati?

#81:  Autor/ica: mono PostPostano: 20:58 pet, 20. 1. 2012
    —
Znam da je već nešto slično pisano na ovoj temi ali nikako si nemogu pronaći grešku pa bi bio zahvalan kada bi mi netko ispravio grešku.javlja mi ju u funkciji JELCLAN kod usporedbe current→element,x.

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

typedef celltype **DICTIONARY;
int h(char s[])
{
int sum=0,i;
for (i=0;i<strlen(s);i++) sum+=s[i];
return (sum%B);
}
int JELCLAN( char x[], DICTIONARY A)
{
celltype *current;

current=A[h(x)];
while(current!=NULL)
if(strcmp(current→element,x)==0)

printf("%s : DA\n",x);


else
{
current = current→next;
printf("x: NE\n");
return 0;
}
}

#82:  Autor/ica: pupi PostPostano: 23:56 pet, 20. 1. 2012
    —
pupi (napisa):
Kako napraviti inorder za BST koje je prikazano preko polja ? :S

I kad napravim uzlazni sort kako koresteći isto BST silazno sortitrati?

RIješeno Smile

#83:  Autor/ica: Bole13 PostPostano: 15:01 sub, 21. 1. 2012
    —
Može pomoć pls oko funkcije kojom unosim stablo. Radi se o implementaciji atp TREE na osnovi čvor → roditelj. Sve implementirane fje rade koliko sam istestirao i preorder radi, ali nikako da ispadne unos kako spada. Ovo je fja koju sam napravio:

Kod:
void UNOS_STABLA(node i, int broj_djece, TREE *T) {

    int j, djeca;
    labeltype label;
    node m, n;
    for(j = 1; j <= broj_djece; j++) {
        printf("Unesite oznaku i broj djece %d. djeteta cvora %d: ", j, i);
        scanf("%c %d", &label, &djeca);
        if(j == 1) m = INSERT_CHILD(label, i, T);
        else {
            n = INSERT_SIBLING(label, m, T);
            m = n;
        }
        UNOS_STABLA(m, djeca, T);
    }

}


Za root na poziciji 0 s oznakom a prvi poziv fje pita oznaku 1. djeteta od root i broj njegove djece te nakon toga ispiše na ekran:

"Unesite oznaku i broj djece 1. djeteta cvora 1: Unesite oznaku i broj djece 1. djeteta cvora 2:"

Znaći uopće mi neda mogućnost da unesem oznaku čvora 1 i broj njegove djece...

#84:  Autor/ica: slonic~tonic PostPostano: 15:02 sri, 5. 12. 2012
    —
kad bi mogla biti objavljena 2.zadaca?

#85:  Autor/ica: PermutiranoPrase PostPostano: 17:59 ned, 9. 12. 2012
    —
Zadnji put kad sam pitala Bujanovića je rekao da se još ne zna, možda bude prije praznika, možda poslije. Valjda ćemo saznati u utorak.

#86:  Autor/ica: slonic~tonic PostPostano: 18:08 ned, 9. 12. 2012
    —
PermutiranoPrase (napisa):
Zadnji put kad sam pitala Bujanovića je rekao da se još ne zna, možda bude prije praznika, možda poslije. Valjda ćemo saznati u utorak.


hvala ti Wink

#87:  Autor/ica: PermutiranoPrase PostPostano: 12:50 ned, 30. 12. 2012
    —
Zadaća objavljena... A ja marljiva pa već imam pitanja. Smile

Dobih zadatak:
Citat:
Implementirajte a.t.p. SET pomoću nesortirane liste (lista je implementirana pomoću polja) i pretpostavku da skupovi sadrže podatke tipa char.
Ulazni podaci: dva niza znakova koji predstavljaju elemente dvaju skupova A i B.
Izlazni podaci: 5 nizova znakova, svaki u jednom redu – unija, presjek, razlika A∖ B, maximalni element skupa A; zadnji string je DA ako je A⊆ B, a NE u protivnom. Elemente skupova možete ispisati u bilo kojem redoslijedu, ali svaki se mora javljati točno jednom!
Na primjer, za ulazne podatke:
MIRKO
SLAVKO
treba ispisati:
unija: RKAVILMOS
presjek: OK
razlika: RIM
max. element prvog skupa: R
podskup: NE


1) Trebam li raditi baš sa stringovima (tj.uključiti nul-znakove) ili samo s 'običnim' znakovima? Npr. je li A = {'M', 'I', 'R', 'K', 'O', '\n' } ili je A bez tog nulznaka ili je svejedno?

2) Smijem li u definiciji skupa imati i duljinu da mi olakša stvari, tj. je li ovo ok:
Kod:
typedef struct
{
   elementtype elements[N];
   int duljina;
} SET;


3) Funkcija za ispis mi isprazni skup koje ispisuje (uniju, presjek, razliku) pa su na kraju ti skupovi prazni. Je l to ok?

Samo mi dajte potvrdne odgovore, ovako mi sve savršeno radi. Yes

#88:  Autor/ica: kiara PostPostano: 1:35 pon, 31. 12. 2012
    —
Imam pitanje kod zadatka iz zadace kojima su ulazni podaci:
UBACI mirko
UBACI slavko
UBACI ivica
UKLONI mirko
UBACI sanja
i tome slicno,do kada moram ucitavati te ulazne podatke? Ne pise mi nigdje kako da prestanem ucitavati. Ako netko moze pomoci? Hvala!

#89:  Autor/ica: Loo PostPostano: 8:59 pon, 31. 12. 2012
    —
imam i ja pitanje. ako moramo implementirati MULTISET, nadam se da smijemo u implementaciji imati funkciju koja govori koliko puta se određeni element javlja u multiskupu? ili to nekako podmetnuti u funkciju MEMBER? Smile

ne znam kako bi inače ispisala članove neovisno o implementaciji.

#90:  Autor/ica: pedro PostPostano: 9:36 pon, 31. 12. 2012
    —
trebam upisati riječ i ubacit je u atp LIST

ovako sam ja napravila:

Kod:
LIST L;
    MAKE_NULL_LIST(&L);

    char rijec[100];

    printf("Ulazni podatak:\n");
    scanf("%s", rijec);
    while( rijec != "\t" )
    {
        INSERT_LIST(rijec, END_LIST(L), &L);
        scanf("%s", rijec);
    }


ne kužim zašto neće :S

IMPLEMENTACIJA IZGLEDA OVAKO:

Kod:
typedef char elementtype;

typedef struct cell_tagL
{
    elementtype elementL;
    struct cell_tagL *next;
} celltypeL;

typedef celltypeL *LIST;
typedef celltypeL *position;

position END_LIST(LIST L)
{
    position q;
    q = L;
    while(q->next != NULL)
      q = q->next;

    return q;
}

position MAKE_NULL_LIST(LIST *L)
{
    *L = (celltypeL*) malloc(sizeof(celltypeL));
    (*L)->next = NULL;

    return (*L);
}

void INSERT_LIST(elementtype x, position p, LIST *L)
{
    position temp;
    temp = p->next;
    p->next = (celltypeL*) malloc(sizeof(celltypeL));
    p->next->elementL = x;
    p->next->next = temp;
}

void DELETE_LIST(position p, LIST *L)
{
    position temp;
    temp = p->next;
    p->next = p->next->next;
    free(temp);
}

position FIRST_LIST(LIST L)
{
    return L;
}

position NEXT_LIST(position p, LIST L)
{
    return p->next;
}

position PREVIOUS_LIST(position p, LIST L)
{
    position q = L;
   while(q->next != p)
      q = q->next;

   return q;

}

elementtype RETRIEVE_LIST(position p, LIST L)
{
    return p->elementL;
}

#91:  Autor/ica: kkarlo PostPostano: 11:49 pon, 31. 12. 2012
    —
pedro (napisa):
trebam upisati riječ i ubacit je u atp LIST

ovako sam ja napravila:

Kod:
LIST L;
    MAKE_NULL_LIST(&L);

    char rijec[100];

    printf("Ulazni podatak:\n");
    scanf("%s", rijec);
    while( [b]rijec != "\t"[/b] )
    {
        INSERT_LIST(rijec, END_LIST(L), &L);
        scanf("%s", rijec);
    }


ne kužim zašto neće :S


Koliko se sjećam za uspoređivanje stringova se koristi funkcija strcmp iz string.h
Smile
Ostatak nisam ni gledao, moguće da nije samo to...

#92:  Autor/ica: mamba PostPostano: 18:07 uto, 1. 1. 2013
    —
0000000000000

Zadnja promjena: mamba; 15:48 pet, 4. 1. 2013; ukupno mijenjano 1 put.

#93:  Autor/ica: sasha.f PostPostano: 19:11 uto, 1. 1. 2013
    —
Kod:

typedef struct {
  elementtype niz[MAXLENGTH];
  int last;
} DICTIONARY;

void MAKE_NULL(DICTIONARY *R)
{
  A->last = -1;
}


zašto javlja grešku: 'DICTIONARY' has no member named 'last'?

i ovdje: expected ')' before 'x'?
Kod:

void INSERT(elementtype x, DICTIONARY *R)

#94:  Autor/ica: kkarlo PostPostano: 21:09 uto, 1. 1. 2013
    —
sasha.f (napisa):
Kod:

typedef struct {
  elementtype niz[MAXLENGTH];
  int last;
} DICTIONARY;

void MAKE_NULL(DICTIONARY *R)
{
 A->last = -1;
}


zašto javlja grešku: 'DICTIONARY' has no member named 'last'?

Promjeni u R ili gore u A pa će bit ok. Kao primaš u R a koristiš A koji nemaš barem u toj funkciji...
Za ovaj drugi problem, pogledaj si sta si prije toga napravio...jer u ovom napisanom ne bi trebalo bit greske, tako da je mozda red prije, il nes...

#95:  Autor/ica: sasha.f PostPostano: 23:00 uto, 1. 1. 2013
    —
promjenjeno, ali i dalje javlja iste greške

Added after 13 minutes:

Kod:
typedef struct {
  elementtype niz[MAXLENGTH];
  int last;
} DICTIONARY;


za ovo još javlja: expected specifier-qualifier-list before elementtype

#96:  Autor/ica: JJ PostPostano: 23:09 uto, 1. 1. 2013
    —
Pa jesi definirao šta ti je elementtype? Recimo moj zadatak je s char-ovima pa onda imam naredbu:

Kod:
typedef char elementtype;

#97:  Autor/ica: sasha.f PostPostano: 23:33 uto, 1. 1. 2013
    —
ne Embarassed
hvala

#98:  Autor/ica: sasha.f PostPostano: 1:09 sri, 2. 1. 2013
    —
Kod:

while(fscanf(f, "%[^\n]", rijec)>0)
    {
        INSERT(rijec, &A);
        fscanf(f, "\n");
    }


Što je krivo ovdje? trebam učitati riječi iz datoteke..

#99:  Autor/ica: Ryssa PostPostano: 2:59 sri, 2. 1. 2013
    —
Može li kratko objašnjenje za hrpu pomoću pointera za funkciju void nadjiRoditelja http://web.math.pmf.unizg.hr/nastava/spa/files/upute_hrpa_sa_pointerima.html Nije mi baš jasno što predstavlja node *rezultat, odnosno kako se on mijenja rekurzivnim pozivima funkcije?

#100:  Autor/ica: malalodacha PostPostano: 19:38 sri, 2. 1. 2013
    —
Implementirajte a.t.p. MAPPING pomoću sortiranog polja sa M elemenata i napišite potprogram koji će provjeriti da li je funkcija injekcija. Pretpostavite da je domena skup imena duljine max. 20 slova, a kodomena skup telefonskih brojeva (cijeli brojevi).


Ulazni podaci: niz naredbi oblika:

BROJ OD s JE p, gdje je s neko ime, a p neki broj – ova naredba pridružuje imenu s broj p.
OBRISI BROJ OD s, gdje je s neko ime – ova naredba briše iz preslikavanja tel. broj je pridružen imenu p.
NADJI BROJ OD s, gdje je s neko ime – ova naredba ispisuje tel. broj je pridružen imenu p.
INJEKCIJA – ova naredba ispisuje DA ako je trenutno preslikavanje injekcija (tj. različitim imenima su pridruženi različiti brojevi), a NE ako nije.

Izlazni podaci: nakon svake naredbe oblika NADJI BROJ OD s i INJEKCIJA treba ispisati odgovarajuću poruku.
Na primjer, za ulazne podatke:
BROJ OD Mirko JE 3628472
BROJ OD Slavko JE 6284164
NADJI BROJ OD Mirko
NADJI BROJ OD Ivica
INJEKCIJA
BROJ OD Pero JE 3628472
INJEKCIJA
treba ispisati:
BROJ OD Mirko JE: 3628472
BROJ OD Ivica JE: nedefiniran
TRENUTNO DEFINIRANA FUNKCIJA JE INJEKCIJA
TRENUTNO DEFINIRANA FUNKCIJA NIJE INJEKCIJA

Može li pomoć ili kod od ovog zadatka ako netko ima?

#101:  Autor/ica: dalmatinčica PostPostano: 19:18 uto, 8. 1. 2013
    —
pozdrav,
imam problem sa zadatkom iz 2. zadaće

Napišite program koji će učitati dva stringa duljine max. 100. Ti stringovi predstavljaju zapise prirodnih brojeva x i y u bazi 10. Program treba te brojeve pretvoriti u binarne brojeve i treba pomoću algoritma za množenje n-bitnih brojeva izračunati x · y. Rezultat korisniku vratite u dekadskom obliku.

Ulazni podaci: dva stringa duljine max. 100.
Izlazni podaci: brojevi x i y u bazi 2, te njihov umnožak u bazi 2 i u bazi 10.
Na primjer, za ulazne podatke:
1099511627776 3
treba ispisati:
x u bazi 2: 10000000000000000000000000000000000000000
y u bazi 2: 11
x*y u bazi 2: 110000000000000000000000000000000000000000
x*y u bazi 10: 3298534883328

problem je što ga neznam riješiti.
pa ako ima neka dobra duša koja ima kakvu pametnu ideju da barem natukne kako bi se ovaj zadatak rješavao.
pokušavala sam ja ispisivati nekakve funkcije za potrebne operacije, ali se uvijek zapetljam i shvatim da zapravo nemogu tako riješiti...
hvala unaprijed
Very Happy


edit:
barem ideja za ovo zadnje, pretvaranje oakvog velikog binarnog broja u dekadski

#102:  Autor/ica: Ryssa PostPostano: 16:01 ned, 13. 1. 2013
    —
Zna li netko kako je najlakše učitavati m sortiranih listi(veze pomoću kursora) i pamtiti koji je element iz koje liste?

#103:  Autor/ica: linusLokacija: subnet mask PostPostano: 15:44 sri, 16. 1. 2013
    —
Nije mi jasan zadatak
Osmislite algoritam i napišite odgovarajući program za sortiranje m vektora oblika: [tex]X^{(r)}=(x_1^{(r)},...,x_n^{(r)}), r=1,..,m.[/tex]
Dal su ovi brojevi u eksponentu potencija ili indeks pojedinog vektora/elementa?

mozda je glupo pitanje, ali nisam siguran jer svaka koordinata ima index dolje zapisan

#104:  Autor/ica: vsegoLokacija: /sbin/init PostPostano: 16:32 sri, 16. 1. 2013
    —
Gornji index znaci "koji" (od [tex]m[/tex]) vektora; donji oznacava koja je to komponenta tog vektora. Ponekad se tako oznacava da se izbjegne konfuzija izmedju razlicitih indexa (jednog za vektor i drugi za element), recimo, da ne izgleda kao da je u igri matrica (sto bi se desilo da su oba indexa dolje).

#105:  Autor/ica: aj_ca_volin_te PostPostano: 18:15 sri, 16. 1. 2013
    —
moze mi itko ukazati na pogresku, problem je u tome sto mi u rijecnik ne unose ove rijeci iz maina, a kada ih unosim preko funkcije ''dodatno ucitavanje'' unose se bez problema Ehm?

Kod:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define B 1000
#define EMPTY "0"
#define DELETED "-1"

typedef char elementtype[21];
typedef elementtype DICTIONARY[B];

void MAKE_NULL (DICTIONARY *Ap){
    int i;
    for(i=0; i<B; i++) strcpy((*Ap)[i],EMPTY);
}

int h(elementtype x){
    int i, sum=0;
    for(i=0;i<20;i++) sum += x'[i]';
    return sum%B;
}

int locate(elementtype x, DICTIONARY A){
    int initail, i;
    initail=h(x);
    i=0;
    while((i<B) && strcmp(A[(initail+i)%B],x)!=0 && strcmp(A[(initail+i)%B],EMPTY)!=0) ++i;

    return ((initail+i)%B);
}

int locate1(elementtype x, DICTIONARY A){
    int initail, i;
    initail=h(x);
    i=0;
    while( (i<B) && strcmp(A[(initail+i)%B],x)!=0 && strcmp(A[(initail+i)%B],EMPTY)!=0 && strcmp(A[(initail+i)%B],DELETED)!=0) ++i;

    return ((initail+i)%B);
}

int MEMBER(elementtype x, DICTIONARY A)
{
    if(strcmp(A[locate(x,A)],x)==0) return 1;

    else return 0;
}

void INSERT(elementtype x, DICTIONARY *Ap)
{
    int bucket;
    if(MEMBER(x,*Ap)) return;
    bucket = locate1(x,*Ap);
    if(strcmp((*Ap)[bucket],EMPTY)==0 || strcmp((*Ap)[bucket],DELETED)==0){
       strcpy((*Ap)[bucket],x);
    }
    else{
        printf("error-table is full");
        exit(1);
    }

}

void DELETE(elementtype x, DICTIONARY *Ap)
{
    int bucket;
    bucket=locate(x,*Ap);
    if(strcmp((*Ap)[bucket],x)==0) strcpy((*Ap)[bucket], DELETED);
}

void dodatno_ucitavanje(DICTIONARY *A){

    while(1){

    elementtype operacija, string;

    scanf("%s", operacija);
    scanf("%s", string);

    if(strcmp(operacija,"UNESI")==0){
        INSERT(string,A);
    }
    else if(strcmp(operacija,"OBRISI")==0){
        DELETE(string,A);
    }
    else if(strcmp(operacija,"JELICLAN")==0){
        if(MEMBER(string,*A)){
            printf("%s: DA!\n", string);
        }
        else{
            printf("%s: NE!\n", string);
        }
    }
    else break;
}
}


int main(void)
{

    DICTIONARY A;

    MAKE_NULL(&A);

    INSERT("auto",&A); INSERT("break",&A); INSERT("case",&A) ;INSERT("char",&A); INSERT("const",&A) ;INSERT ("continue",&A);
    INSERT("do",&A); INSERT("double",&A) ;INSERT("default",&A); INSERT("else",&A); INSERT("enum",&A); INSERT("extern",&A); INSERT("float", &A);
    INSERT("for",&A); INSERT("goto",&A); INSERT("if",&A); INSERT("int",&A); INSERT("long",&A); INSERT("register",&A);INSERT("return",&A);INSERT("short",&A);INSERT ("signed", &A);INSERT ("sizeof", &A);INSERT ("static", &A);
    INSERT("struct",&A);INSERT("switch",&A);INSERT("typedef",&A);INSERT("union",&A);INSERT("void",&A);INSERT("volatile",&A);
    INSERT("while",&A);

    dodatno_ucitavanje(&A);

    return 0;
}


NETREBA HVALA, RIJESENO! ispraviti cu gore u implementaciji pa ako ikome bude trebala neka ima Very Happy


Zadnja promjena: aj_ca_volin_te; 22:36 sri, 16. 1. 2013; ukupno mijenjano 1 put.

#106: BST pomoću polja Autor/ica: malenaa PostPostano: 18:44 sri, 16. 1. 2013
    —
Zapela sam na implementaciji binarnog stabla traženja pomoću polja (u zadatku je riječnik tako implementiran), točnije na funkciji DELETE. Naime, nikako ne mogu zaključiti kako pomicati čvorove kada se neki čvor nadomješta svojim djetetom. U tu svrhu sam napisala funkciju PREPISI, međutim mislim nije točna jer neki onda nestanu, a koji ne bi trebali. Može li mi netko pomoći?

Kod:

void PREPISI (int i, int j, DICTIONARY *Dp) {
     strcpy(Dp->elements[i], Dp->elements[j]);
    if (2*j+1 < MAXSIZE) PREPISI (2*i+1, 2*j+1, Dp);
     else if (2*j+2 < MAXSIZE) PREPISI (2*i+2, 2*j+2, Dp);
 
}

void DELETE (elementtype x, DICTIONARY *Dp)
{
     int i=0, j;
     //trazimo x
     while ( i < MAXSIZE )
     {
           if ( strcmp(Dp->elements[i], x) == 0 ) break;
           else if ( strcmp(Dp->elements[i], x) > 0) i=2*i+1;
            else i=2*i+2;
     }

     if ( i < MAXSIZE )
     {
            //x je u listu
           if ( ((strcmp(Dp->elements[2*i+1], "PRAZNO") == 0) || (2*i+1 >= MAXSIZE)) && ((strcmp(Dp->elements[2*i+2], "PRAZNO") == 0) || (2*i+2 >= MAXSIZE)) )
                {
                           strcpy(Dp->elements[i], "PRAZNO");

                }

            //x ima samo desno dijete
           else if ((strcmp(Dp->elements[2*i+1], "PRAZNO") == 0) || (2*i+1 >= MAXSIZE))
                                PREPISI(i, 2*i+2, Dp);
   
            //x ima samo lijevo dijete
            else if ((strcmp(Dp->elements[2*i+2], "PRAZNO") == 0) || (2*i+2 >= MAXSIZE))
                       PREPISI(i, 2*i+1, Dp);
                 
            //x ima oba djeteta
            else
                   {
                        elementtype y = OBRISI_NAJMANJI(2*i+2, Dp); //brisemo najmanji cvor iz desnog podstabla
                         strcpy(Dp->elements[i], y);
                    }
         }
        if ( i > MAXSIZE ) printf("\nNema %s u rijecniku.\n", x);

     }

elementtype OBRISI_NAJMANJI (int i, DICTIONARY *Dp)
{
    elementtype mini;
    elementtype brisi;

    if ((strcmp(Dp->elements[2*i+1], "PRAZNO") == 0) || (2*i+1 >= MAXSIZE)) //i je najmanji
    {
        strcpy (mini,Dp->elements[i]);
        if((strcmp(Dp->elements[2*i+2], "PRAZNO") != 0) && (2*i+2 < MAXSIZE)) //i ima desno dijete
            PREPISI(i, 2*i+2, Dp);

        else if(((strcmp(Dp->elements[2*i+1], "PRAZNO") == 0) || (2*i+1 >= MAXSIZE)) && ((strcmp(Dp->elements[2*i+2], "PRAZNO") == 0) || (2*i+2 >= MAXSIZE))) //i je list
                      strcpy(Dp->elements[i], "PRAZNO");

    }
    //i ima lijevo dijete
    else if((strcmp(Dp->elements[2*i+1], "PRAZNO") != 0) || (2*i+1 < MAXSIZE))
          strcpy(mini, OBRISI_NAJMANJI(2*i+1, Dp));
    return mini;
}

#107:  Autor/ica: GinoLokacija: Pula PostPostano: 20:19 sri, 16. 1. 2013
    —
Puno bi pomoglo znati(=vidjeti kod) sto je DICTIONARY.

#108:  Autor/ica: malenaa PostPostano: 20:53 sri, 16. 1. 2013
    —
evo definicije:
Kod:

#define MAXSIZE 100 //najveci dopusteni broj rijeci
#define elementtype char*

typedef struct {
        elementtype elements[MAXSIZE];
} DICTIONARY;

Dakle, radi se o atp DICTIONARY koji je implementiran pomoću binarnog stabla trazenja, gdje je binarno stablo prikazano pomocu polja. Funkcija koja mi je "problematična" za napisati je funkcija DELETE (gore navedena u kodu). Ja sam za tu implementaciju iskoristila prikaz potpunog binarnog stabla pomoću polja tj lijevo dijete čvora i je 2*i+1, a desno 2*i+2. Dok sam one čvorove koji ne sadrže oznaku označila sa "PRAZNO"
U prilog sam stavila i cijeli kod ako je potreban.



Riječnik.c
 Description:

Download
 Filename:  Riječnik.c
 Filesize:  6.64 KB
 Downloaded:  300 Time(s)


#109:  Autor/ica: ZenonLokacija: [tex]\pm\infty[/tex] PostPostano: 4:10 čet, 17. 1. 2013
    —
Može li mi itko reći zašto moja funkcija unesi_stablo ne unosi stablo pravilno? Ideja je da unese korijen pa njegovu djecu s desna na lijevo pa to isto za prvo, drugo, ... , nto dijete itd. Kod je ogroman, no ono što je relevantno za moje pitanje i nije. Inače, to je implementacija stabla preko polja uz vezu čvor → (roditelj, dijete, idući potomak). Unaprijed hvala!
Kod:
#include<stdio.h>



#define max 100

typedef int node;

typedef struct{
   char label;
   node mama, brat, sin;
}TREE;

node MAKE_ROOT(char l, TREE* tree){
   node i;
   tree->label = l;
   tree->mama = -1;
   tree->brat = -1;
   tree->sin = -1;
   for(i = 1; i < max; i++){
      (tree + i)->label = '\0';
      (tree + i)->mama = -1;
      (tree + i)->brat = -1;
      (tree + i)->sin = -1;
   }

   return 0;
}



node INSERT_CHILD(char l, node i, TREE* tree){
   if(i >= max || tree->label == '\0') return -1;

   node j;

   for(j = 1; j < max; j++)
      if((tree + j)->label == '\0') break;

   if(j >= max) return -1;

   (tree + j)->label = l;
   (tree + j)->mama = i;
   (tree + j)->brat = (tree + i)->sin;
   (tree + j)->sin = -1;

   return j;
}



node INSERT_SIBLING(char l, node i, TREE* tree){
   if(i >= max || tree->label == '\0' || i == 0) return -1;

   node j, k;

   for(j = 1; j < max; j++)
      if((tree + j)->label == '\0') break;

   if(j >= max) return -1;

   for(k = 1; k < max; k++)
      if((tree + k)->label == '\0') break;

   if(k >= max) return -1;
   (tree + j)->label = l;
   (tree + j)->mama = (tree+i)->mama;
   (tree + j)->brat = (tree + i)->brat;
   (tree + i)->brat = j;
   (tree + j)->sin = -1;

   return j;
}



void DELETE(node i, TREE* tree){
   if(i >= max || tree->label == '\0' || i == 0 || (tree + i)->sin != -1) return;

   if((tree + i)->brat != -1){
      if((tree + (tree + i)->mama)->sin == i)(tree + (tree + i)->mama)->sin = (tree + i)->brat;

      else{
         node j;
         j == (tree + (tree + i)->mama)->sin;
         while((tree + j)->brat != i)
            j = (tree + j)->brat;

         (tree + j)->brat = (tree + i)->brat;

      }
   }

   (tree + i)->label = '\0';
   (tree + i)->mama = -1;
   (tree + i)->brat = -1;
   (tree + i)->sin = -1;
}



node ROOT(TREE* tree){
   return 0;
}



node FIRST_CHILD(node i, TREE* tree){
   if(i >= max || tree->label == '\0') return -1;

   return (tree + i)->sin;
}



node NEXT_SIBLING(node i, TREE* tree){
   if(i >= max || tree->label == '\0') return -1;

   return (tree + i)->brat;
}



node PARENT(node i, TREE* tree){
   if(i >= max || tree->label == '\0') return -1;

   return (tree + i)->mama;
}



char LABEL(node i, TREE* tree){
   if(i >= max || tree->label == '\0') return '\0';

   return (tree + i)->label;
}



void CHANGE_LABEL(char l, node i, TREE* tree){
   if(i >= max || tree->label == '\0') return;

   (tree + i)->label = l;
}



int broj_potomaka(node i, TREE* tree){
   if(i >= max || LABEL(ROOT(tree), tree) == '\0' || i == -1) return 0;

   int suma = 0;
   node j;

   j = FIRST_CHILD(i, tree);
   while(j != -1){
      suma = suma + 1 + broj_potomaka(j, tree);
      j = NEXT_SIBLING(j, tree);
   }

   return suma;
}



void unesi_stablo(TREE* tree, node i){
   int n, k;
   char c;
   node j;

   if(i != ROOT(tree)) printf("Promatramo cvor %c", LABEL(i, tree));
   else{
      printf("Unesite ime korijena: ");
      scanf("%c", &c);
      CHANGE_LABEL(c, ROOT(tree), tree);
   }
   printf("Unesite broj djece cvora: ");
   scanf("%d", &n);
   if(n == 0) return;

   for(k = 0; k < n; k++){
      printf("Unesite ime %d. djeteta: ", k+1);
      scanf(" %c", &c);
      INSERT_CHILD(c, i, tree);
   }

   for(k = 0; k < n; k++){
      if(k == 0) j = FIRST_CHILD(i, tree);
      else j = NEXT_SIBLING(j, tree);
      unesi_stablo(tree, j);
   }
}

int main(void){
   TREE T[max];
   node i;
   int n, m;

   MAKE_ROOT('\0', T);
   unesi_stablo(T, ROOT(T));
   printf("%c ", LABEL(ROOT(T), T));
   CHANGE_LABEL('\0', ROOT(T), T);

   while(FIRST_CHILD(ROOT(T), T) != -1){
      i = ROOT(T);

      while(FIRST_CHILD(i, T) != -1){
         if(LABEL(i, T) != '\0'){
            printf("%c ", LABEL(i,T));
            CHANGE_LABEL('\0', i, T);
            i = NEXT_SIBLING(i, T);
         }
      }

      if(LABEL(i, T) != '\0'){
         printf("%c ", LABEL(i,T));
         CHANGE_LABEL('\0', i, T);
      }

      DELETE(i, T);
   }

   return 0;
}

#110:  Autor/ica: vsegoLokacija: /sbin/init PostPostano: 4:25 čet, 17. 1. 2013
    —
Ne bi li u INSERT_CHILD() trebalo postaviti sina od mame (tj. i-tog cvora)?

#111:  Autor/ica: ZenonLokacija: [tex]\pm\infty[/tex] PostPostano: 7:57 čet, 17. 1. 2013
    —
Da, to i jesam bio napisao, samo malo krivo pa me je kasnije zbunilo. Sada taj dio radi. Puno hvala! No, nešto drugo ne štima. Dio koda if(i != ROOT(tree)) printf("Promatramo cvor %c", LABEL(i, tree)); mi ispiše samo Promatramo cvor i ne razumijem zašto. Nikada ne ispiše label čvora. :S

#112:  Autor/ica: Leolinus PostPostano: 9:26 čet, 17. 1. 2013
    —
Zenon (napisa):
Da, to i jesam bio napisao, samo malo krivo pa me je kasnije zbunilo. Sada taj dio radi. Puno hvala! No, nešto drugo ne štima. Dio koda if(i != ROOT(tree)) printf("Promatramo cvor %c", LABEL(i, tree)); mi ispiše samo Promatramo cvor i ne razumijem zašto. Nikada ne ispiše label čvora. :S


Možda zato što u label stavljaš int 1, koji se casta u char 00000001 što je u ASCII-ju SOH znak.

'\0' je doslovno NUL karakter, vrijednost dekadska mu je 0, to nije znamenka 0. '0' i '1' su znamenke.
Možda ti želiš da ti je to int vrijednost, onda jednostavno umjesto %c u ispisu stavi %d.

#113:  Autor/ica: ZenonLokacija: [tex]\pm\infty[/tex] PostPostano: 11:19 čet, 17. 1. 2013
    —
Ne razumijem. U strukturi, label je tipa char, a kada predajem funkciji CHANGE_LABEL dajem joj na prvom mjestu char c. Funkcija LABEL samo čita oznaku čvora i.

#114:  Autor/ica: Leolinus PostPostano: 11:26 čet, 17. 1. 2013
    —
Zenon (napisa):
Ne razumijem. U strukturi, label je tipa char, a kada predajem funkciji CHANGE_LABEL dajem joj na prvom mjestu char c. Funkcija LABEL samo čita oznaku čvora i.


Char je tip podataka, a u C-u sadrži 8 bitova. Ti, ako ideš spremiti 1 u char. To je integer po defaultu. Automatski se 1 cast-a u char tako da se uzme zadnjih 8 bitova zapisa 0000 0000 0000 0000 0000 0000 0000 0001.

Nakon toga ti spremaš 0000 0001 u svoju varijablu label, a 0000 0001 nije binarni zapis ZNAKA 1, nego znaka SOH (start of header) u ASCII-ju.
Ako želiš da ti bude ZNAK 1, onda ćeš upisati char c = '1', a ne = 1.

Isto tako '\0' je znak za NUL karakter koji ima binarni zapis 0000 0000. To će ti na ekranu ispisati ništa. Ako želiš ispisati nulu, onda trebaš zapisati znak '0'(char c = '0')

EDIT: Sorry, tek sad vidio da ono nije 1 nego 'l' (L).

#115:  Autor/ica: vsegoLokacija: /sbin/init PostPostano: 12:07 čet, 17. 1. 2013
    —
Zenone, previse copy/paste-a:

Kod:
void CHANGE_LABEL(char l, node i, TREE* tree){
   if(i >= max || tree->label == '\0') return;

   (tree + i)->label = l;
}


Po defaultu, tree→label je uvijek jednak '\0 (v. fju MAKE_ROOT() i njen poziv u main()). Nadalje, funkcije koje rade s tree + i provjeravaju
if(i >= max || tree→label == '\0'),
dakle ne "ima li tree[i] praznu labelu", nego "ima li korijen praznu labelu" (a to je uvijek istina).

#116:  Autor/ica: ZenonLokacija: [tex]\pm\infty[/tex] PostPostano: 12:15 čet, 17. 1. 2013
    —
Hvala Vam puno! You're a life saver! Thank you Thank you Thank you Sada funkcija napokon radi.

#117: definiranje tipova Autor/ica: flux PostPostano: 21:44 pet, 17. 1. 2014
    —
na satu nam je dan kod za funkciju MaCompute implementiranu pomoću sortiranog polja

Kod:

int MaCompute(Mapping *M, domain d, range r)
{
    int l=0, m, n=M->last;
    domain dm;
    while (l<=n)
    {
        m=(l+n)/2;
        dm= M->pairs[m].domainelement;
        if (dm==d) {*r=M->pairs[m].rangeelement;
                    return 1;}
        else if (dm<d) l=m+1;
        else n=m-1;
    }
    return 0;
}


e sad ja sam napisala i sve ostale funkcije iz implementacije ali me muči kako da definiram tip domain
u zadatku kaže "Pretpostavite da je domena skup imena duljine max. 20 slova, a kodomena skup telefonskih brojeva (cijeli brojevi). "

e sad ja sam to napisala ovako
Kod:

#define Max 100
#define burek 20

typedef long range;
typedef struct
{
    char ime[burek];
}domain;

typedef struct
{
    domain domainelement;
    range rangeelement;
}celltype;

typedef struct
{
    celltype pairs[Max];
    int last;
}Mapping;

ali onda mi javlja grešku kod macompute i maassigne kod if (dm==d) i sličnog jer (logično) ne želi tako uspoređivati stringove
dal moram u svakoj if naredbi pisati funkcije koje uspoređuju strignove?
makar bi koliko sam ja shvatila funkcije macompute maassign i te moraju bit iste za sve domain tipove

#118:  Autor/ica: beuler PostPostano: 20:33 sub, 18. 1. 2014
    —
moze pomoc, kako dodati novi element u potpuno binarno stablo (definirano pointerima) ?



(zadatak je sortirat listu pomocu hrpe definirane pointerima)


edit:
smislio sam nesto, izbrojat lijevo stablo i desno pa gledat jesu li oblika i=i+2*K


nakon mukotrpnih modificiranja koda, uspio sam doci do verzije koja actually i radi
ako kome treba : http://pastebin.com/g117J3cx
u ovoj verziji sortira intove iz liste pomocu hrpe (oboje prikazano pomocu pointera)


Zadnja promjena: beuler; 17:44 ned, 19. 1. 2014; ukupno mijenjano 1 put.

#119:  Autor/ica: nuclear PostPostano: 15:58 ned, 19. 1. 2014
    —
Već je bio ovaj zadatak kao pitanje, ali nitko nije dao odgovor. U vezi zadatka:

Implementirajte atp Mapping pomoću sortiranog polja. Elementi domene su uređeni parovi oblika (a,b), a,b € {0,1,2...n}, a kodomena skup {0,1,2...n}. Svako ovakvo preslikavanje f je binarna operacija f(a,b)=a*b za neku operaciju *.....

dalje nije bitno. Muči me (kao i moje prethodnike) domena. Napisala sam sljedeće, ali ne znam kako onda konstruirati Mapping:

Kod:
#define max 100
typedef int range;

typedef struct{
    int a;
    int b;
    } domain;

typedef struct {
    range elements[max];
    int last;
    } Mapping;


je li uopće dobro postavljati u Mapping umjesto elementtype range? i kako to sad sa domenom uskladiti?

#120:  Autor/ica: nuclear PostPostano: 18:12 ned, 19. 1. 2014
    —
Evo ovo mi funkcionira, bi li se ovo priznalo kako su tražili?

Kod:
#define max 100
typedef int range;

typedef struct{
    int a;
    int b;
    } domain;

typedef struct {
    domain d;
    range r;
    } element;

typedef struct{
    element polje[max];
    int last;
    } Mapping;

#121: nejasnoća u zadatku Autor/ica: white_butterfly PostPostano: 22:40 pon, 27. 1. 2014
    —
Pozdrav!
Moj zadatak kaže da trebam kao provjeru ispisati znakove čvorova uređenog stabla u postorder redoslijedu, međutim na kraju teksta kao izlazni podatak moram ispisati oznake čvorova u preorder redoslijedu. Kao primjer piše da moj program mora ispisati ovo: JFBAGZHEDQPCA (to je postorder zadanog stabla).
Dakle, meni nije jasno da li moj program mora ispisati postorder ili preorder oznake čvorova, i zašto je u danom primjeru dva puta ispisan A? A je korijen stabla u primjeru, ali zar ne bi bio postorder ovakav: JFBGZHEDQPCA, tj. bez ovog prvog A??

#122:  Autor/ica: frutabella PostPostano: 18:15 uto, 28. 1. 2014
    —
Moram sazeti m uzlazno sortiranih listi pomocu hrpe. Hrpa je prikazana pomocu pointera, a lista je vezana lista prikazana pomocu pointera. Kako da ucitam m sortiranih listi? :S

#123:  Autor/ica: beuler PostPostano: 19:56 uto, 28. 1. 2014
    —
frutabella (napisa):
Moram sazeti m uzlazno sortiranih listi pomocu hrpe. Hrpa je prikazana pomocu pointera, a lista je vezana lista prikazana pomocu pointera. Kako da ucitam m sortiranih listi? :S



npr vezanu listu pointera na liste pa ubacujes u next pointer iducu na listu
ili jos bolje polje pointera na liste duljine m, pa samo for petljom ispunis liste

#124:  Autor/ica: frutabella PostPostano: 20:23 uto, 28. 1. 2014
    —
Embarassed mislim da imam problema s prog2, nesto ovako se meni cini ok, ali ne radi, ne znam u cemu je problem.
Lista sadrzi elemente tipa char. Prepostavka je da ima najvise 10 lisi, a svaka ima najvise 20 elemenata.
Kod:

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


typedef struct celltag{

      char c;
      struct celltag *next;

}celltype;


     typedef celltype *List;
     typedef celltype *position;


     position LiMakeNull(List *Lp){

        *Lp=(celltype*)malloc(sizeof(celltype));
        (*Lp)->next=NULL;
        return (*Lp);
   }


     void LiInsert (char x, position p, List *Lp)
   {
       position temp;
       temp=p->next;
       p->next=(celltype*)malloc(sizeof(celltype));
       p->next=x;
       p->next->next=temp;
   }

     position LiNext(position p, List Lp)
     {
       if (p->next == NULL)
       {
       printf("NEXT: Kriva pozicija.");
       exit(1);
       }

       return p->next;
    }




        int main (void){

             int m, i, j;
             char c;

             List L[10];
             position p[10];

             printf("Koliko listi zelimo sazeti?\n");
             scanf("%d", m);

             for(i=1; i<=m; ++i)
             p[i]=LiMakeNull(&L[i]);

           

            for(i=1; i<=m; ++i)
            {
             printf("U listu %d  ubaci sljedece charove:\n", i);
             for(j=0; j<20; ++j)
             {
                 scanf("%c", c);
                 if (isalpha('c')==0)
                 {   i++;
                     break;
                 }
                 else

                 LiInsert(c, p[i], &L[i]);
                 p[i]=LiNext(p[i], L[i]);
             }
            }

             return 0;
    }



Ovdje kao zelim stvoriti liste L[1], L[2], ... , L[m], a svaka od njih ima svoje pozicije p[1], ... p[m].
I for petljom popunjavam. Embarassed
Ali nesto ne stima...

#125:  Autor/ica: beuler PostPostano: 5:40 čet, 30. 1. 2014
    —
frutabella (napisa):
Embarassed mislim da imam problema s prog2, nesto ovako se meni cini ok, ali ne radi, ne znam u cemu je problem.
Lista sadrzi elemente tipa char. Prepostavka je da ima najvise 10 lisi, a svaka ima najvise 20 elemenata.

Ovdje kao zelim stvoriti liste L[1], L[2], ... , L[m], a svaka od njih ima svoje pozicije p[1], ... p[m].
I for petljom popunjavam. Embarassed
Ali nesto ne stima...


i ja sam se pomucio Very Happy ali ovo radi

http://pastebin.com/VWmB2MdR

#126:  Autor/ica: Countess PostPostano: 9:45 čet, 30. 1. 2014
    —
Kod:

             scanf("%d", m);
.
.
.
             
             scanf("%c", c);


Zaboravila si "&" u oba učitavanja u glavnom programu. Ako ima još grešaka, ja ih ne vidim jer nisam kompetentna Embarassed

#127:  Autor/ica: frutabella PostPostano: 14:43 čet, 30. 1. 2014
    —
Hvala vam! Rijesila sam malo drukcije, prvo ucitala string, pa onda iz stringa znak po znak dodavala u listu.

#128:  Autor/ica: gljividus PostPostano: 22:41 uto, 27. 1. 2015
    —
molila bih nekoga za pomoć...imam dictionary pomoću BST, gdje je binarno stablo prikazano pomoću pointera..kao implementaciju koristila sam funkcije iz udžbenika: delete, delete-min,insert, member, makenull. program se sruši kad pozovem neke od tih glavnih funkcija.. zna li netko mora li se još neka implementacija ubaciti u program? tipa za binarno stablo pomoću pointera? stvarno sam više izgubljena Sad

#129:  Autor/ica: 01 PostPostano: 13:48 ned, 1. 2. 2015
    —
Program se rusi pa ako netko vidi zasto bila bih zahvalna na pomoci Smile .

Osmislite algoritam i napišite odgovarajući program za sortiranje m vektora oblika:X(r)=(x1(r),...,xn(r)), r=1,..,m. Kažemo da je vektor X(j) < X(k) ako postoji i, 1 ≤ i ≤n takav da vrijedi: xr(j) = xr(k) za sve 1 ≤ r < i i xi(j) <xi(k)(to jest, sortira se leksikografski). Nemojte uvoditi ograničenja na veličinu brojeva m i n.

#include <stdio.h>
#include <malloc.h>

struct cv
{
int *vektor;
struct cv *lijevi;
struct cv *desni;
};
int m, n;
int *noviVektor;
struct cv *korijen;

int usporedi(int *prvi, int *drugi, int index)
{
if (index == n)
return -1;
if (prvi[index] < drugi[index])
return -1;
if (prvi[index] > drugi[index])
return 1;
index++;
return usporedi(prvi, drugi, index);
}

void dodaj(struct cv *cvor, int *element)
{
int i;
if (cvor == NULL)
{
cvor = (struct cv *)malloc(sizeof(struct cv));
cvor→vektor = (int *)malloc(n);
for (i = 0; i < n; i++)
(cvor→vektor)[i] = element[i];
cvor→lijevi = NULL;
cvor→desni = NULL;
}
else if (usporedi(element, cvor→vektor, 0) == -1)
dodaj(cvor→lijevi, element);
else
dodaj(cvor→desni, element);
}

void ispisi(struct cv *cvor)
{
int i;
if (cvor→lijevi != NULL)
{
ispisi(cvor→lijevi);
free(cvor→lijevi);
}
for (i = 0; i < n; i++)
{
printf("%d", (cvor→vektor)[i]);
if (i != (n - 1))
printf(" ");
}
printf("\n");
free(cvor→vektor);
if (cvor→desni != NULL)
{
ispisi(cvor→desni);
free(cvor→desni);
}
}

int main(void)
{
int i, j;
korijen = NULL;
scanf("%d", &m);
scanf("%d", &n);
for (i = 0; i < m; i++)
{
noviVektor = (int *)malloc(n);
for (j = 0; j < n; j++)
scanf("%d", &noviVektor[j]);
dodaj(korijen, noviVektor);
free(noviVektor);
}
ispisi(korijen);
return 0;
}

#130:  Autor/ica: beeing PostPostano: 21:12 pet, 29. 1. 2016
    —
Pozdrav. Imam problem u vezi zadaće. Zadatak glasi ovako:

Detaljno razradite implementaciju binarne relacije pomocu multiliste (vidi pododjeljak 4.4.5 u knjizi). Dakle napisite u C-u sve potrebne de nicije tipova i sve potrebne funkcije. Napisite program koji koristi vasu implementaciju za evidentiranje veze izmedu studenata i izbornih kolegija. Program treba omoguciti:
 unosenje ili izbacivanje studenata ili kolegija
 biljezenje cinjenice da je zadani student upisao zadani kolegij ili ponistio takav upis.
Takoder, program treba davati odgovore na sljedeca pitanja:
 Koje sve kolegije je upisao zadani student?
 Koji sve studenti su upisali zadani kolegij?

Dvije domene su mi pokazivaci na char.
Funkcija main izgleda ovako (barem do dijela gdje mi program pada):

Kod:

int main () {
    int br, len;
    char p[100];
    Relation R;
    ReMakeNull (&R);
    domain1 student;
    domain2 kolegij;
   
   
    printf("Za unos studenta birajte 1. \n");
    // ovdje idu ostali printfovi za ostale unose
   
    while (1) {
        printf ("Unesite broj: ");
        scanf ("%d", &br);
        switch (br) {
        case 1: {
            printf("Ime studenta: \n");
            alociraj1 (&student);
            unesi_studenta (student, &R);
            break;
        }
     /* (...) */


Funkcije koje se pozivaju u case 1 su definirane ovako:


Kod:

void alociraj1 (domain1 *student) {
    char str[100];
    scanf(" %[^\n]", str);
    (*student) = (domain1)malloc((strlen(str)+1)*sizeof(char));
    strcpy(*student, str);
}

void unesi_studenta (domain1 student, Relation *Rp) {
    domain2 kolegij;
    int flag=1; // pretpostavljamo da ako se unosi student da je on upisao barem jedan kolegij
    while (flag) {
        printf ("Unesi kolegij koji je %s upisao/la: \n", student);
        alociraj2 (&kolegij);
        ReRelate ( Rp, student, kolegij);
        printf ("Ima li jos kolegija koje je upisao/la? (1/0)");
        scanf ("%d", &flag);
    }
}

void alociraj2 (domain2 *kolegij) {
    char str[100];
    scanf(" %[^\n]", str);
    (*kolegij) = (domain2)malloc((strlen(str)+1)*sizeof(char));
    strcpy(*kolegij, str);
}

void ReRelate (Relation *R, domain1 d1, domain2 d2) {
    rcelltype *poc1, *poc2, *p, *t;
    int ima1 = MaCompute1(R->M1, d1, &poc1);
    int ima2 = MaCompute2(R->M2, d2, &poc2);
    if (ima1)
        for (p = poc1; p; p = p->next1)
            if ( !strcmp (p->d1, d1) && !strcmp(p->d2, d2))
                return;
    t = (rcelltype*)malloc(sizeof(rcelltype));

    strcpy (t->d1, d1);
    strcpy (t->d2, d2);

    t->next1 = ima1 ? poc1 : NULL;
    t->next2 = ima2 ? poc2 : NULL;
    printf("rerelate\n");
    MaAssign1(&R->M1, d1, t);
    MaAssign2(&R->M2, d2, t);
}

void MaAssign1 (Mapping1 *Mp, domain1 d, range r) {
    if ((*Mp) == NULL) {
        printf("maassign1\n");
        (*Mp) = (mcelltype1*)malloc(sizeof(mcelltype1));   // <- tu prestaje raditi
        printf("maassign1\n");
        strncpy ((*Mp)->d, d, strlen(d));
        (*Mp)->r = r;
        (*Mp)->left = (*Mp)->right = NULL;
        return;
    }
    // itd.
}


Program prestaje raditi kod alokacije memorije za *Mp u funkciji MaAssign1. Pojavi se onaj pravokutnik sa "Program (...).exe prestao je raditi; Windows traži rješenje problema na internetu...". Vidi li netko odmah u čemu je stvar? Stavit ću čitav kod u attachment ako netko ne vidi odmah, a voljan je podrobnije pogledati o čemu je riječ. Smile



Zadaća - string.c
 Description:

Download
 Filename:  Zadaća - string.c
 Filesize:  23.68 KB
 Downloaded:  149 Time(s)


#131:  Autor/ica: vsegoLokacija: /sbin/init PostPostano: 3:06 sub, 30. 1. 2016
    —
Ovdje je problem:

Kod:
    t = (rcelltype*)malloc(sizeof(rcelltype));

    strcpy (t->d1, d1);
    strcpy (t->d2, d2);


Varijable d1 i d2 su nealocirani pointeri koje strcpy treba dereferencirati i nesto zapisati tamo gdje oni pokazuju (sto je, ovisno o OSu, ili NULL ili neka bezvezna lokacija koja ne postoji ili barem ne pripada programu).

#132:  Autor/ica: beeing PostPostano: 8:02 sub, 30. 1. 2016
    —
Hvala na odgovoru. No, ne razumijem zašto strcpy treba zapisati nešto tamo gdje pokazuju d1 i d2, nije li da želi nešto zapisati tamo gdje pokazuju t->d1 i t->d2? Ako je ipak tako, onda alociram memorije za t->d1 i t->d2, ali ništa se ne mijenja po pitanju rada programa.

#133:  Autor/ica: vsegoLokacija: /sbin/init PostPostano: 12:34 sub, 30. 1. 2016
    —
Da, mislio sam na t→d1 i t→d2. Kad dodam alokaciju:
Kod:
    t->d1 = (domain1)malloc(strlen(d1)+1);
    t->d2 = (domain1)malloc(strlen(d2)+1);

ovaj dio programa prodje kako treba i ispise mi:
Kod:
rerelate
maassign1
maassign1

prije nego padne. To se desi ovdje:
Kod:
        (*Mp) = (mcelltype1*)malloc(sizeof(mcelltype1));
        printf("maassign1\n");
        strncpy ((*Mp)->d, d, strlen(d));

Ocito, problem je isti: (*Mp)→d je nealocirani pointer kojeg strncpy mora dereferencirati da pi pisao tamo gdje taj pointer pokazuje (sto je, kao i prije, ili NULL ili nesto besmisleno).

#134:  Autor/ica: beeing PostPostano: 16:55 sub, 30. 1. 2016
    —
Ups, hvala. Smile Nastavila bih gnjaviti ako smijem. U jednom trenutku program mi ulazi u
Kod:
void ReCompute2 (Relation R, domain1 d1, Set2 *S2p) {
    SeMakeNull2(S2p);
    rcelltype *p;
    if (R.M1) //R.M1 je pokazivac na strukturu
        printf("R.M1 nije null\n");
    int ima = MaCompute1(R.M1, d1, &p);
    if(!ima)
        return;
    (...)
}

a MaCompute1 je definirana sa
Kod:
int MaCompute1 (Mapping1 M, domain1 d, range *rp) {
    if(M == NULL){
        printf("M je null\n");
        return 0;
    }
    (...)
}

Program ispiše
Kod:
R.M1 nije null
M je null

i varijabla ima je nakon poziva MaCompute1 vrijednosti nula. Kako do toga dođe, da pokazivač R.M1 ipak ne pokazuje ni na što?

#135:  Autor/ica: vsegoLokacija: /sbin/init PostPostano: 17:42 sub, 30. 1. 2016
    —
To sto pointer negdje pokazuje, ne znaci da pokazuje gdje treba. Ako nije alociran i ako mu nisi direktno zadala da pokazuje na neku smislenu adresu, onda ce on ili biti NULL ili ce pokazivati negdje bezveze. Recimo, ovaj program:
Kod:
#include <stdio.h>

int main(void) {
    int *p;
    printf("%p\n", p);
    return 0;
}

na Linuxu ispise (nil), a na WinXP neku random adresu (konkretno, meni je ispisao 7FFDF000 i jednom izvrsavanju, a 7FFDE000 u drugom).

Stvar je ista kao s "obicnim" varijablama. Ako napravis:
Kod:
int x;
printf("%d\n", x);

racunaj da vrijednost x-a nije definirana jer nigdje nisi rekla x = nesto;, ili scanf("...", &x);, ili nesto slicno. Moze ti se desiti da je nula (npr. na Linuxu), a moze ispasti i neka skroz slucajna vrijednost koja se u trenutku stvaranja varijable zatekla na dijelu memorije koji je varijabli dodijeljen (npr. na Win).

Varijable tipa int u sebi drze cijele brojeve, a pointeri drze adrese, no i jedno i drugo su samo nekakvi podaci i nema razloga da se razlicito ponasaju kad ih kreiras bez inicijalizacije.

#136:  Autor/ica: beeing PostPostano: 0:35 ned, 31. 1. 2016
    —
No, komponente varijable R koju prima ReCompute2, R.M1 i R.M2, prije ovog dijela koda bile su proslijeđene redom funkcijama MaAssign1 i MaAssign2, gdje su memorije za njih bile uredno alocirane. Ali, kad provjeravam adrese pointera u ReCompute2, vidim zaista da jednom pokazuju na jednu stvar, a drugi put na drugu. Confused

#137:  Autor/ica: vsegoLokacija: /sbin/init PostPostano: 2:00 ned, 31. 1. 2016
    —
U MaAssign funkcijama to izgleda ovako:
Kod:
        (*Mp) = (mcelltype1*)malloc(sizeof(mcelltype1));
        strncpy ((*Mp)->d, d, strlen(d));

(*Mp)→d je, u osnovi, char*. Gdje se to alocira?

Preporucio bih setnju do demosa ili, ako oni ne postoje, do asistenta, pa debuggirajte zajedno. Ovakvo loptanje gdje svatko od nas napise nesto svakih nekoliko sati bi moglo potrajati.

#138:  Autor/ica: beeing PostPostano: 2:16 ned, 31. 1. 2016
    —
Isto u funkcijama MaAssign1 i MaAssign2 između tih dviju linija koje ste naveli sa
Kod:
        (*Mp)->d = (domain1)malloc(strlen(d)+1);
i
Kod:
        (*Mp)->d = (domain2)malloc(strlen(d)+1);

#139:  Autor/ica: vsegoLokacija: /sbin/init PostPostano: 11:13 ned, 31. 1. 2016
    —
Verzija koju ja imam (iz attachmenta od par postova gore) to nema, tako da mogu samo pricati napamet. Sad Kao sto rekoh, debugging je bolje raditi uzivo.

#140:  Autor/ica: beeing PostPostano: 11:31 ned, 31. 1. 2016
    —
Ovo je zadnja verzija. Pokušat ću se svakako još naći sa asistentom. Hvala na pomoći Smile


Zadaća - string.c
 Description:

Download
 Filename:  Zadaća - string.c
 Filesize:  23.85 KB
 Downloaded:  118 Time(s)


#141:  Autor/ica: vsegoLokacija: /sbin/init PostPostano: 11:46 ned, 31. 1. 2016
    —
Preporucam provjeriti sve strcpy i strncpy u programu, jer je ovdje ista greska kao i prije (linije 559-560 i 565-566):
Kod:
        t->left = (mcelltype2*) malloc(sizeof(mcelltype2));
        strcpy (t->left->d, d);
...
        t->right = (mcelltype2*) malloc(sizeof(mcelltype2));
        strcpy (t->right->d, d);

t→left→d i t→right→d nisu alocirani.

#142:  Autor/ica: beeing PostPostano: 11:51 ned, 31. 1. 2016
    —
Ah, zbilja sam nepažljiva. Budem sad.
---
Nadam se da sam sada sve alocirala, no i dalje mi, kada upišem studenta i kolegije koje je upisao, ne ispisuje ništa kada zadajem tog istog studenta i želim da mi ispiše upisane kolegije.



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