//BuscaNo: recebe o no raiz da arvore e um valor e verifica se encontra o valor na arvore NoRN* BuscaNo(NoRN* raiz, int valor){ if(raiz == NULL){ return raiz; } if(raiz->valor > valor){ return BuscaNo(raiz->filho_esq, valor); } if(raiz->valor < valor){ return BuscaNo(raiz->filho_dir, valor); } return raiz; }
// Função Remove: Verifica se o dado a ser removido está armazenado na árvore ARVORE *Remove(ARVORE *Raiz, int mat) { // Definição de variáveis FILE *Pf; ARVORE *Paux; // Busca o ponteiro que aponta para nó da arvore Paux = BuscaNo(Raiz, mat); if (!Paux) { printf("\n\tDado nao encontrado.\n"); return Raiz; } // Fim de if // Busca no arquivo Pf = fopen("AGENDA.DAT", "rb+"); if (Pf == NULL) { printf("\n\t\aERRO: Arquivos de dados nao encontrado.\n"); return NULL; } // Fim de if Raiz = RemoveNoArvore(Raiz, mat); // SalvaArvore(Raiz); fclose(Pf); return Raiz; } // Fim de Remove
// Função CriaNovaArvore: cria uma arvore balanceada ARVORE *CriaNovaArvore(ARVORE *Raiz1, ARVORE *Raiz2, int *V2) { // Definição de variáveis ARVORE *Px, *p, *q, *Paux; // Colocando o dado na arvore Px = ReservaNo(); if(!Px) return NULL; Paux = BuscaNo(Raiz1,*V2); Px->EnderecoRegistro = Paux->EnderecoRegistro; Px->Matricula = *V2; // Insere o Primeiro NO if(!Raiz2) { Raiz2 = Px; // SalvaArvore(Raiz2); return Raiz2; } // Fim de if //Insere um NO na Arvore Nao Vazia q = Raiz2; while(q != NULL) { p = q; if(*V2 < q->Matricula) q = p->LL; else q = p->RL; } // Fim de while // Insere como um novo nó e finaliza if (*V2 < p->Matricula) p->LL = Px; else p->RL = Px; return Raiz2; } // Fim de CriaNovaArvore
// Função BuscaNO: Busca um determinado nó na árvore ARVORE *BuscaNo(ARVORE *Raiz, int mat) { // Definição de variáveis ARVORE *Paux; // Verifica se a árvore está vazia if (!Raiz) return NULL; // Verifica se encontrou o nó com a informação dado if (mat == Raiz->Matricula) return Raiz; //Pesquisar Na Sub-Arvore Esquerda e Direita if (mat <= Raiz->Matricula) Paux = BuscaNo(Raiz->LL, mat); if (mat > Raiz->Matricula) Paux = BuscaNo(Raiz->RL, mat); return Paux; } // Fim de BuscaNO
// Função BuscaInfo: Verifica se um dado está no arquivo de dados void BuscaInfo(ARVORE *Raiz, int mat) { // Definição de variáveis locais FILE *Pf; DADOS Dados; ARVORE *Paux; // Busca o ponteiro que aponta para nó da arvore Paux = BuscaNo(Raiz, mat); if (!Paux) { printf("\n\tDado nao encontrado.\n"); return; } // Busca no arquivo Pf = fopen("AGENDA.DAT", "rb+"); if (Pf == NULL) { printf("\n\t\aERRO: Arquivos de dados nao encontrado.\n"); return; } fseek(Pf, Paux->EnderecoRegistro, 0); fread(&Dados, sizeof(DADOS), 1, Pf); fclose(Pf); printf("\n\tDado encontrado."); printf("\n\t Matricula: %d", Dados.Matricula); printf("\n\t Nome: %s", Dados.Nome); printf("\n\t Telefone: %s\n", Dados.Telefone); } // Fim de BuscaInfo
int RemoverDaArvoreRN(ArvoreRN *arvore, int elem) { int corOriginal; NoRN *mm, *filho, *pai, *aux; NoRN *no = BuscaNo(arvore->raiz, elem); aux = no; mm = no; corOriginal = no->cor; if(no->filho_esq == NULL) { filho = no->filho_dir; pai = no; printf("entrou if 1"); TransplanteArvoreRN(arvore, no, no->filho_dir); } else if(no->filho_dir == NULL){ printf("entrou if 2"); pai = no; filho = no->filho_esq; TransplanteArvoreRN(arvore, no, no->filho_esq); } else { printf("entrou else 1"); mm = MenorDosMaiores(no); corOriginal = mm->cor; filho = mm->filho_dir; if(mm->pai == no) { filho->pai = mm; } else { printf("entrou else 2"); TransplanteArvoreRN(arvore, mm, mm->filho_dir); mm->filho_dir = no->filho_dir; mm->filho_dir->pai = mm; } TransplanteArvoreRN(arvore, no, mm); mm->filho_esq = no->filho_esq; mm->filho_esq->pai = mm; mm->cor = no->cor; } printf("remove"); if(corOriginal == PRETO) { if(aux != NULL) RemontaArvoreRN(arvore, aux); else RemontaArvoreRN(arvore, pai); } return 0; }
// Função InsereNovoRegistro: Insere um novo registro ARVORE *InsereNovoRegistro(ARVORE *Raiz) { // Definição de variáveis DADOS *Info; ARVORE *Px, *p, *q, *Paux; int nReg; // Reservando memória dinamicamente do tipo DADOS Info = (DADOS *) calloc (1, sizeof(DADOS)); // Lendo a chave primaria - Matricula printf("\n\tDigite a Matricula: "); scanf("%d", &Info->Matricula); // Verificando se já existe Matricula Paux = BuscaNo(Raiz, Info->Matricula); if (Paux) { printf("\n\t\aERRO: A matricula %d ja esta armazenada.\n", Info->Matricula); getch(); return Raiz; } // Fim de if // Lendo os outros dados printf("\tDigite o Nome: "); scanf(" %[^\n]", Info->Nome); printf("\tDigite o Telefone: "); scanf(" %[^\n]", Info->Telefone); // Verificando a quantidade de registros nReg = LeReg(); // Salvando no arquivo AGENDA.DAT SalvaReg(Info); printf("\n\tRegistro salvo com sucesso.\n"); // Colocando o dado na arvore Px = ReservaNo(); if (!Px) return NULL; Px->EnderecoRegistro = nReg * sizeof(DADOS); Px->Matricula = Info->Matricula; // Insere o Primeiro NO if (!Raiz) { Raiz = Px; // SalvaArvore(Raiz); return Raiz; } // Fim de if // Insere um nó na árvore não-vazia q = Raiz; while (q != NULL) { p = q; if (Info->Matricula < q->Matricula) q = p->LL; else q = p->RL; } // Fim de while // Insere como um novo nó e finaliza if (Info->Matricula < p->Matricula) p->LL = Px; else p->RL = Px; // Salva árvore // SalvaArvore(Raiz); return Raiz; } // Fim de InsereNovoRegistro
//BuscaNaArvore: recebe a arvore e um valor e chama a funcao BuscaNo para procurar esse valor int BuscaNaArvore(ArvoreRN arvore, int valor){ if(BuscaNo(arvore.raiz, valor)){ return 1; } return 0; }