Sie sind auf Seite 1von 5

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

h> int n; struct node { int ed; int dest[2]; char desg[2]; }nd[50]; struct dfanode { int node_id,list[50],el,a,b; struct dfanode *next; }*dfastart,*dfaptr,*dfaend,*dfatmp; void error() { printf("\nWRONG INPUT!!!"); exit(0); } struct dfanode* findptr(int state) { struct dfanode *temp; temp=dfastart; while(temp!=NULL) { if(temp->node_id==state) return temp; temp=temp->next; } return NULL; } void putarr(int *ar,int lmt) { int i; printf("{"); for(i=0;i<=lmt;i++) printf("%d,",ar[i]); printf("\b}"); } void puteclos(int *ar,int lmt) { printf("\ne_closure of "); putarr(ar,lmt); printf(" : "); } void push(int *stack,int *tp,int el) { stack[++(*tp)]=el; //printf("\n%d pushed.",el); } int pop(int *stack,int *tp)

{ int y=stack[*tp]; (*tp)--; //printf("\n%d popped.top%d",y,top); return y; } void copy(int *src,int *dst,int lmt) { int i=0; //printf("copy"); while(i<=lmt) { dst[i]=src[i++]; //printf("%d ",src[i-1]); } } inline int find(int *ls,int key,int low,int high) { int i; for(i=low;i<=high;i++) { if(key==ls[i]) return 1; } return 0; } void sort(int *a,int lmt) { int i,j,temp; for(i=0;i<=lmt;i++) { for(j=i+1;j<=lmt;j++) { if(a[j]<a[i]) { temp=a[j]; a[j]=a[i]; a[i]=temp; } } } } int compare(int *a,int alen,int *b,int blen) { int i,c,max; if(alen!=blen) return 1; for(i=0;i<=alen;i++) { if(a[i]!=b[i]) return 1; } return 0; } int comp(int *ar,int lmt)

{ int i=0; struct dfanode *tmp; tmp=dfastart; while(tmp!=NULL) { i=compare(ar,lmt,tmp->list,tmp->el); if(i==0) return tmp->node_id; tmp=tmp->next; } return -1; } int eclos(int *a,int *l) { int s[50],popped,top=-1,sum=0; int i=0,now; for(i=0;i<=*l;i++) push(s,&top,a[i]); while(top!=-1) { popped=pop(s,&top); for(i=0;i<nd[popped].ed;i++) { if(nd[popped].desg[i]=='e') { now=nd[popped].dest[i]; if(find(a,now,0,*l)==0) { a[++(*l)]=now; push(s,&top,now); } } } } } int output(int *a,int alen,int *b,int *blen,char ch,int state) { int popped,k=-1,outputstack[50],optop=-1,i=0,j,now; *blen=-1; for(i=0;i<=alen;i++) { push(outputstack,&optop,a[i]); } while(optop!=-1) { popped=pop(outputstack,&optop); for(i=0;i<nd[popped].ed;i++) { if(nd[popped].desg[i]==ch) { now=nd[popped].dest[i]; if(find(outputstack,now,0,optop)==0) { b[++(*blen)]=now; push(outputstack,&optop,now); }

} } } return k; } void addnode(int dfacount,int *ar,int alen) { struct dfanode *temp; temp=(struct dfanode*)malloc(sizeof(struct dfanode)); temp->el=alen; temp->node_id=dfacount; copy(ar,temp->list,alen); temp->next=NULL; if(dfacount==0) { dfastart=temp; dfaptr=temp; } else { dfaptr->next=temp; dfaptr=temp; } printf("\nDFA node %c added : ",(char)dfacount+65); putarr(dfaptr->list,dfaptr->el); } void convert() { int i,a[100]={0},b[100]={0},c[100]={0},clen=0,blen=-1,alen=-1,var; int qstrt=-1,qend=-1,state=-1,dfacount=-1,dfaqueue[50]; char ch='a',fals; eclos(c,&clen); sort(c,clen); addnode(++dfacount,c,clen); dfaqueue[++qend]=dfacount; while(qstrt<qend) { state=dfaqueue[++qstrt]; dfatmp=findptr(state); copy(dfatmp->list,c,dfatmp->el); clen=dfatmp->el; output(c,clen,a,&alen,ch,state); eclos(a,&alen); sort(a,alen); var=comp(a,alen); if(var==-1) { dfatmp->a=dfacount+1; addnode(++dfacount,a,alen); dfaqueue[++qend]=dfacount; } else dfatmp->a=var; output(c,clen,b,&blen,ch+1,state); eclos(b,&blen); sort(b,blen); var=comp(b,blen);

if(var==-1) { dfatmp->b=dfacount+1; addnode(++dfacount,b,blen); dfaqueue[++qend]=dfacount; } else dfatmp->b=var; } } void displaytable() { struct dfanode *tmp=dfastart; printf("\n\n state\ta\tb\n"); printf("--------------------------------"); while(tmp!=NULL) { printf("\n %c\t%c\t%c",tmp->node_id+65,tmp->a+65,tmp->b +65); tmp=tmp->next; } } int main() { int i,j; printf("\nEnter the number of nodes : "); scanf("%d",&n); printf("\nEnter the transition table : "); printf("\nNo. of out-bound edges followed by edges without space."); for(i=0;i<n;i++) { printf("\n\nNode %d : ",i); scanf("%d",&(nd[i].ed)); for(j=0;j<nd[i].ed;j++) { scanf("%c%d",&(nd[i].desg[j]),&(nd[i].dest[j])); } printf("Node %d recorded.",i); } convert(); displaytable(); return 0; }

Das könnte Ihnen auch gefallen