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 交换链接列表中的节点而不交换数据