/* INSERE UM NOVO REGISTRO VERIFICANDO AS PALAVRAS, CASO EXISTA A QUANTIDADE E INCREMENTADA, CASO CONTRARIA A FUNCAO INSERENAPAGINA() E CHAMADA E RETORNA A QUANTIDADE DE MEMORIA GASTA */ double Ins(TipoRegistro Reg, Apontador Ap, int *Cresceu, Registro RegRetorno, Apontador *ApRetorno, int idArquivo) { Apontador ApTemp; int i, j; double memoria = 0; if (Ap == NULL) { if ( VerificaDados(&Reg.dados, idArquivo) == 1) memoria += sizeof(TipoDados); *Cresceu = 1; *RegRetorno = Reg; *ApRetorno = NULL; return memoria; } i = 1; while (i < Ap->n && (strncmp(Reg.palavra, Ap->r[i - 1].palavra,N) > 0 )) i++; if ( strncmp(Reg.palavra, Ap->r[i - 1].palavra,N) == 0 ) { if ( VerificaDados(&Ap->r[i - 1].dados, idArquivo) == 1) memoria += sizeof(TipoDados); *Cresceu = 0; return memoria; } if (strncmp(Reg.palavra, Ap->r[i - 1].palavra,N) < 0) i--; Ins(Reg, Ap->p[i], Cresceu, RegRetorno, ApRetorno, idArquivo); if (!*Cresceu) return memoria; if (Ap->n < mm) { /* Pagina tem espaco */ InsereNaPagina(Ap, *RegRetorno, *ApRetorno, idArquivo); *Cresceu = 0; return memoria; } /* Overflow: Pagina tem que ser dividida */ ApTemp = (Apontador)malloc(sizeof(Pagina)); memoria += sizeof(Pagina); ApTemp->n = 0; ApTemp->p[0] = NULL; if (i <= m + 1) { InsereNaPagina(ApTemp, Ap->r[mm - 1], Ap->p[mm], idArquivo); Ap->n--; InsereNaPagina(Ap, *RegRetorno, *ApRetorno, idArquivo); } else InsereNaPagina(ApTemp, *RegRetorno, *ApRetorno, idArquivo); for (j = m + 2; j <= mm; j++) InsereNaPagina(ApTemp, Ap->r[j - 1], Ap->p[j], idArquivo); Ap->n = m; ApTemp->p[0] = Ap->p[m + 1]; *RegRetorno = Ap->r[m]; *ApRetorno = ApTemp; return memoria; }
void Ins(TipoRegistro Reg, TipoApontador Ap, short *Cresceu, TipoRegistro *RegRetorno, TipoApontador *ApRetorno) { long i = 1; long j; TipoApontador ApTemp; if (Ap == NULL){ *Cresceu = TRUE; (*RegRetorno) = Reg; (*ApRetorno) = NULL; return; } while (i < Ap->n && Reg.Chave > Ap->r[i-1].Chave) i++; if (Reg.Chave == Ap->r[i-1].Chave) { printf(" Erro: Registro ja esta presente\n"); *Cresceu = FALSE; return; } if (Reg.Chave < Ap->r[i-1].Chave) i--; Ins(Reg, Ap->p[i], Cresceu, RegRetorno, ApRetorno); if (!*Cresceu) return; if (Ap->n < MM) { /* Pagina tem espaco */ InsereNaPagina(Ap, *RegRetorno, *ApRetorno); *Cresceu = FALSE; return; } /* Overflow: Pagina tem que ser dividida */ ApTemp = (TipoApontador)malloc(sizeof(TipoPagina)); ApTemp->n = 0; ApTemp->p[0] = NULL; if (i < M + 1) { InsereNaPagina(ApTemp, Ap->r[MM-1], Ap->p[MM]); Ap->n--; InsereNaPagina(Ap, *RegRetorno, *ApRetorno); } else InsereNaPagina(ApTemp, *RegRetorno, *ApRetorno); for (j = M + 2; j <= MM; j++) InsereNaPagina(ApTemp, Ap->r[j-1], Ap->p[j]); Ap->n = M; ApTemp->p[0] = Ap->p[M+1]; *RegRetorno = Ap->r[M]; *ApRetorno = ApTemp; }