
a evo i koda:
Code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <alloc.h>
#define novid(x) x = (struct drvo *)malloc(sizeof(struct drvo))
#define novil(x) x = (struct lista *)malloc(sizeof(struct lista))
struct drvo{
char *glava;
struct drvo *levi;
struct drvo *desni;
};
struct lista{
struct drvo *glava;
struct lista *rep;
};
struct drvo *koren,*difkoren;
char setac;
struct drvo *uradi(void);
struct drvo *dif(struct drvo *);
struct drvo *sklop(struct drvo *,char *,struct drvo *);
struct drvo *ponovi(struct drvo *);
void ispis(struct drvo *);
int op(char);
main(){
printf("\n Unesi regularni izraz bez zagrada\n");
setac=getchar();
koren=uradi();
ispis(koren);
printf("\n\n");
difkoren=dif(koren);
ispis(difkoren);
}
struct drvo *uradi()
{
struct drvo *clan,*d,*o,*l;
struct lista *kontrol,*poc;
int i,prioritet=0;
char ch[10];
novid(clan);
novil(kontrol);
kontrol->rep=NULL;
kontrol->glava=clan;
poc=kontrol;
if(setac=='('){
setac=getchar();
kontrol->glava=uradi();
setac=getchar();
}
else{
if(isdigit(setac)){
i=0;
while(isdigit(setac)){
ch[i]=setac;
setac=getchar();
i++;
}
ch[i]='\0';
}
else{
ch[0]=setac;
ch[1]='\0';
setac=getchar();
i=1;
}
clan->glava=(char *)malloc(i+1);
strcpy(clan->glava,ch);
clan->levi=NULL;
clan->desni=NULL;
}
while(setac!=')' && setac!='\n'){
if( op(setac) && (prioritet==1) ){
d=poc->glava;poc=poc->rep;
o=poc->glava;poc=poc->rep;
l=poc->glava;
poc->glava=o;
o->levi=l;
o->desni=d;
}
novil(kontrol);novid(clan);
kontrol->glava=clan;kontrol->rep=poc;
poc=kontrol;
if(setac=='*'||setac=='/')prioritet=1;
else
if(setac=='+'||setac=='-')prioritet=0;
if(setac=='('){
setac=getchar();
kontrol->glava=uradi();
setac=getchar();
}
else{
if(isdigit(setac)){
i=0;
while(isdigit(setac)){
ch[i]=setac;
setac=getchar();
i++;
}
ch[i]='\0';
}
else{
ch[0]=setac;
ch[1]='\0';
setac=getchar();
i=1;
}
}
clan->glava=(char *)malloc(i+1);
strcpy(clan->glava,ch);
clan->levi=NULL;
clan->desni=NULL;
}
while(poc->rep){
d=poc->glava;poc=poc->rep;
o=poc->glava;poc=poc->rep;
l=poc->glava;
poc->glava=o;
o->levi=l;
o->desni=d;
}
return(poc->glava);
}
int op(char a){
if((a=='+')||(a=='*')||(a=='/')||(a=='-'))return 1;
else return 0;
}
struct drvo *dif(struct drvo *b){
struct drvo *b1,*b2,*b3,*b4,*c;
if(isdigit(b->glava[0])){
novid(c);
c->glava=(char *)malloc(2);
strcpy(c->glava,"0");
c->levi=NULL;
c->desni=NULL;
}
if(isalpha(b->glava[0])){
novid(c);
c->glava=(char *)malloc(2);
strcpy(c->glava,"1");
c->levi=NULL;
c->desni=NULL;
}
if((!(strcmp(b->glava,"+")))||(!(strcmp(b->glava,"-"))))
if((!strcmp(b->levi,b->desni)))
{b1=sklop(dif(b->levi),b->glava,ponovi(b->desni));
b2=sklop(ponovi(b->levi),b->glava,dif(b->desni));
c=sklop(b1,b->glava,b2);}
else {
b1=dif(b->levi);
b2=dif(b->desni);
c=sklop(b1,b->glava,b2);
}
if(!(strcmp(b->glava,"*")))
{if(!(strcmp(b->levi,b->desni)))
b1=sklop(dif(b->levi),"*",ponovi(b->desni));
b2=sklop(ponovi(b->levi),"*",dif(b->desni));
c=sklop(b1,"+",b2);
}
if(!(strcmp(b->glava,"/")))
{ if(!(strcmp(b->levi,b->desni)))
b1=sklop(dif(b->levi),"*",ponovi(b->desni));
b2=sklop(ponovi(b->levi),"*",dif(b->desni));
b3=sklop(b1,"-",b2);
b4=sklop(ponovi(b->desni),"*",ponovi(b->desni));
c=sklop(b3,"/",b4);
}
return c;
};
struct drvo *sklop(struct drvo *b1,char *op,struct drvo *b2){
struct drvo *b;
novid(b);
b->glava=(char *)malloc(strlen(op));
strcpy(b->glava,op);
b->levi=b1;
b->desni=b2;
return b;
}
void ispis(struct drvo *b){
if(b->levi != NULL){
printf("(");
ispis(b->levi);
printf("%s",b->glava);
ispis(b->desni);
printf(")");
}
else printf("%s",b->glava);
}
struct drvo *ponovi(struct drvo *b){
struct drvo *b1,*b2,*c;
if(isdigit(b->glava[0])||(isalpha(b->glava[0])))
{
novid(c);
c->glava=(char *)malloc(strlen(b->glava));
strcpy(c->glava,b->glava);
c->levi=NULL;
c->desni=NULL;
}
if(op(b->glava[0]))
{
b2=ponovi(b->desni);
b1=ponovi(b->levi);
novid(c);
c->glava=(char *)malloc(2);
strcpy(c->glava,b->glava);
c->levi=b1;
c->desni=b2;
}
return c;
};
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <alloc.h>
#define novid(x) x = (struct drvo *)malloc(sizeof(struct drvo))
#define novil(x) x = (struct lista *)malloc(sizeof(struct lista))
struct drvo{
char *glava;
struct drvo *levi;
struct drvo *desni;
};
struct lista{
struct drvo *glava;
struct lista *rep;
};
struct drvo *koren,*difkoren;
char setac;
struct drvo *uradi(void);
struct drvo *dif(struct drvo *);
struct drvo *sklop(struct drvo *,char *,struct drvo *);
struct drvo *ponovi(struct drvo *);
void ispis(struct drvo *);
int op(char);
main(){
printf("\n Unesi regularni izraz bez zagrada\n");
setac=getchar();
koren=uradi();
ispis(koren);
printf("\n\n");
difkoren=dif(koren);
ispis(difkoren);
}
struct drvo *uradi()
{
struct drvo *clan,*d,*o,*l;
struct lista *kontrol,*poc;
int i,prioritet=0;
char ch[10];
novid(clan);
novil(kontrol);
kontrol->rep=NULL;
kontrol->glava=clan;
poc=kontrol;
if(setac=='('){
setac=getchar();
kontrol->glava=uradi();
setac=getchar();
}
else{
if(isdigit(setac)){
i=0;
while(isdigit(setac)){
ch[i]=setac;
setac=getchar();
i++;
}
ch[i]='\0';
}
else{
ch[0]=setac;
ch[1]='\0';
setac=getchar();
i=1;
}
clan->glava=(char *)malloc(i+1);
strcpy(clan->glava,ch);
clan->levi=NULL;
clan->desni=NULL;
}
while(setac!=')' && setac!='\n'){
if( op(setac) && (prioritet==1) ){
d=poc->glava;poc=poc->rep;
o=poc->glava;poc=poc->rep;
l=poc->glava;
poc->glava=o;
o->levi=l;
o->desni=d;
}
novil(kontrol);novid(clan);
kontrol->glava=clan;kontrol->rep=poc;
poc=kontrol;
if(setac=='*'||setac=='/')prioritet=1;
else
if(setac=='+'||setac=='-')prioritet=0;
if(setac=='('){
setac=getchar();
kontrol->glava=uradi();
setac=getchar();
}
else{
if(isdigit(setac)){
i=0;
while(isdigit(setac)){
ch[i]=setac;
setac=getchar();
i++;
}
ch[i]='\0';
}
else{
ch[0]=setac;
ch[1]='\0';
setac=getchar();
i=1;
}
}
clan->glava=(char *)malloc(i+1);
strcpy(clan->glava,ch);
clan->levi=NULL;
clan->desni=NULL;
}
while(poc->rep){
d=poc->glava;poc=poc->rep;
o=poc->glava;poc=poc->rep;
l=poc->glava;
poc->glava=o;
o->levi=l;
o->desni=d;
}
return(poc->glava);
}
int op(char a){
if((a=='+')||(a=='*')||(a=='/')||(a=='-'))return 1;
else return 0;
}
struct drvo *dif(struct drvo *b){
struct drvo *b1,*b2,*b3,*b4,*c;
if(isdigit(b->glava[0])){
novid(c);
c->glava=(char *)malloc(2);
strcpy(c->glava,"0");
c->levi=NULL;
c->desni=NULL;
}
if(isalpha(b->glava[0])){
novid(c);
c->glava=(char *)malloc(2);
strcpy(c->glava,"1");
c->levi=NULL;
c->desni=NULL;
}
if((!(strcmp(b->glava,"+")))||(!(strcmp(b->glava,"-"))))
if((!strcmp(b->levi,b->desni)))
{b1=sklop(dif(b->levi),b->glava,ponovi(b->desni));
b2=sklop(ponovi(b->levi),b->glava,dif(b->desni));
c=sklop(b1,b->glava,b2);}
else {
b1=dif(b->levi);
b2=dif(b->desni);
c=sklop(b1,b->glava,b2);
}
if(!(strcmp(b->glava,"*")))
{if(!(strcmp(b->levi,b->desni)))
b1=sklop(dif(b->levi),"*",ponovi(b->desni));
b2=sklop(ponovi(b->levi),"*",dif(b->desni));
c=sklop(b1,"+",b2);
}
if(!(strcmp(b->glava,"/")))
{ if(!(strcmp(b->levi,b->desni)))
b1=sklop(dif(b->levi),"*",ponovi(b->desni));
b2=sklop(ponovi(b->levi),"*",dif(b->desni));
b3=sklop(b1,"-",b2);
b4=sklop(ponovi(b->desni),"*",ponovi(b->desni));
c=sklop(b3,"/",b4);
}
return c;
};
struct drvo *sklop(struct drvo *b1,char *op,struct drvo *b2){
struct drvo *b;
novid(b);
b->glava=(char *)malloc(strlen(op));
strcpy(b->glava,op);
b->levi=b1;
b->desni=b2;
return b;
}
void ispis(struct drvo *b){
if(b->levi != NULL){
printf("(");
ispis(b->levi);
printf("%s",b->glava);
ispis(b->desni);
printf(")");
}
else printf("%s",b->glava);
}
struct drvo *ponovi(struct drvo *b){
struct drvo *b1,*b2,*c;
if(isdigit(b->glava[0])||(isalpha(b->glava[0])))
{
novid(c);
c->glava=(char *)malloc(strlen(b->glava));
strcpy(c->glava,b->glava);
c->levi=NULL;
c->desni=NULL;
}
if(op(b->glava[0]))
{
b2=ponovi(b->desni);
b1=ponovi(b->levi);
novid(c);
c->glava=(char *)malloc(2);
strcpy(c->glava,b->glava);
c->levi=b1;
c->desni=b2;
}
return c;
};
EDIT: X Files : Molim Vas da zbog preglednosti, kod upisujete između tag-ova predviđenih za to:
[code]
int main ( int argc, char *argv[] )
{
// ...
return 0;
}
[/code]
[Ovu poruku je menjao X Files dana 19.01.2009. u 21:44 GMT+1]