Professional Documents
Culture Documents
Ahora que se tiene una nocin clara de punteros, se continuar con listas enlazadas.
Listas enlazadas
Es una estructura de datos bsica y puede ser usada para implementar otras estructuras de datos, consiste en una
secuencia de nodos, en los que se guardan campos de datos arbitrarios (informacin requerida) y una o dos referencias, enlaces o
punteros al nodo anterior y/o siguiente. Si no hay mas nodos el puntero apunta a un tipo vacio denominado NULL (nulo) o un
nodo ficticio para evitar que accidentalmente se apunte a un lugar arbitrario de la memoria. Las listas enlazadas son estructuras de
datos semejantes a los arrays salvo que el acceso a un elemento no se hace mediante un ndice sino mediante un puntero. La
asignacin de memoria es hecha durante la ejecucin.
La ventaja principal de las listas frente a los arrays es que las listas proveen una forma eficiente de mover nodos,
flexibilidad que se gana a costa del acceso arbitrario de un nodo de la lista, porque la nica forma de acceder a la lista es mediante
los enlaces desde el inicio. En un array los elementos estn contiguos en la memoria, en una lista los elementos estn dispersos.
Las listas enlazadas pueden ser implementadas en muchos lenguajes, Lisp y Schemen tiene estructuras de datos ya
construidas, junto con operaciones para acceder a las listas enlazadas. Lenguajes imperativos u orientados a objetos tales como C
C++ y Java, respectivamente, disponen de referencias para crear listas enlazadas.
Lista enlazada simple.
El puntero siguiente del ltimo elemento debe apuntar a NULL (el fin de la lista).
El puntero pInicio contendr la direccin del primer elemento de la lista.
Primero se crea la estructura de los nodos de una lista enlazada. Tiene dos miembros, el primero es string Nombre el cual
almacenara el nombre de un estudiante, jugador de ftbol, etc, en general una variable que almacena informacin, el segundo es:
Nodo* Siguiente, el cual guardar la referencia al siguiente nodo.
Se crea el formato de un nodo denominado 'Nodo'
struct Nodo
{
string Nombre;
Nodo* Siguiente;
};
Nodo* pInicio = NULL;
pInicio->Nombre = Sistemas;
Pg : 2
La impresin final es necesario, porque el buble while no lo har ni aun cuando alcance el nodo final. Se puede evitar esta
redundancia, permitiendo que el conductor camine fuera del ltimo vagn (la parte posterior del tren). Suicidio para el conductor
si se tratara de una persona real, pero el cdigo es ms sencillo, ya que tambin nos permite eliminar la comprobacin inicial de
NULL (si la raz es nula, el conductor se pondr de inmediato en NULL y el bucle nunca inicia):
conductor = pInicio;
while ( conductor != NULL ) {
cout<< conductor->Nombre;
conductor = conductor->Siguiente;
}
// "B"
Pg : 3
struct Nodo
// Nodo de la Lista
{ string Elemento; // Dato o elemento del Nodo
Nodo *Siguiente; // Puntero al siguiente Nodo
};
class Lista // Clase q administra la lista
{
Nodo *Primero; // Referencia al primer elemento
public:
Lista();
void Insertar(string);
//void Borrar(string);
void Mostrar(void);
void Invertir(void);
Nodo* ObtenerPrimero(void);
};
Lista::Lista() //Constructor
{
Primero=NULL;
}
Nodo* Lista::ObtenerPrimero(void)
{
return Primero;
}
void Lista::Insertar(string s)
{
Nodo *temp;
temp = new Nodo();
temp->Elemento = s;
temp->Siguiente = Primero;
Primero=temp;
}
void Lista::Mostrar(void)
{
Nodo *tmp = Primero;
while( tmp != NULL )
{
cout<<tmp->Elemento<<" ";
tmp=tmp->Siguiente;
}
cout<<endl;
}
void Lista::Invertir(void)
{
Nodo *x = Primero;
Nodo* siguiente = x;
Nodo* anterior = NULL;
while(x!=NULL)
{
siguiente=x->Siguiente; //Desplaza
x->Siguiente=anterior; //INVIERTE
anterior=x; //Desplaza
x=siguiente; //Desplaza
}
Primero = anterior;
}
int main()
{
Lista ListaSchindler;
ListaSchindler.Insertar("Ana");
ListaSchindler.Insertar("Bety");
ListaSchindler.Insertar("Chavo");
ListaSchindler.Insertar("Erick");
ListaSchindler.Invertir();
ListaSchindler.Mostrar();
Nodo *aux;
aux = ListaSchindler.ObtenerPrimero();
cout<<aux->Elemento<<endl;
aux = aux->Siguiente->Siguiente;
cout<<aux->Elemento<<endl;
return 0;
}
Ejercicios propuestos:
1. Dibuje la lista enlazada con los nodos insertados..
2. Al final del cdigo main(), inserte un nuevo nodo con su nombre entre los nodos Chavo y Erick, es decir, despus de la
referencia aux (a la derecha de aux). Para comprobar muestre el elementos de la lista.
3. Implemente la funcin miembro Borrar el cual recibe como parmetro el nombre del nodo a borrar ejemplo
ListaSchindler.Borrar("Bety"). Compruebe su respuesta mostrando la lista con el nodo borrado.
Pg : 4
Pg : 5
[6p]
Adan->izq
Adan->izq->izq
Abel->der->der->izq
B)
D)
F)
2.
B) 930
Suponga que
C) 101
Adan->der
Adan->der->der
Ninguna de las Anteriores.
D) 100
E) NULL
F) No compila.
[5p]
class ListaDoble
{ struct Nodo { char elemento;
struct Nodo *siguiente;
struct Nodo *anterior; };
private: struct Nodo *primero;
public: ListaDoble(void) { primero = NULL; } // Constructor: La lista inicia vaca.
//... el resto de funciones miembro ...
};
deseamos insertar un nodo en la clase ListaDoble, el nuevo nodo est dado por el siguiente puntero:
Y la posicin en la que se requiere insertar es justo ANTES (a la IZQUIERDA) del puntero current. Como se muestra en la
figura:
struct Nodo *current;
cu rren t
A
Escriba un cdigo apropiado para insertar el nodo en la lista. No escriba el cdigo entero de la funcin de insercin solo es
necesario 4 lneas para reordenar los puntero. Usted puede asumir que estamos insertando en la mitad de la lista, no en la primera
ni en la ltima posicin.