c_cpp C中的抽象节点eval

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp C中的抽象节点eval相关的知识,希望对你有一定的参考价值。

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

/*Node Machine Computation*/
// Uses nodes for compute values

#define ABS_BASE NodeType type;

// denotes types of nodes.
// used for both operating nodes and value nodes
typedef enum
{
  NodeType_add,
  NodeType_sub,
  NodeType_int
} NodeType;

// base node type for polymorphism
struct AbsNode
{
  ABS_BASE
};
typedef struct AbsNode AbsNode;


// adder node
typedef struct
{
  ABS_BASE
  AbsNode* lhs;
  AbsNode* rhs;
} AbsNode_add;

// holds int values.
typedef struct
{
  ABS_BASE
  int value;
} AbsNode_int;

typedef struct
{
  ABS_BASE
  AbsNode* lhs;
  AbsNode* rhs;  
} AbsNode_sub;


AbsNode* create_add(AbsNode* left, AbsNode* right)
{
  AbsNode_add* newnode = malloc(sizeof(AbsNode_add));
  newnode->type = NodeType_add;
  newnode->lhs = left;
  newnode->rhs = right;
  return (AbsNode*)newnode;
}

AbsNode* create_sub(AbsNode* left, AbsNode* right)
{
  AbsNode_sub* newnode = malloc(sizeof(AbsNode_sub));
  newnode->type = NodeType_sub;
  newnode->lhs = left;
  newnode->rhs = right;
  return (AbsNode*)newnode;
}

AbsNode* create_int(int amount)
{
  AbsNode_int* newnode = malloc(sizeof(AbsNode_int));
  newnode->type = NodeType_int;
  newnode->value = amount;
  return (AbsNode*)newnode;
}

// sample node tree creation 
AbsNode* create_sample(void)
{
  return create_add(create_sub(create_int(3), create_int(9)), create_int(5));
}

int eval_node(AbsNode* node)
{
  switch(node->type)
  {
    case NodeType_int:
        return ((AbsNode_int*)node)->value;
    case NodeType_add:
        return eval_node(((AbsNode_add*)node)->lhs) + eval_node(((AbsNode_add*)node)->rhs);
        
    case NodeType_sub:
         return eval_node(((AbsNode_sub*)node)->lhs) - eval_node(((AbsNode_sub*)node)->rhs);   
  }
}


int main(void) {
  printf("Hello World, the val is %d\n", eval_node(create_sample()));
  return 0;
}

以上是关于c_cpp C中的抽象节点eval的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 使用节点和打印方法模拟c中的对象

c_cpp 237.删除链接列表中的节点

c_cpp 单链表中的替代奇数和偶数节点

c_cpp 删除O(1)中链表中的节点

c_cpp 237.删除链接列表中的节点 - 简单-2018.82

c_cpp 交换链接列表中的节点而不交换数据