O exercício tinha por objetivo o cálculo de expressões algébricas na forma simples, utilizando a estrutura de dados de árvores encadeadas diretas. A estrutura utilizada foi a de uma árvore binária, afinal, é uma árvore encadeada direta.
Código - fonte exercício 1:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
struct node
{
float info1, info2;
char operacao;///citar a operação : multiplicação, soma, etc.
node *filho_esq, *filho_dir;
};
typedef node* raiz;
typedef node* arvore;
void Iniciar_Arvore(arvore a, char *exp, int *i);
raiz Formando_Arvore(char *exp);
float Calculo_Expr(raiz A);
void free_raiz(raiz A);
float CalcExpr(char *str);
raiz Formando_Arvore(char *exp)/// Recebe a expressão, contruíndo a árvore binária. Retorna um ponteiro para a sua raíz
{
int j = 1;
raiz A = (node*)malloc(sizeof(node));
Iniciar_Arvore(A, exp, &j);
return A;
}
void Iniciar_Arvore(arvore a, char *exp, int *i)
{
if(isdigit(exp[*i]))
{
a->info1 = exp[*i] - '0';
(*i)++;
a->filho_esq = NULL;
}
else
{
a->filho_esq = (node*)malloc(sizeof(node));
(*i)++;
Iniciar_Arvore(a->filho_esq, exp, i);
}
a->operacao = exp[*i];
(*i)++;
if(isdigit(exp[*i]))
{
a->info2 = exp[*i] - '0';
(*i)++;
a->filho_dir = NULL;
}
else
{
a->filho_dir = (node*)malloc(sizeof(node));
(*i)++;
Iniciar_Arvore(a->filho_dir, exp, i);
}
(*i)++;
}
/// libera a arvore em pós-ordem
void free_raiz(raiz A)
{
if(A != NULL)
{
free_raiz(A->filho_esq);
free_raiz(A->filho_dir);
free(A);
}
}
float Calculo(char *str)
{
raiz A = Formando_Arvore(str);
float expr = Calculo_Expr(A);
free_raiz(A);
return expr;
}
float Calculo_Expr(raiz A)///Valor calculado
{
float raiz1, raiz2;
if(A->filho_esq != NULL)
raiz1 = Calculo_Expr(A->filho_esq);
else
raiz1 = A->info1;
if(A->filho_dir != NULL)
raiz2 = Calculo_Expr(A->filho_dir);
else
{
raiz2 = A->info2;
if(A->operacao == '+')
return raiz1 + raiz2;
else if(A->operacao == '-')
return raiz1 - raiz2;
else if(A->operacao == '*')
return raiz1 * raiz2;
else if(A->operacao == '/')
return raiz1 / raiz2;
}
}
int main()
{
char expressao[200];
while(1)
{
printf("DIGITE A EXPRESSAO A SER CALCULADA (DIGITE 'OK' PARA ENCERRAR O PROGRAMA) :\n");
scanf("%s", expressao);
if(strcmp(expressao,"OK") == 0)
break;
printf("VALOR TOTAL: %f\n\n", Calculo(expressao));
}
return 0;
}
Código do Exercício 4 da P1:
O exercício tinha por objetivo, percorrer uma árvore binária e imprimir os nós que tem "avôs" múltiplos de 5.
Foi utilizada a estrutura de nós encadeados para árvores binárias, o que demandou o uso de recursão.
Código fonte exercício 4:
#include <stdio.h>
#include <stdlib.h>
typedef struct cell cell;
struct cell
{
int info;
cell *arvore_a, *filho_esq, *filho_dir;
};
typedef cell* arvore;
///Recebe um ponteiro para a raíz e printa os nós que tem avôs múltiplos de 5
void Avo_MultCinco(arvore raiz)
{
if(raiz != NULL)
{
Avo_MultCinco(raiz->filho_esq);
if((raiz->arvore_a != NULL) && (raiz->arvore_a->arvore_a != NULL) && (raiz->arvore_a->arvore_a->info)%5 == 0)
printf("%d ", raiz->info);
Avo_MultCinco(raiz->filho_dir);
}
}
int main ()
{
///lê uma árvore
return 0;
}
Nenhum comentário:
Postar um comentário