Control 6
Short Description
Control 6 Estructura de Datos IACC...
Description
Control 6 Jorge Olguín Leiva Estructura de Datos Instituto IACC 23/12/2017
1) Suponga que Ud. es un programador y le han solicitado que organice una base de datos de los estudiantes de una red de colegios pertenecientes a una congregación, para que sea manejada por el área administrativa. De acuerdo a sus conocimientos informáticos, concluye que lo mejor es trabajar los datos con listas doblemente enlazadas. Argumente adecuadamente su decisión tomando en cuenta las ventajas de usar este sistema de estructura de datos. 2) La siguiente lista doblemente enlazada tiene cinco nodos:
a) Si tuviera que insertar dos nodos uno entre los nodos 1 y 2 y el otro entre los nodos 3 y 4 ¿ cómo quedaría configurada la nueva lista doblemente enlazada? b) Y de la lista doblemente enlazada recién reconfigurada, que ahora cuenta con siete nodos, tuviera que borrar el nodo 2 ¿cómo quedaría configurada la nueva lista doblemente enlazada?
Desarrollo 1) Las listas doblemente enlazadas requieren más espacio por nodo y sus operaciones básicas resultan más costosas, pero ofrecen una mayor facilidad para manipular ya que permiten el acceso secuencial a la lista en ambas direcciones. En particular, uno puede insertar o borrar un nodo en un número fijo de operaciones dando únicamente la dirección de dicho nodo, a diferencia de las listas simples que requieren la dirección del nodo anterior para insertar o suprimir correctamente. Algunos algoritmos requieren el acceso en ambas direcciones. El doble enlace de los nodos permite recorrer la lista en cualquier dirección, mientras que agregar o eliminar un nodo en una lista doblemente enlazada requiere cambiar más enlaces que en estas mismas operaciones en una lista enlazada simple. Eso sí, las operaciones son más simples ya que no es necesario de mantener guardado el nodo anterior durante el recorrido ni necesidad de recorrer la lista completa para hallar el nodo anterior. La referencia del nodo que se quiere eliminar o insertar es lo único necesario. Al final lo que importa es el resultado y como con este tipo de listas doblemente enlazadas se tiene más facilidad de manipulación, es que se usa este tipo de lista.
2) a. Para la inserción de un nodo entre los nodos 1 y 2, además de 3 y 4, la nueva lista doblemente enlazada seria de la siguiente forma:
El puntero del nodo 1 siguiente, ahora va al nuevo nodo, así como el puntero del nodo 2 anterior, y el nuevo nodo apunta como anterior al nodo 1 y como siguiente al nodo 2. En ambos casos la misma secuencia, variando el numero del nodo por supuesto. Para inserción entre nodo 1 y nodo 2 * puntero siguiente de nodo 1 que apunta a nodo 2, ahora apunta a nuevo nodo * punero anterior de nuevo nodo apunta a nodo 1 * puntero anterior de nodo 2 que apuntaba a nodo 1, ahora apunta a nuevo nodo * puntero siguiente de nuevo nodo apunta a nodo 2 Para inserción entre nodo 3 y nodo 4 * puntero siguiente de nodo 3 que apunta a nodo 4, ahora apunta a nuevo nodo * punero anterior de nuevo nodo apunta a nodo 3 * puntero anterior de nodo 4 que apuntaba a nodo 3, ahora apunta a nuevo nodo * puntero siguiente de nuevo nodo apunta a nodo 4 La nueva estructura seria como sigue:
El código para esto sería: public void SplDoublyLinkedList::add ( mixed $index , mixed $newval )
Donde se inserta el valor dado por newval en el índice especificado por index, reorganizando el valor anterior a ese índice y todos los valores subsiguientes, a través de la lista. b. Al borrar el nodo 2 de esta nueva lista sería como sigue:
El puntero siguiente del nodo 1 ahora apunta al nodo 3 y el puntero anterior del nodo 3 ahora apunta al nodo 1, quedando fuera el nodo 2. Para la eliminación del nodo 2 seria. * puntero siguiente de nodo 1 que apunta a nodo 2, ahora apunta a nodo 3 * puntero anterior de nodo 3 que apuntaba a nodo 2, ahora apunta a nodo 1 * borrado de memoria La nueva estructura seria como sigue:
Como no encontré información de borrado de nodo intermedio, solo inicio y fin. Puede ser algo como esto: void borrar (posición p){ if (p->anterior !=NULL){ p->anterior->siguiente = p->siguiente; if (p->siguiente ¡!=NULL){ p->siguiente->anterior = p->anterior; } free (p); } }
Bibliografía 1.- Link 1 (Para respuesta 1) 2.- Link 2 (Para respuesta 1) 3.- Link 3 (código respuesta 1) 4.- Link 4 (Para respuesta 2b) 5.- Material entregado
View more...
Comments