FabiiChan 0 Denunciar post Postado Junho 14, 2012 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
FabiiChan 0 Denunciar post Postado Junho 14, 2012 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