#include "../arena-lib/arena.h" #include typedef enum { BIN_OP_SUMA, BIN_OP_RESTA, BIN_OP_MULTIPLY, BIN_OP_DIVISION } BinaryOps; typedef enum { NODE_NUMBER, NODE_OPERATION } NodeKind; typedef struct Node{ union { BinaryOps operation; int number; }value; NodeKind type; struct Node* left; struct Node* right; } Node; Node* create_number(Arena* arena_ref, int n){ Node* node = (Node*)arena_alloc(arena_ref, sizeof(Node)); if(node == NULL){ return NULL; } node->type = NODE_NUMBER; node->value.number = n; node->left = NULL; node->right = NULL; return node; } Node* create_operation(Arena* ref_arena, BinaryOps op, Node* l, Node* r){ Node* node = (Node*)arena_alloc(ref_arena, sizeof(Node)); if(node == NULL){ return NULL; } node->type = NODE_OPERATION; node->value.operation = op; node->left = l; node->right = r; return node; } int node_compute(Node* node){ if(node->type == NODE_OPERATION){ int r1 = node_compute(node->left); int r2 = node_compute(node->right); int result = 0; switch (node->value.operation) { case BIN_OP_SUMA: result = r1 + r2; break; case BIN_OP_RESTA: result = r1 - r2; break; case BIN_OP_MULTIPLY: result = r1 * r2; break; case BIN_OP_DIVISION: result = (r2 != 0) ? r1 / r2 : 0; break; default: result = 0; break; } return result; } return node->value.number; } int main(void){ Arena arena = arena_create(32); printf("Memory struct information\n"); printf("=========================\n"); printf("sizeof(Node):%zu\n", sizeof(Node)); printf("align(Node): %zu\n", _Alignof(Node)); //Creamos el arbol para 3 + (4 - 1) Node* t1 = create_number(&arena, 3); Node* t21 = create_number(&arena, 4); Node* t22 = create_number(&arena, 1); Node* t2 = create_operation(&arena, BIN_OP_RESTA, t21, t22); Node* root = create_operation(&arena, BIN_OP_SUMA, t1, t2); printf("Node compute\n"); printf("============\n"); printf("result: %d\n", node_compute(root)); arena_free(&arena); return 0; }