Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal, estou super perdida para fazer um projeto de estrutura de dados...
Seguinte, devo fazer uma estrutura de cadastro de alunos contendo ra, nome, idade, telefone em arvore binaria, permitir busca por ra, exclusão, inserção, porém a idade deve ser gravada em lista duplamente ligada, pois deverá conter uma opção para ordenar os alunos cadastrados em ordem crescente e decrescente de idade.
Isso tudo deve ser gravado em disco.
Tenho um código de arvore binária completo feito em aula, mas não sei quais alterações devo fazer para o projeto.
#include <stdio.h>
struct no
{
struct no *esquerda;
int dado;
struct no *direita;
};
struct no *inicio;
struct no *anterior;
struct no *aux;
char ultimo_movimento = ' ';
void adicionar(struct no *posicao, struct no *novo);
struct no *novo_no(int dado);
void inicializar();
void finalizar(struct no *posicao);
struct no *localizar(struct no *posicao, int dado);
void excluir(int dado);
int main()
{
inicializar();
adicionar(inicio, novo_no(50));
adicionar(inicio, novo_no(30));
adicionar(inicio, novo_no(87));
adicionar(inicio, novo_no(25));
adicionar(inicio, novo_no(47));
adicionar(inicio, novo_no(51));
adicionar(inicio, novo_no(100));
adicionar(inicio, novo_no(13));
adicionar(inicio, novo_no(42));
adicionar(inicio, novo_no(50));
adicionar(inicio, novo_no(81));
adicionar(inicio, novo_no(99));
adicionar(inicio, novo_no(99));
excluir(87);
aux = localizar(inicio, 87);
if(aux == 0)
printf("Nao achei!\n");
else
printf("Encontrei %d - anterior = %d, ultimo movimento = %c\n", aux->dado, anterior->dado, ultimo_movimento);
aux = localizar(inicio, 13);
if(aux == 0)
printf("Nao achei!\n");
else
printf("Encontrei %d - anterior = %d, ultimo movimento = %c\n", aux->dado, anterior->dado, ultimo_movimento);
aux = localizar(inicio, 99);
if(aux == 0)
printf("Nao achei!\n");
else
printf("Encontrei %d - anterior = %d, ultimo movimento = %c\n", aux->dado, anterior->dado, ultimo_movimento);
finalizar(inicio);
getch();
return 0;
}
void inicializar()
{
inicio = 0;
}
void adicionar(struct no posicao, struct no novo)
{
if(inicio == 0)
{
printf("adicionando:%d\n", novo->dado);
inicio = novo;
}
else
{
if(novo->dado > posicao->dado)
{
if(posicao->direita == 0)
{
posicao->direita = novo;
printf("%d > %d, adicionando %d a direita\n", novo->dado, posicao->dado, novo->dado);
}
else
{
printf("%d > %d, vai para a direita\n", novo->dado, posicao->dado);
adicionar(posicao->direita, novo);
}
}
else
{
if(posicao->esquerda == 0)
{
posicao->esquerda = novo;
printf("%d <= %d, adicionando %d a esquerda\n", novo->dado, posicao->dado, novo->dado);
}
else
{
printf("%d <= %d, vai para a esquerda\n", novo->dado, posicao->dado);
adicionar(posicao->esquerda, novo);
}
}
}
}
struct no *novo_no(int dado)
{
struct no *novo;
novo = malloc(sizeof(struct no));
if(!novo)
{
printf("Nao consegui alocar memoria!\n");
getch();
exit(-1);
}
novo->esquerda = 0;
novo->dado = dado;
novo->direita = 0;
return novo;
}
void finalizar(struct no *posicao)
{
if(posicao!=0)
{
if(posicao->esquerda != 0)
finalizar(posicao->esquerda);
if(posicao->direita != 0)
finalizar(posicao->direita);
printf("liberando %d...\n", posicao->dado);
free(posicao);
}
}
struct no localizar(struct no posicao, int dado)
{
if(posicao == 0)
return 0;
if(posicao == inicio)
anterior = inicio;
if(posicao->dado == dado)
return posicao;
else
{
anterior = posicao;
if(dado > posicao->dado && posicao->direita != 0)
{
ultimo_movimento = 'D';
return localizar(posicao->direita, dado);
}
if(dado < posicao->dado && posicao->esquerda != 0)
{
ultimo_movimento = 'E';
return localizar(posicao->esquerda, dado);
}
return 0;
}
}
void excluir(int dado)
{
printf("excluindo %d\n", dado);
aux = localizar(inicio, dado);
if(aux == 0)
printf("Impossivel excluir, registro nao existe!\n");
else
{
if(aux == inicio)
{
inicio = 0;
if(aux->esquerda != 0)
adicionar(inicio, aux->esquerda);
if(aux->direita != 0)
adicionar(inicio, aux->direita);
free(aux);
}
else
{
if(ultimo_movimento == 'D')
anterior->direita = 0;
else
anterior->esquerda = 0;
if(aux->esquerda != 0)
adicionar(inicio, aux->esquerda);
if(aux->direita != 0)
adicionar(inicio, aux->direita);
free(aux);
}
}
}
Waiting for help... :rolleyes:
Carregando comentários...