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 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 CargaNodo(TPagina nodo, FileStream fs, long direccion) { fs.Seek(direccion, SeekOrigin.Begin); byte[] a = new byte[sizeof(long)]; fs.Read(a, 0, sizeof(long)); nodo.DireccionNodo = BitConverter.ToInt64(a, 0); a = new byte[sizeof(int)]; fs.Read(a, 0, sizeof(int)); nodo.Tipo = BitConverter.ToInt32(a, 0); int i; for (i = 0; i < 5; i++) { a = new byte[sizeof(long)]; fs.Read(a, 0, sizeof(long)); nodo.SetDireccion(BitConverter.ToInt64(a, 0), i); if (i < 4) { a = new byte[sizeof(int)]; fs.Read(a, 0, sizeof(int)); nodo.SetClaves(BitConverter.ToInt32(a, 0), i); if (nodo.GetClave(i) > 0) { nodo.M = i + 1; } } } }
public void InsercionEnArbolB(Registro registro, string nombreArchivo) { pag_n = new TPagina(); TPagina aux = new TPagina(); WriteFile wf = new WriteFile(nombreArchivo); bool b; if (raiz == null) { raiz = CreaPagina(d, H); raiz.SetClaves(clave, 0); raiz.M += 1; raiz.DireccionNodo = 8; wf.EscribeCabecera(raiz.DireccionNodo); wf.InsertaNodo(raiz); wf.InsertaRegistro(registro); raiz.SetDireccion(registro.Direccion, 0); wf.ModificaNodo(raiz); } else { b = Baja(raiz, registro, nombreArchivo); if (b) { aux = CreaPagina(d, R); raiz.Tipo = pag_n.Tipo; aux.SetPtrs(raiz, 0); aux.SetDireccion(raiz.DireccionNodo, 0); aux.SetClaves(clave, 0); aux.SetPtrs(pag_n, 1); if (pag_n.Tipo != H) { wf.InsertaNodoIR(pag_n); wf.ModificaNodoIR(raiz); } else { wf.InsertaNodo(pag_n); wf.ModificaNodo(raiz); } aux.SetDireccion(pag_n.DireccionNodo, 1); aux.M++; raiz = aux; wf.InsertaNodoIR(raiz); wf.EscribeCabecera(raiz.DireccionNodo); } } }
private int Buscar(TPagina nodo, int x) { int i = 0; while (i < nodo.M && nodo.GetClave(i) <= x) { i++; } return(i); }
private void buttonAgregar_Click(object sender, EventArgs e) { if (ChecaCampos()) { WriteFile wf = new WriteFile(nombArchivo); //crear registro CrearRegistro(); if (!File.Exists(nombArchivo)) { archivoCargado = true; wf.CreaArchivo(); DeshabilitaMenu(); } else if (!archivoCargado) { MessageBox.Show ( "El Archivo Ya Existe !!!", "Danger", MessageBoxButtons.OK, MessageBoxIcon.Exclamation ); } if (archivoCargado) { //insertar en arbol arboles.Clave = registro.ClaveBusqueda; arboles.InsercionEnArbolB(registro, nombArchivo); numRegistros = arboles.Count += 1; //leer archivo // insertar en tabla AgregarDatos(); LimpiaTablaArbol(); Carga(); TPagina aux = arboles.Raiz; AgregaArbol(aux, 0); } } else { MessageBox.Show ( "Campos Vacios", "Danger", MessageBoxButtons.OK, MessageBoxIcon.Exclamation ); } }
public void InsertaNodoIR(TPagina Nodo) { long r = -1; int c = -1; try { using (FileStream fs = new FileStream( path, FileMode.Open, FileAccess.Write)) { fs.Seek(0, SeekOrigin.End); using (BinaryWriter bw = new BinaryWriter(fs)) { Nodo.DireccionNodo = fs.Position; bw.Write(fs.Position); bw.Write(Nodo.Tipo); for (int i = 0; i < Nodo.Claves.Length; i++) { if (i < Nodo.M) { bw.Write(Nodo.GetDireccion(i)); bw.Write(Nodo.GetClave(i)); } else if (i == Nodo.M && Nodo.GetDireccion(i) > 0) { bw.Write(Nodo.GetDireccion(Nodo.M)); if (i < Nodo.Claves.Length - 1) { bw.Write(c); } } else { bw.Write(r); if (i < Nodo.Claves.Length - 1) { bw.Write(c); } } } } } } catch (FileNotFoundException ioE) { Console.WriteLine(ioE); } }
private void Fusiona(TPagina nodo1, TPagina nodo2, int clave) { if (nodo1.GetClave(nodo1.M - 1) < nodo2.GetClave(nodo2.M - 1)) { //fusion derecha pag_n = InsertaFusion(nodo1, nodo2, clave); } else { pag_n = InsertaFusion(nodo2, nodo1, clave); } pag_n.Tipo = nodo2.Tipo;//q pag_n.DireccionNodo = nodo2.DireccionNodo; }
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 CargaNodo(TPagina nodo, int k) { // LimpiaTablaArbol(); dataGridView2.Rows.Add(); dataGridView2.Rows[k].Cells[0].Value = nodo.DireccionNodo; dataGridView2.Rows[k].Cells[1].Value = nodo.Tipo; dataGridView2.Rows[k].Cells[2].Value = nodo.GetDireccion(0); dataGridView2.Rows[k].Cells[3].Value = nodo.GetClave(0); dataGridView2.Rows[k].Cells[4].Value = nodo.GetDireccion(1); dataGridView2.Rows[k].Cells[5].Value = nodo.GetClave(1); dataGridView2.Rows[k].Cells[6].Value = nodo.GetDireccion(2); dataGridView2.Rows[k].Cells[7].Value = nodo.GetClave(2); dataGridView2.Rows[k].Cells[8].Value = nodo.GetDireccion(3); dataGridView2.Rows[k].Cells[9].Value = nodo.GetClave(3); dataGridView2.Rows[k].Cells[10].Value = nodo.GetDireccion(4); }
private void buttonAbrir_Click(object sender, EventArgs e) { if (nombArchivo != "" && File.Exists(nombArchivo)) { Carga(); archivoCargado = true; DeshabilitaMenu(); AgregarDatos(); LimpiaTablaArbol(); TPagina aux = arboles.Raiz; indexA = 0; AgregaArbol(aux, 0); } else { MessageBox.Show("El Archivo No Existe o Se Cambio de Lugar"); } }
private void buttonEliminar_Click(object sender, EventArgs e) { if (ExisteClave((int)numericUpDownEliminar.Value)) { arboles.Clave = (int)numericUpDownEliminar.Value; arboles.EliminaEnArbolB(nombArchivo); AgregarDatos(); LimpiaTablaArbol(); Carga(); TPagina aux = arboles.Raiz; indexA = 0; AgregaArbol(aux, 0); numericUpDownEliminar.Value = 0; } else { MessageBox.Show("no existe"); } }
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; }
public void EliminaEnArbolB(string nombreArchivo) { pag_n = new TPagina(); TPagina aux = new TPagina(); WriteFile wf = new WriteFile(nombreArchivo); bool b; if (raiz != null) { b = BajaE(raiz, nombreArchivo); if (b && raiz.Tipo != H) { raiz = pag_n; wf.ModificaNodoIR(raiz);//if else wf.EscribeCabecera(raiz.DireccionNodo); } else if (b) { wf.ModificaNodo(raiz);//q } } }
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 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--; }
private TPagina CreaPagina(int d, int t) { TPagina nuevo = new TPagina(); int i; nuevo.M = 0; nuevo.Tipo = t; nuevo.Claves = new int[(2 * d) + 1]; nuevo.Direccion = new long[(2 * d) + 2]; if (nuevo.Tipo == H) { nuevo.Ptrs = null; } else { nuevo.Ptrs = new TPagina[(2 * d) + 2]; for (i = 0; i < 2 * d + 1; i++) { nuevo.SetPtrs(null, i); } } return(nuevo); }
public void SetPtrs(TPagina nuevo, int position) { ptrs[position] = nuevo; }
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); }
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); }
public Arboles(TPagina raiz) { this.raiz = raiz; }