103 lines
2.4 KiB
C
103 lines
2.4 KiB
C
#include "../arena-lib/arena.h"
|
|
#include <stdio.h>
|
|
|
|
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;
|
|
}
|