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); ... |
Kod: |
for (pom = f i r s t ; pom; pom = pom−>next ) |
Kod: |
struct celltype{
elementtype element; int koliko; int next; } MULTISET[N]; |
.anchy. (napisa): |
javlja mi " invalid conversion from `char' to `const char*' " u strcmp, i tako nešto slično kod poziva swapa. |
Kod: |
typedef struct {
elementtype element; int koliko; int next; }MULTISET[N]; |
Kod: |
MULTISET avail, A, B; |
Kod: |
for(i=0;i<N;i++) avail.next=i+1; |
.anchy. (napisa): | ||
i tada deklarirala liste kao:
je li to dobro? |
.anchy. (napisa): | ||
sada mi je sve avail,pa sam napravila for petlju:
ali mi javlja grešku za to.. |
Kod: |
for(i=0;i<N-1;i++)
SPACE[i]->next=i+1; avail=SPACE[0].next; SPACE[N-1]=-1; |
.anchy. (napisa): | ||
|
.anchy. (napisa): | ||
|
Kod: |
void MAKE_NULL(MAPPING *M){
int i; for(i=0;i<B;i++) (*M)[i]= NULL; } |
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; } |
homesweethome (napisa): |
![]() ![]() |
Kod: |
inorder(LEFT_CHILD(..),...);
printf("..",korijen); inorder(RIGHT_CHILD(..),...); |
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? ![]() ![]() |
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... |
Kod: |
#define B 20 |
Tomy007 (napisa): | ||
|
Kod: |
SPACE[MAXN] |
Kod: |
node avail |
Kod: |
typedef node TREE; |
Kod: |
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; .... } |
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; ... } |
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 } |
Cobs (napisa): | ||
najpojednostavljeniji oblik rekurzivne funkcije:
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. |
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; } |
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 |
Kod: |
scanf(" %c",&l); |
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 |
ante003 (napisa): |
...a i dalje je to hrpa |
Cobs (napisa): | ||||
u while petlji u svakoj scanf funkciji gdje učitavaš znak moraš stavit razmak ispred %c:
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 ) |
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; } |
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 |
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. |
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) |
luna5 (napisa): | ||
hvala ![]() sad radi, no mislim da mi ova fje stvara problem !? ![]()
|
Kod: |
exit(1); |
Kod: |
system("pause"); |
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... ![]() |
Kod: |
scanf("%[^\n]", &s1); //upisujem BUREK
scanf("%[^\n]", &s2); //upisujem SIR ASSIGN(&M,s1,s2); ASSIGN(&M,"BUREK","SIR"); |
kakt00s (napisa): | ||
Jel postoji razlika u ponašanju ova 2 ASSIGNA? (ako da... koja???)
|
kakt00s (napisa): | ||
Jel postoji razlika u ponašanju ova 2 ASSIGNA? (ako da... koja???)
|
.anchy. (napisa): | ||||
umm,da nije možda 'BUREK' a ne "BUREK"? ako ti se buni,pretp.da je zbog tog? |
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 |
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); } } |
Kod: |
void MAKE_NULL (SET *A) { *A = (celltype*) malloc(sizeof(celltype)); (*A)->next = NULL; } |
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: |
SET A; MAKE_NULL(&A); INSERT(3, A); INSERT(5, A); ... |
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:
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. |
kkarlo (napisa): |
Sta nije danas trebala bit objavljena zadaca?
Ili je to sutra a meni su se malo datumi pomijesali...? ![]() |
@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 ![]() |
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.... ![]() |
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; } } } |
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 ![]() ovo je kod:
|
Kod: |
void MAKE_NULL (DICTIONARY *A){
int i; for (i=0; i<B; i++){ (*A)[i] = (celltype*)malloc(sizeof(celltype)); (*A)[i] = NULL; } return; } |
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); |
Buki (napisa): | ||||
aha, kuzim otprilike, sad sam izmjenila make_null da mi izgleda ovako
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:
EDIT: puno ti hvala, sad mi radi normalno, ali samo ako mi je B<5, imas ideju kako da to ispravim? |
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; } } |
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. |
mini (napisa): | ||
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 ![]() |
Kod: |
typedef struct tag_celltype
{ struct tag_celltype *next; node childIndex; } celltype; |
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; } } |
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: |
#include<stdio.h>
#include<stdlib.h> #include<string.h> |
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; } } |
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 :
Jel može pomoć u pronalasku greške? ![]() |
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? |
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); } } |
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. |
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 |
Kod: |
typedef struct
{ elementtype elements[N]; int duljina; } SET; |
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); } |
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; } |
pedro (napisa): | ||
trebam upisati riječ i ubacit je u atp LIST
ovako sam ja napravila:
ne kužim zašto neće :S |
Kod: |
typedef struct { elementtype niz[MAXLENGTH]; int last; } DICTIONARY; void MAKE_NULL(DICTIONARY *R) { A->last = -1; } |
Kod: |
void INSERT(elementtype x, DICTIONARY *R) |
sasha.f (napisa): | ||
zašto javlja grešku: 'DICTIONARY' has no member named 'last'? |
Kod: |
typedef struct {
elementtype niz[MAXLENGTH]; int last; } DICTIONARY; |
Kod: |
typedef char elementtype; |
Kod: |
while(fscanf(f, "%[^\n]", rijec)>0) { INSERT(rijec, &A); fscanf(f, "\n"); } |
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; } |
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; } |
Kod: |
#define MAXSIZE 100 //najveci dopusteni broj rijeci #define elementtype char* typedef struct { elementtype elements[MAXSIZE]; } DICTIONARY; |
Riječnik.c | |||
Description: |
|
![]() Download |
|
Filename: | Riječnik.c | ||
Filesize: | 6.64 KB | ||
Downloaded: | 300 Time(s) |
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; } |
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 |
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. |
Kod: |
void CHANGE_LABEL(char l, node i, TREE* tree){
if(i >= max || tree->label == '\0') return; (tree + i)->label = l; } |
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; } |
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; |
Kod: |
#define max 100
typedef int range; typedef struct{ int a; int b; } domain; typedef struct { range elements[max]; int last; } Mapping; |
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; |
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 |
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; } |
frutabella (napisa): |
![]() 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. ![]() Ali nesto ne stima... |