示例#1
0
文件: sbb.c 项目: gabrielviana/mydb
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 IRetiraSBB (TipoItem x, ApontadorNo *Ap, short *Fim){
    No *Aux;
    if (Ap == NULL){
        head();
        printf ("\n\n\tNumero de inscricao invalido!");
        *Fim = TRUE;
        getch();
        return;
    }
    if (x.Matricula > (*Ap)->Item.Matricula){
        IRetiraSBB (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 a 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 */
}