#include #include struct node { struct node* p; int c; struct node* s; }; struct node startmarker; struct node endmarker; struct node* chain; struct node* newref() { struct node* n; n=(struct node*) malloc(sizeof(struct node)); n->c=0; return(n); } struct node* nextref(int unit) { struct node* ref=chain; chain=chain->s; return(ref); } struct node* constructref(struct node* par, int cost, struct node* suc) { struct node* n=newref(); n->p=par; n->c=cost; n->s=suc; return(n); } void collapse(struct node* n) { (n->p)->s=n->s; (n->s)->p=n->p; (n->s)->c+=n->c+1; free(n); } void close_ref(struct node* n) { (n->p)->s=n->s; (n->s)->p=n->p; (n->s)->c+=n->c; free(n); } void inconly(struct node* n) { n->c++; } void expand(struct node* r,int max) { r->c++; struct node* last=r->s; struct node* r1=r; struct node* r2; int i=0; while(is=r2; r2->p=r1; r1=r2; i++; } r2->s=last; last->p=r2; chain=r->s; } struct node* init() { startmarker.c=0; endmarker.c=0; endmarker.s=0; startmarker.p=0; struct node* mainR=constructref(&startmarker,0,&endmarker); startmarker.s=mainR; endmarker.p=mainR; return(mainR); } void finalize(char *stepfilename) { struct node n=startmarker; FILE *stepfile; stepfile=fopen(stepfilename,"w"); fprintf(stepfile,"["); while(n.s) { n=*(n.s); fprintf(stepfile,"%i",n.c); if(n.s){fprintf(stepfile,",");}; } fprintf(stepfile,"]"); fclose(stepfile); } void print_oracle() { int i=0; struct node n=startmarker; printf("["); while(n.s && i<100) { n=*(n.s); printf("%i",n.c); if(n.s){printf(",");}; i++; } if (n.s) {printf("...");} else {printf("]");} n=endmarker; i=0; printf("["); while(n.p && i<100) { printf("%i",n.c); n=*(n.p); if(n.p){printf(",");}; i++; } if (n.p) {printf("...");} else {printf("]");} printf("\n"); } /* main() { struct node* ref = init(); expand(ref,1); struct node* r1 = nextref(1); inconly(ref); collapse(ref); close_ref(r1); finalize("test.steps"); } */