示例#1
0
/* 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;
}