agrego practicas

This commit is contained in:
2026-10-31 11:14:30 -03:00
parent 392cf493d1
commit f4f56db493
50 changed files with 1899 additions and 0 deletions
+102
View File
@@ -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;
}