La Web del Programador: Comunidad de Programadores
 
    Pregunta:  819 - PUNTEROS Y ARBOLES AVL
Autor:  Mauricio Murgas
Estimados compañeros, necesito información de arboles AVL implementados en el lenguaje C++ (estructuras, balanceo), información avanzada de punteros en C++
(Ej. nodos apuntando a una lista enlazada). de antemano Gracias!!

  Respuesta:  Felipe Navarro Juillet
Mira loko... aca tengo un codigo implementado por mi de arboles avl.
Voy a postear solo los balanceos... si quieres mas informacion sobre la funcion ingresar, declarar y balancear, escribeme al correo.

Arbol *RotacionDI(Arbol *nodoarb)
{
Arbol *nda=NULL;
nda = nodoarb->der->izq;
nodoarb->der->izq = nda->der;
nda->der = nodoarb->der;
nodoarb->der = nda->izq;
nda->izq = nodoarb;
nodoarb = nda;
return nodoarb;
}

Arbol *RotacionDD(Arbol *nodoarb)
{
Arbol *nda=NULL;
nda=nodoarb->der;
nodoarb->der=nda->izq;
nda->izq=nodoarb;
nodoarb=nda;
return nodoarb;
}

Arbol *RotacionII(Arbol *nodoarb)
{
Arbol *nda=NULL;
nda=nodoarb->izq;
nodoarb->izq=nda->der;
nda->der=nodoarb;
nodoarb=nda;
return nodoarb;
}

Arbol *RotacionID(Arbol *nodoarb)
{
Arbol *nda=NULL;
nda = nodoarb->izq->der;
nodoarb->izq->der = nda->izq;
nda->izq = nodoarb->izq;
nodoarb->izq = nda->der;
nda->der = nodoarb;
nodoarb=nda;
return nodoarb;
}

Dependiendo del tipo de recursion de tus funciones, aveces no es necesario implementar las rotaciones dobles, ya que la recusion se encarga de hacerlo solo con las simples....

  Respuesta:  Marcos
hola:
Para poder encender los LEDS del teclado debes tenes dos posibilidades:
1-Usando la interrupción 16 para leer el byte de estado del teclado y activar cada uno de los bits que corresponden a los LEDS.
2-Accediendo a la dirección de memoria [$0040:$0017], poniendo la siguiente instrucción
var1=mem[$0040:$0017]
y lo que tenes que hacer es activar cada bit correspondiente a los LEDS.
Con eso creo que queda solucionado el problema, contestame si es que te solucione el problema.

  Respuesta:  Meganuke
Creo que la direccion es 0040:0017, porueva introduciendo los valores 10 , 30 , y 70 (hex)

  Respuesta:  Rogelio
Por la largada de la respuesta, esta en el archivo resp819.txt

  Respuesta:  Javier Juambeltz
El estado de los leds (mejor dicho de las teclas) se guarda en el byte ubicado en la posición de memoria 0040h:0097h.

Manipulando los bits de este byte podés encender o apagar los leds

Por la documentación que tengo yo el detalle de los bits es el siguiente:
Bit 0: Estado de Scroll Lock (1=encendido)
Bit 1: Estado de Num Lock
Bit 2: Estado de Caps Lock

Los Bits 3 a 7 son para teclas como INSERT pero varían.

Bit 4 --> SCROLL LOCK
Bit 5 --> NUM LOCK
Bit 6 --> CAPS LOCK
Bit 7 --> INSERT

Los 4 bits inferiores son de sólo lectura, los 4 bits superiores pueden tanto leerse (para saber los estados de las teclas) como escribirse (para activar o desactivarlas).

En todos los casos el bit igualado a 1 significa Led encendido, tecla presionada o tecla activada según el caso.

Espero que te ayude


  Respuesta:  Cristóbal Tello
Por la largada de la respuesta, esta en el archivo resp819b.txt

  Respuesta:  Aníbal Villalobos
Por la largada de la respuesta, esta en el archivo resp819c.txt

  Respuesta:  Ellery Villalobos Vargas
Hola Amigo.
Mira sobre arboles AVL´s te recomiendo un libro que se llama : Algoritmos y estructuras de datos, de Niklaus Wirth, ahi econtraras las implementaciones de insercion y borrado en arboles AVL´s, ahora bien el unico inconveniente es que esta implementado en Modula-2, pero pasarlo C, es facil.
Si tienes posibilidad de conseguir el libro esta bien , si no yo creo que puedo conseguir esa implementacion en algun lado.
Sobre punteros en C, como que tipo de informacion ocupas y yo te puedo contestar.
Hasta Luego

  Respuesta:  Jose L. De la Cruz
Hola, esta pequeña rutina activa la led de la tecla Mayusculas:
mov ax,40h
mov ds,ax
mov bx,17h
xor byte ptr [bx] , 01000000b
Espero que te sirva de ayuda...

  Respuesta:  Antoni Sanoguera
En la posición &H0040:0017 se encuentra un byte que contiene el estado de las teclas Num Lock,Caps Lock y Scroll Lock. Los bit que activan y desactivan los leds son los siguientes:
0:Scroll Lock
1:Num Lock
2:Caps Lock
La operatoria seria modificar el valor de este byte y luego llamar a la interrupcion &H16 con el registro ax=256.

  Respuesta:  JRC
La única forma que se me ocurre (y no te garantizo que funcione) es escribir en los puertos que controlan el estado del teclado por medio de la instrucción de ensamblador OUT.

Estos puertos son el 417h y el 418h.
El byte del 417h es:
BIT - FLAG 417h - FLAG 418h
7 - Ins (estado) - Ins (pulsado)
6 - Caps Lock (estado) - CL (pulsado)
5 - Num Lock (estado) - NL (pulsado)
4 - Scroll Lock (estado) - SL (pulsado)
3 - Alt (pulsado) - Crtl NumLock (estado
2 - CTRL (pulsado) - No se usa
1 - Left Mays (pulsado) - No se usa
0 - Right Mays (pulsado) - No se usa

Con una máscara que fuerce los bits 6,5 y 4 a 1 (encendido), quizá se enciendan los LEDS. Prueba a escribir en ambos puertos.


  Respuesta:  Gregorio Cobá Gala
En el area de datos del BIOS de la PC existe un área de memoria que contiene los status de los leds del teclado, sólo tienes que leerlos, determinar cuales están activos y los que deseas activar.

Si quieres más información envíame un e-mail detallando tu problema para ayudarte mas.

Con mucho gusto deseo ampliar mi respuesta para todos los usuarios que lo necesiten. Como mencioné en el correo anterior: El BIOS tiene un área de datos que utiliza para el control del hardware de la pc que a continuación te desglozo:

Seg:offset - Descripción
0040:0000 - Dirección de base de COM1
0040:0002 - Dirección de base de COM2
0040:0004 - Dirección de base de COM3
0040:0006 - Dirección de base de COM4
0040:0008 - Dirección de base de LPT1
0040:000A - Dirección de base de LPT2
0040:000C - Dirección de base de LPT3
0040:000E - Dirección de base de LPT4
0040:0010 - Byte menos significativo del hardware instalado
0040:0011 - Byte mas significativo del hardware instalado
0040:0013 - Tamaño de la memoria base desde 0kb hasta 640kb.
0040:0017 - Byte de estado del teclado
0040:0018 - Byte de estado del teclado

0040:001A - Cabeza de la memoria intermedia del teclado
0040:001C - Cola de la memoria intermedia del teclado
0040:001E - Memoria intermedia del teclado
0040:003E - Estado de recalibración del lector del diskette
0040:003F - Estado del motor del lector del diskette
0040:0040 - Contador de parada del motor del lector del diskette
0040:0041 - Estado de la operación anterior del lector del diskette
0040:0042 - Estado (7 bytes) del controlador del diskette
0040:0049 - Modo de video actual
0040:004A - No. de columnas de la pantalla
0040:0060 - Ultima línea del cursor
0040:0061 - Primera línea del cursor
0040:0062 - Página de video actual
0040:0063 - Dirección de base del controlador de video
0040:0065 - Contenido del registro 3x8
0040:0066 - Contenido del registro 3x9
0040:006C - Clicks del cronómetro desde la media nochoe
0040:0070 - Descarga del cronómetro desde la última lectura (pasada media noche)
0040:0071 - Estado de la tecla break
0040:0072 - Indicador de reinicio del sistema
0040:0074 - Estado de la última operación del disco duro
0040:0075 - Números de discos fijos
0040:0078 - Valor de intervalo de la impresora 1
0040:0079 - Valor de intervalo de la impresora 2
0040:007A - Valor de intervalo de la impresora 3
0040:007B - Valor de intervalo de la impresora 4
0040:007C - Valor de intervalo de COM1
0040:007D - Valor de intervalo de COM2
0040:007e - Valor de intervalo de COM3
0040:007f - Valor de intervalo de COM4
0040:0080 - Puntero de inicio de la memoria intermedia del teclado
0040:0082 - Puntero final de la memoria intermedia del teclado
0040:0084 - Número de líneas de video - 1
0040:0085 - Altura de un caracter en bytes por caracter
0040:0087 - Estado del control de video
0040:0088 - Estado del control de video
0040:0089 - Bits de control del VGA
0040:008B - Estado de control de soportes
0040:008C - Estado del controlador de disco duro
0040:008D - Estado de error de disco duro
0040:008E - Control de interrupión del disco duro
0040:0090 - Estado de soporte de la unidad de disco 0
0040:0091 - Estado del soporte de la unidad de disco 1
0040:0094 - Cilindro actual de la unidad de disco 0
0040:0095 - Cilindro actual de la unidad de disco 1
0040:0096 - Estado del modo del teclado
0040:0097 - Indicadores de los leds del teclado
0040:0098 - Desplazamiento del indicador de espera del usuario
0040:009A - Segmento del indicador de espera del usuario
0040:009C - Byte de menor peso del contador de espera del usuario
0040:009E - Byte de mayor peso del contador de espera del usuario
0040:00A0 - Indicador de espera del usuario activo
0050:0000 - Valor del estado de imprimir pantalla

Como podrás observar, te estoy señalando 3 direcciones que corresponden a los controles del teclado. Las dos primeras corresponden a las teclas que se están pulsando (shift, ctrl, alt, etc). y la última corresponde a los leds del teclado. Esta última dirección es un byte que en el que segun el estado de cada bit (0 ó 1) es el led del teclado que está encendido. Si cambias el estado de ese bit, también cambia el estado del led. En ensamblador puedes hacer lo siguiente:

PUSH ES
MOV AX, 0040h
MOV ES, AX
MOV AL, BYTE PTR ES:[0097h],

Con AND y OR lees y cambias el estado de los leds y para terminar restauras el valor del registro ES

POP ES