this is my version:
Code:
#include <stdio.h>
#include <stdlib.h>
int and (int input1, int input2);
int or (int input1,int input2);
int not (int input1, int input2);
struct gate
{
void *leftPtr;
void *rightPtr;
int input1,input2,output;
int (*function)(int,int);
};
typedef struct gate Gate;
typedef Gate * GatePtr;
void preorder(GatePtr sPtr)
{
if (sPtr!=NULL)
{
printf("%p ] IN1 %d IN2 %d OUT %d\n",sPtr,sPtr->input1,sPtr->input2,sPtr->output);
preorder(sPtr->leftPtr);
preorder (sPtr->rightPtr);
}
}
int gateExit (GatePtr *rootPtr)
{
if (*rootPtr!=NULL)
{
printf("GateExit: NODE:%p LEFT:%p RIGHT:%p\n",*rootPtr, (*rootPtr)->leftPtr,(*rootPtr)->rightPtr);
if ( (*rootPtr)->output==-2) //devi calcolare l'output della gate
{
printf("Node with output to be evaluated: Root:%p Left:%p Right:%p\n",*rootPtr, (*rootPtr)->leftPtr,(*rootPtr)->rightPtr);
if ((*rootPtr)->leftPtr!=NULL)
{
printf("Invoke GateExit with root (Left) %p:\n",(*rootPtr)->leftPtr);
(*rootPtr)->input1=gateExit( (*rootPtr)->leftPtr );
}
if ((*rootPtr)->rightPtr!=NULL)
{
printf("Invoke GateExit with root (Right) %p:\n",(*rootPtr)->rightPtr);
(*rootPtr)->input2=gateExit((*rootPtr)->rightPtr);
}
else
(*rootPtr)->input2=-1;
(*rootPtr)->output=((*rootPtr)->function)((*rootPtr)->input1,(*rootPtr)->input2);
}
printf("EXIT OF GATE: %p = %d\n",*rootPtr,(*rootPtr)->output);
return (*rootPtr)->output;
}
return -2;
}
int and (int input1, int input2)
{
printf("AND IN1:%d IN2:%d\n",input1,input2);
if (input1&input2) return 1;
return 0;
}
int or (int input1,int input2)
{
printf("OR IN1:%d IN2:%d\n",input1,input2);
if (input1|input2) return 1;
return 0;
}
int not (int input1, int input2)
{
printf("NOT IN1:%d\n",input1);
if (input1==0)
return 1;
return 0;
}
int main ()
{
GatePtr rootPtr = NULL;
GatePtr gate[4],input[4];
int i;
for (i=0;i<4;i++)
{
gate[i]=(GatePtr) malloc (sizeof(Gate));
if (gate[i]==NULL)
{
printf("Out of memory\n");
return 1;
}
input[i]=(GatePtr) malloc (sizeof(Gate));
if (input[i]==NULL)
{
printf("Out of memory\n");
return 1;
}
}
rootPtr=gate[0];
gate[0]->function=or;
gate[0]->leftPtr=gate[1];
gate[0]->rightPtr=gate[3];
gate[0]->output=-2;
printf("p0 %p\n",gate[0]);
gate[1]->function=not;
gate[1]->leftPtr=gate[2];
gate[1]->rightPtr=NULL;
gate[1]->output=-2;
printf("p1 %p\n",gate[1]);
gate[2]->function=and;
gate[2]->leftPtr=input[0];
gate[2]->rightPtr=input[1];
gate[2]->output=-2;
printf("p2 %p\n",gate[2]);
gate[3]->function=and;
gate[3]->leftPtr=input[2];
gate[3]->rightPtr=input[3];
gate[3]->output=-2;
printf("p3 %p\n",gate[3]);
input[0]->function=NULL;
input[0]->output=1;
input[0]->leftPtr=NULL;
input[0]->rightPtr=NULL;
printf("i0 %p\n",input[0]);
input[1]->function=NULL;
input[1]->output=1;
input[1]->leftPtr=NULL;
input[1]->rightPtr=NULL;
printf("i1 %p\n",input[1]);
input[2]->function=NULL;
input[2]->output=1;
input[2]->leftPtr=NULL;
input[2]->rightPtr=NULL;
printf("i2 %p\n",input[2]);
input[3]->function=NULL;
input[3]->output=1;
input[3]->leftPtr=NULL;
input[3]->rightPtr=NULL;
printf("i3 %p\n",input[3]);
printf("PREORDER: \n");
preorder(rootPtr);
printf("\n");
int exit=gateExit(&rootPtr);
printf("***EXIT***:%d\n",exit);
for (i=0;i<4;i++)
{
free (input[i]);
free (gate[i]);
}
return 0;
}