Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

FabiiChan

Struct + Árvore binária + lista duplamente ligada = gravar em txt

Recommended Posts

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:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentei fazer... mas

Na hora de mostra o txt salvo dá erro, preciso ordenar a idade em ordem crescente/decrescente e preciso implementar uma função de exclusão...

 

Segue o código:

 

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

 

struct aluno //estrutura aluno

{

struct aluno *esq, *dir;

int registro;

int ra;

char nome[50];

int idade;

char telefone[20];

} *raiz = NULL,*aux = NULL;

 

typedef struct aluno *posicao;

void inicializar();

void adicionar (posicao*, int, int, char[], int, char[]);

void localizar (posicao, int);

void finalizar(struct aluno *posicao);

void salvar ();

void imprimir();

 

void salvar() //salva em txt

{

FILE * arquivo_texto;

arquivo_texto = fopen ("d:\cadastro.txt", "w");

if (arquivo_texto == NULL)

{

printf("Erro ao abrir o arquivo.\n");

exit(1);

}

fprintf(arquivo_texto, "%d %d %s %d %s\n", raiz->registro, raiz->ra, raiz->nome, raiz->idade, raiz->telefone);

printf("%d %d %s %d %s\n",raiz->registro, raiz->ra, raiz->nome, raiz->idade, raiz->telefone);

fclose(arquivo_texto);

}

 

void imprimir() //mostra o que foi salva - num tá funcionando

{

FILE * fp;

fp = fopen ("d:\cadastro.txt", "r");

if (fp == NULL)

{

printf ("Erro ao abrir o arquivo.\n");

exit(1);

}

while(fread(&raiz,sizeof(raiz),1,fp))

{

printf("%d, %d, %s, %d, %s\n",raiz->registro, raiz->ra, raiz->nome, raiz->idade, raiz->telefone);

}

fclose(fp);

}

 

 

int main()

{

inicializar();

 

int opcao =1;

int ra1;

char nome1[50];

int i, reg;

char tel[20];

char temp[50];

 

while(opcao!=0)

{

printf("\nDigite a opcao desejada:\n\n");

printf("1- Inserir registro: \n");

printf("2- Localizar registro: \n");

printf("3- Salvar em texto: \n");

printf("4- Imprimir: \n");

printf("0- Sair \n");

printf("\nOpcao: ");

scanf("%d%*c", &opcao);

 

switch(opcao)

{

case 1:

{

printf("\nDigite o numero do registro: ");

gets(temp);

reg = atoi(temp);

printf("Digite o ra: ");

gets(temp);

ra1 = atoi(temp);

printf("Digite o nome: ");

gets(nome1);

printf("Digite a idade: ");

gets(temp);

i = atoi(temp);

printf("Digite o telefone: ");

gets(tel);

adicionar(&raiz, reg, ra1, nome1, i, tel);

break;

}

 

case 2:

{

printf("\nDigite o ra: ");

gets(temp);

ra1 = atoi(temp);

localizar(raiz,ra1);

 

if (aux)

{

printf("\n %d Registro encontrado!\n",ra1);

}

else

printf("\n %d Registro nao encontrado!",ra1);

break;

}

 

case 3:

{

salvar();

break;

}

case 4:

{

imprimir();

break;

}

}

}

}

 

void inicializar()

{

raiz = 0;

}

 

void adicionar (posicao *inicio, int reg, int r, char n[], int i, char t[]) // adiciona registros

{

if ((*inicio))

{

if (r < (*inicio) -> ra)

adicionar(&((*inicio) -> esq), reg, r, n, i, t);

else

adicionar(&((*inicio) -> dir), reg, r, n, i, t);

}

else

{

(*inicio) = (posicao) malloc (sizeof (struct aluno));

if (*inicio)

{

(*inicio) -> registro = reg;

(*inicio) -> ra = r;

strcpy((*inicio) -> nome, n);

(*inicio) -> idade = i;

strcpy((*inicio) -> telefone, t);

(*inicio) -> esq = NULL;

(*inicio) -> dir = NULL;

}

}

}

 

void localizar (posicao raiz, int r) // localiza registros pelo ra

{

if (raiz)

{

if (r == raiz-> ra)

{

printf("Registro: %d\n", raiz -> registro);

printf("RA: %d\n", raiz -> ra);

printf("Nome: %s\n", raiz -> nome);

printf("Idade: %d\n", raiz -> idade);

printf("Telefone: %s\n", raiz -> telefone);

aux = raiz;

return;

}

else

{

if (r < raiz -> ra)

localizar(raiz -> esq, r);

else

localizar(raiz -> dir, r);

}

}

}

 

void finalizar(struct aluno *posicao) //finaliza...

{

if(posicao!=0)

{

if(posicao->esq != 0)

finalizar(posicao->esq);

if(posicao->dir != 0)

finalizar(posicao->dir);

printf("Liberando %d...\n", posicao->ra);

free(posicao);

}

}

 

 

Help plx >.<'

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.