void IRetira(TipoReg x, TipoApont *Ap, short *Fim) { TipoNo *Aux; if (*Ap == NULL) { printf("Chave nao esta na arvore\n"); *Fim = TRUE; return; } //COMPARA플O AQUI if (x.Chave < (*Ap)->Reg.Chave) { IRetira(x, &(*Ap)->Esq, Fim); if (!*Fim) EsqCurto(Ap, Fim); return; }//COMPARA플O AQUI if (x.Chave > (*Ap)->Reg.Chave) { IRetira(x, &(*Ap)->Dir, Fim); if (!*Fim) DirCurto(Ap, Fim); return; } *Fim = FALSE; Aux = *Ap; if (Aux->Dir == NULL) { *Ap = Aux->Esq; free(Aux); if (*Ap != NULL) *Fim = TRUE; return; } if (Aux->Esq == NULL) { *Ap = Aux->Dir; free(Aux); if (*Ap != NULL) *Fim = TRUE; return; } Antecessor(Aux, &Aux->Esq, Fim); if (!*Fim) EsqCurto(Ap, Fim); /* Encontrou chave */ }
void IRetira(TipoItem x, ApontadorNo *Ap, short *Fim) { No *Aux; if (*Ap == NULL) { system("color 4f"); printf("\n\n\t Codigo invalido ou inexistente. \n"); system("pause"); system("color 0f"); *Fim = TRUE; return; } if (x.cod < (*Ap)->Reg.cod) { IRetira(x, &(*Ap)->Esq, Fim); if (!*Fim) EsqCurto(Ap, Fim); return; } if (x.cod > (*Ap)->Reg.cod) { IRetira(x, &(*Ap)->Dir, Fim); if (!*Fim) DirCurto(Ap, Fim); return; } *Fim = FALSE; Aux = *Ap; if (Aux->Dir == NULL) { *Ap = Aux->Esq; free(Aux); if (*Ap != NULL) *Fim = TRUE; return; } if (Aux->Esq == NULL) { *Ap = Aux->Dir; free(Aux); if (*Ap != NULL) *Fim = TRUE; return; } Antecessor(Aux, &Aux->Esq, Fim); if (!*Fim) EsqCurto(Ap, Fim); /* Encontrou chave */ }
void Retira(TipoItem x, ApontadorNo *Ap) { short Fim; IRetira(x, Ap, &Fim); }
void SbbRetira(TipoReg x, TipoApont *Ap) { short Fim; IRetira(x, Ap, &Fim); }