agrego practicas
This commit is contained in:
+102
@@ -0,0 +1,102 @@
|
||||
#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;
|
||||
}
|
||||
Executable
BIN
Binary file not shown.
Reference in New Issue
Block a user