private void AgregaArbol(TPagina nodo, int i) { if (nodo != null) { if (nodo.Tipo != H) { CargaNodo(nodo, indexA); //MessageBox.Show(i.ToString()); //i += 1; for (int j = 0; j < 5; j++) { if (nodo.GetDireccion(j) > 0) { AgregaArbol(nodo.GetPtrs(j), ++indexA); } else { break; } } } else { CargaNodo(nodo, indexA); // i += 1; } } }
private void InsertaEnPag(TPagina nodo, int clave, TPagina nuevo, long dir) { int i; for (i = nodo.M - 1; i >= 0 && nodo.GetClave(i) > clave; i--) { nodo.SetClaves(nodo.GetClave(i), i + 1); if (nodo.Tipo == H) { nodo.SetDireccion(nodo.GetDireccion(i), i + 1); } if (nodo.Tipo != H) { nodo.SetDireccion(nodo.GetDireccion(i + 1), i + 2); nodo.SetPtrs(nodo.GetPtrs(i + 1), i + 2); } } // printf("\ni: %d\n", i); nodo.SetClaves(clave, i + 1); if (nodo.Tipo == H) { nodo.SetDireccion(dir, i + 1); } if (nodo.Tipo != H) { nodo.SetDireccion(dir, i + 2); nodo.SetPtrs(nuevo, i + 2); } nodo.M += 1; }
private TPagina InsertaFusion(TPagina nodo1, TPagina nodo2, int clave) { int i, j; TPagina aux; aux = CreaPagina(d, nodo1.Tipo); for (i = 0; i < nodo1.M; i++) { InsertaEnPag(aux, nodo1.GetClave(i), null, nodo1.GetDireccion(i)); if (nodo1.Tipo != H) { aux.SetPtrs(nodo1.GetPtrs(i), i); aux.SetDireccion(nodo1.GetDireccion(i), i); } } if (aux.Tipo != H) { aux.SetPtrs(nodo1.GetPtrs(i), aux.M); // aux.SetDireccion(nodo1.GetDireccion(i), aux.M); InsertaEnPag(aux, clave, null, nodo1.GetDireccion(i)); aux.SetDireccion(nodo1.GetDireccion(i), aux.M - 1); } i = aux.M; for (j = 0; j < nodo2.M; j++) { InsertaEnPag(aux, nodo2.GetClave(j), null, nodo2.GetDireccion(j)); if (nodo2.Tipo != H) { aux.SetPtrs(nodo2.GetPtrs(j), i + j); aux.SetDireccion(nodo2.GetDireccion(j), i + j); } } if (aux.Tipo != H) { aux.SetPtrs(nodo2.GetPtrs(j), aux.M); aux.SetDireccion(nodo2.GetDireccion(j), aux.M); } return(aux); }
private void PrestaClave(TPagina nodo1, TPagina nodo2, int cb) { if (nodo1.GetClave(nodo1.M - 1) > nodo2.GetClave(nodo2.M - 1)) { //izquierda presta if (nodo1.Tipo != H) { InsertaEnPag(nodo1, cb, nodo2.GetPtrs(nodo2.M), nodo2.GetDireccion(nodo2.M)); clave = nodo2.GetClave(nodo2.M - 1); EliminaClave(nodo2, nodo2.GetClave(nodo2.M - 1)); } else { InsertaEnPag(nodo1, nodo2.GetClave(nodo2.M - 1), null, nodo2.GetDireccion(nodo2.M - 1)); clave = nodo2.GetClave(nodo2.M - 1); EliminaClave(nodo2, nodo2.GetClave(nodo2.M - 1)); } } else { if (nodo1.Tipo != H) { InsertaEnPag(nodo1, cb, nodo2.GetPtrs(0), nodo2.GetDireccion(0)); EliminaClave(nodo2, nodo2.GetClave(0)); clave = nodo2.GetClave(0); } else { // InsertaEnPag(nodo1, cb, null, nodo2.GetDireccion(0)); InsertaEnPag(nodo1, nodo2.GetClave(0), null, nodo2.GetDireccion(0)); EliminaClave(nodo2, nodo2.GetClave(0)); clave = nodo2.GetClave(0); } } }
private void Divide(TPagina nodo) { TPagina aux; int j; //cambiar RH por I aux = CreaPagina(d, nodo.Tipo == R ? I : nodo.Tipo); for (j = nodo.M - 1; j > d; j--, nodo.M--) { if (nodo.Tipo != H) { InsertaEnPag(aux, nodo.GetClave(j), nodo.GetPtrs(j + 1), nodo.GetDireccion(j + 1)); } else { InsertaEnHoja(aux, nodo.GetClave(j), null, nodo.GetDireccion(j)); } } if (nodo.Tipo != H) { aux.SetPtrs(nodo.GetPtrs(j + 1), 0); aux.SetDireccion(nodo.GetDireccion(j + 1), 0); } clave = nodo.GetClave(j); if (nodo.Tipo == H) { aux.SetClaves(clave, 0); aux.SetDireccion(nodo.GetDireccion(j), 0); aux.M++; } //printf("\nj: %d\n", j); pag_n = aux; nodo.M--; }
public void Imprime(TPagina nodo) { int i; if (nodo != null) { for (i = 0; i < nodo.M; i++) { Console.Write(nodo.GetClave(i) + " "); } Console.WriteLine(); if (nodo.Tipo != H) { for (i = 0; i <= nodo.M; i++) { Imprime(nodo.GetPtrs(i)); } } } }
private void EliminaClave(TPagina nodo, int clave) { int i, index = Buscar(nodo, clave); for (i = Buscar(nodo, clave) - 1; i < nodo.M; i++) { nodo.SetClaves(nodo.GetClave(i + 1), i); nodo.SetDireccion(nodo.GetDireccion(i + 1), i); if (nodo.Tipo != H) { nodo.SetPtrs(nodo.GetPtrs(i + 2), i + 1); } } if (nodo.Tipo != H) { nodo.SetPtrs(pag_n, index - 1 >= 0 ? index - 1 : 0); nodo.SetDireccion(pag_n.DireccionNodo, index - 1 >= 0 ? index - 1 : 0); } nodo.M -= 1; }
private void InsertaEnHoja(TPagina nodo, int clave, TPagina nuevo, long dir) { int i; for (i = nodo.M - 1; i >= 0 && nodo.GetClave(i + 1) > clave; i--) { nodo.SetClaves(nodo.GetClave(i + 1), i + 2); nodo.SetDireccion(nodo.GetDireccion(i + 1), i + 2); if (nodo.Tipo != H) { nodo.SetPtrs(nodo.GetPtrs(i + 2), i + 3); } } nodo.SetClaves(clave, i + 2); nodo.SetDireccion(dir, i + 2); if (nodo.Tipo != H) { nodo.SetPtrs(nuevo, i + 3); } nodo.M += 1; }
private bool BajaE(TPagina nodo, string nombreArchivo) { bool b = false; WriteFile wf = new WriteFile(nombreArchivo); int pos; if (nodo.Tipo == H) { //buscar clave tomar direccion y modificar archivo // wf.EliminaRegistro(nodo.GetDireccion(Buscar(nodo, clave) - 1), nodo.GetDireccion(Buscar(nodo, clave))); EliminaClave(nodo, clave); if (nodo.M < d) { b = true; } else { wf.ModificaNodo(nodo); } } else { pos = Buscar(nodo, clave); b = BajaE(nodo.GetPtrs(pos), nombreArchivo); if (b) { if (pos - 1 >= 0) { if (nodo.GetPtrs(pos - 1).M > d /*&& nodo.GetPtrs(pos-1).Tipo == H*/) { PrestaClave(nodo.GetPtrs(pos), nodo.GetPtrs(pos - 1), nodo.GetClave(pos - 1)); nodo.SetClaves(clave, pos - 1); // wf.ModificaNodoIR(nodo); if (nodo.GetPtrs(pos).Tipo != H) { wf.ModificaNodoIR(nodo.GetPtrs(pos)); wf.ModificaNodoIR(nodo.GetPtrs(pos - 1)); } else { wf.ModificaNodo(nodo.GetPtrs(pos)); wf.ModificaNodo(nodo.GetPtrs(pos - 1)); } } else { Fusiona(nodo.GetPtrs(pos), nodo.GetPtrs(pos - 1), nodo.GetClave(pos - 1)); //modifica clave // clave = (pos == 0) ? 0 : pos - 1; clave = nodo.GetClave(pos - 1); EliminaClave(nodo, clave); //wf.ModificaNodoIR(nodo); if (pag_n.Tipo != H) { wf.ModificaNodoIR(pag_n); } else { wf.ModificaNodo(pag_n); } //agregar ptr y clave eliminada } } else { if (nodo.GetPtrs(pos + 1).M > d /*&& nodo.GetPtrs(pos).Tipo == H*/) { PrestaClave(nodo.GetPtrs(pos), nodo.GetPtrs(pos + 1), nodo.GetClave(pos)); nodo.SetClaves(clave, pos); // wf.ModificaNodoIR(nodo); if (nodo.GetPtrs(pos).Tipo != H) { wf.ModificaNodoIR(nodo.GetPtrs(pos)); wf.ModificaNodoIR(nodo.GetPtrs(pos + 1)); } else { wf.ModificaNodo(nodo.GetPtrs(pos)); wf.ModificaNodo(nodo.GetPtrs(pos + 1)); } } else { Fusiona(nodo.GetPtrs(pos), nodo.GetPtrs(pos + 1), nodo.GetClave(pos)); //modifica clave // clave = (pos == 0) ? 0 : pos - 1; clave = nodo.GetClave(pos); EliminaClave(nodo, clave); // wf.ModificaNodoIR(nodo); if (pag_n.Tipo != H) { wf.ModificaNodoIR(pag_n); } else { wf.ModificaNodo(pag_n); } //agregar nuevo nodo fusionado } } if (nodo.Tipo == R && nodo.M <= 0) { if (pag_n.Ptrs == null) { pag_n.Tipo = H; } else { pag_n.Tipo = R; } } if (nodo.M >= d && nodo.Tipo != R) { b = false; } else if (nodo.M > 0 && nodo.Tipo == R) { b = false; } if (!b) { wf.ModificaNodoIR(nodo); //modificar nodo actual } } } return(b); }
private bool Baja(TPagina nodo, Registro registro, string nombreArchivo) { bool b = false; WriteFile wf = new WriteFile(nombreArchivo); int pos; if (nodo.Tipo == H) { wf.InsertaRegistro(registro); // wf.InsertaRegistro(registro, nodo.M > 0 ? nodo.GetDireccion(Buscar(nodo, clave) - 1) : -1, nodo.M > 0 ? nodo.GetDireccion(Buscar(nodo, clave)) : -1); InsertaEnPag(nodo, clave, null, registro.Direccion); // nodo.SetDireccion(registro.Direccion, nodo.M - 1); if (nodo.M > 2 * d) { Divide(nodo); b = true; } else { wf.ModificaNodo(nodo); } } else { pos = Buscar(nodo, clave); b = Baja(nodo.GetPtrs(pos), registro, nombreArchivo); if (b) { if (pag_n.Tipo != H) { wf.InsertaNodoIR(pag_n); wf.ModificaNodoIR(nodo.GetPtrs(pos)); } else { wf.InsertaNodo(pag_n); wf.ModificaNodo(nodo.GetPtrs(pos)); } InsertaEnPag(nodo, clave, pag_n, pag_n.DireccionNodo); //escribir pag_n y actualizar nodo en pos //actualizar nodos despues de dividir if (nodo.M > 2 * d) { Divide(nodo); } else { b = false; if (nodo.Tipo != H) { wf.ModificaNodoIR(nodo); } else { wf.ModificaNodo(nodo); } //actualiza this nodo } } } return(b); }