Arvore B
#include
#define T 3
struct NoArvB
{
int n; //Numero de elemento do nó int folha; //Se é folha = 1, senão = 0 int chave[2 * T - 1]; // Dados armazenados struct NoArvB *pai; // ponteiro para o Pai struct NoArvB *filhos[2 * T]; // Ponteiros para os Filhos
};
NoArvB * QuebraNo (int i, NoArvB *Pt)
{
NoArvB *PtAux1, *PtAux2, *Pai; int n;
//Apenas para o nó raiz if (Pt->pai == NULL) { //Aloca o nós que serão partidos PtAux1 = (NoArvB *) malloc (sizeof (NoArvB)); PtAux2 = (NoArvB *) malloc (sizeof (NoArvB)); //Copia os dados do nó cheio para dois nós vázios exeto o dado do meio for(int j = 0; j < i; j++) { PtAux1->chave[j] = Pt->chave[j]; } for(int j = i+1; j < 2 * T; j++) { PtAux1->chave[j] = Pt->chave[j]; }
//Atribui o valor de t - 1, para os nos, ou seja, a quantidade de dados PtAux1->n = T - 1; PtAux2->n = T - 1;
//Filhos apontam para o pai PtAux1->pai = Pt; PtAux2->pai = Pt;
//Pai aponta para o filhos Pt->filhos[0] = PtAux1; Pt->filhos[1] = PtAux2;
if (Pt->folha == 1) //Caso a raiz seja folha { Pt->folha = 0; PtAux1->folha = 1; PtAux2->folha = 1; } else // Senão for folha os filhos são copiados para os dois nós novos { for(int j = 0; j filhos[j] = Pt->filhos[j]; } for(int j = T; j filhos[j] = Pt->filhos[j]; } }
//O dados do meio, vira o primeiro elemento, da nova raiz. Pt->chave[0] = Pt->chave[T - 1]; Pt->n = 1;
return Pt;
} else //Senão for raiz { PtAux1 = (NoArvB *) malloc (sizeof (NoArvB));
Pai = Pt->pai; PtAux1->n = T - 1; // Copia os dados para a segundo nó for(int j = 0; j < T - 1; j++) PtAux1->chave[j] = Pt->chave[j + T];
if (Pt->folha == 0) // Se não é folha, ele copia os filhos também for(int j = 0; j filhos[j] = Pt->filhos[j + T]; else //Se for folha, ele apenas indica isso atribuindo 1 PtAux1->folha = 1;