You are on page 1of 5

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

You might also like