Documente Academic
Documente Profesional
Documente Cultură
Las listas enlazadas son un recurso dinmico muy potente que nos permite realizar tareas que generalmente
podramos requerir con arrays, pero se impide en objetos estticos y en dinmicos sera muy complicado.
Una lista enlazada se basa en una estructura, la cual ser el esqueleto o prototipo del contenido, y al final requerir
tener un puntero hacia la siguiente estructura del mismo tipo, es decir estn enlazadas por su ubicacin (direccin
de memoria).
Funcionamiento y estructura:
Primero debemos tener la estructura o prototipo en el cual definiremos los datos que emplearemos y como debe
ser, un puntero a otra estructura del mismo tipo:
Cdigo
1. typedef struct _nodo
2. {
3.
int valor;
4.
5. }_Nodo;
Utilizamos typedef para evitar estar utilizando struct _nodo para todo, as abreviamos y hacemos el cdigo ms
legible.
Cdigo
1. typedef _Nodo * _pNodo;
Hay unas bases a tener en cuenta para trabajar con listas enlazadas:
El final de una lista ser determinada por un puntero con valor NULL, es decir el ltimo elemento tendr
como siguiente elemento a NULL.
Los elementos se pueden recorrer en un solo sentido (Inicio - Final), debido a que solo tenemos un
apuntador al siguiente y no al anterior, las listas que cuentan con esta opcin se conocen como doblemente
enlazadas. Las trataremos en otro tema.
Es muy importante mantener siempre el valor inicial de la lista, en caso de perderle sera muy difcil de
recuperar.
Es muy importante controlar muy bien los punteros hacia los elementos, un simple nmero distinto y
podramos causar perdida de control sobre el programa.
Recordemos, cada elemento tiene un apuntador al siguiente, por ello se llaman enlazados:
1/9
Para trabajar con listas, deberemos implementar una serie de funciones y procedimientos para el manejo de sus
elementos entre ellas:
Buscar elemento.
Crear una funcin cuyo tipo de valor de retorno ser el mismo del prototipo.
La funcin crear una estructura dinmica con el tamao del prototipo (malloc).
El apuntador al siguiente elemento ser NULL, esto identificar la lista como vaca.
Cdigo
1. _pNodo CrearLista(int valor)
2. {
3.
_pNodo Lista;
2/9
4.
5.
6.
Lista->valor = valor;
7.
Lista->pNext = NULL;
8.
9.
return Lista;
10. }
Insercin de elementos:
Para insertar nuevos elementos deberemos tener una lista previamente creada y contar con su referencia para
acceder a ella, adems se debern hacer mltiples comparaciones con fines de prevenir errores, como cuando la
lista est vaca, o el lugar donde se va a ingresar el nuevo elemento, etc.
Insertar elemento al final:
Comprobar si la lista est vaca, en tal caso simplemente modificar la direccin a la que apunta por el nodo
creado (NULL x Direccin nuevo Nodo). En caso de no estar vaca deberemos recorrer todos los elementos
hasta reconocer al que apunta al NULL y editar por la direccin del nuevo Nodo.
En caso de recorrer la lista no olvidar utilizar una variable auxiliar para no perder la lista principal.
Al ser un elemento que va al final, estar obligado a tener su campo de siguiente estructura a NULL.
En mi caso bajo utilice la idea de retornar la direccin del nuevo elemento insertado, muchos cdigos
retornan la misma lista ingresada, cuando en realidad esta no sufre modificaciones y no es til.
Cdigo
1. _pNodo InsertarElementoAlFinal(int valor, _pNodo ListaInicial)
2. {
3.
_pNodo NuevoNodo;
4.
5.
NuevoNodo =
malloc(sizeof(_Nodo));
6.
3/9
7.
NuevoNodo->valor = valor;
8.
NuevoNodo->pNext = NULL;
9.
10.
if (ListaInicial->pNext == NULL)
11.
12.
ListaInicial->pNext = NuevoNodo;
13.
14.
else
15.
16.
while(Auxiliar->pNext != NULL)
17.
18.
Auxiliar =
Auxiliar->pNext;
19.
20.
Auxiliar->pNext = NuevoNodo;
21.
22.
23.
24. }
El valor del campo siguiente elemento del Nodo creado deber ser correspondiente al valor principal de la
lista.
Cdigo
4/9
_pNodo NuevoNodo;
4.
NuevoNodo = malloc(sizeof(_Nodo));
5.
NuevoNodo->valor = valor;
6.
NuevoNodo->pNext = ListaInicial;
7.
8.
9. }
La funcin requerir el valor del elemento a ingresar y la direccin del elemento anterior a donde
ingresaremos el nuevo.
El nuevo Nodo creado ahora apuntar al elemento que apuntaba el Nodo anterior a este.
Cdigo
1. _pNodo InsertarElementoPosterior(int valor, _pNodo ElementoAnterior)
2. {
3.
_pNodo NuevoNodo;
4.
NuevoNodo = malloc(sizeof(_Nodo));
5.
6.
NuevoNodo->valor = valor;
7.
NuevoNodo->pNext = ElementoAnterior->pNext;
8.
5/9
9.
ElementoAnterior->pNext = NuevoNodo;
10.
11.
12. }
Eliminacin de elementos:
La eliminacin de elementos tambin es una funcin muy importante a la hora de trabajar con listas, sus
implementaciones pueden ser muchas debido a la gran cantidad de casos posibles, como eliminar el primer o
ltimo elemento, eliminar un elemento segn su direccin, posterior a otro, o buscando por valor (Eliminar primero,
ltimo o todos). Yo mostrar 2 casos, eliminando el primer elemento y eliminando por direccin del elemento.
Eliminacin del primer elemento:
Usaremos una variable auxiliar la cual nos ayudar a almacenar datos temporalmente.
Ahora el inicio de lista apuntar tendr como valor el elemento al cual apuntaba.
Cdigo
1. _pNodo EliminarPrimerElemento(_pNodo Lista)
2. {
3.
_pNodo Auxiliar;
4.
Auxiliar = Lista;
5.
6.
if (Auxiliar->pNext == NULL)
7.
8.
9.
10.
Lista = Auxiliar->pNext;
6/9
11.
free(Auxiliar);
12.
13.
14. }
Utilizamos una variable auxiliar para buscar el elemento anterior al elemento a eliminar recorriendo toda la
lista.
Comprobamos si el elemento a eliminar es el ltimo, en tal caso el elemento anterior apuntar a NULL, de
lo contrario el elemento anterior al que eliminamos apuntar al elemento que apuntaba el elemento que
eliminamos.
Retornamos 1(TRUE).
Cdigo
1. int EliminarElemento(_pNodo Elemento, _pNodo Lista)
2. {
3.
_pNodo Auxiliar;
4.
Auxiliar = Lista;
5.
6.
7.
if (Auxiliar->pNext == Elemento)
8.
9.
break;
10.
11.
Auxiliar = Auxiliar->pNext;
7/9
12.
13.
if (Auxiliar == NULL)
14.
15.
return 0;
16.
17.
else
18.
19.
if (Elemento->pNext == NULL)
20.
21.
Auxiliar->pNext = NULL;
22.
23.
else
24.
25.
Auxiliar->pNext = Elemento->pNext;
26.
27.
28.
free(Elemento);
29.
return 1;
30.
31. }
Bsqueda de elementos:
La bsqueda de elementos generalmente se realiza para localizar la posicin de un objeto comparando su valor, ya
que si se tiene su direccin simplemente haciendo referencia podramos acceder a su contenido.
Bsqueda por valor:
8/9
Cdigo
1. _pNodo BuscarElemento(int valor, _pNodo Lista)
2. {
3.
_pNodo Auxiliar;
4.
5.
Auxiliar = Lista;
6.
while(Auxiliar != NULL)
7.
8.
if (Auxiliar->valor == valor)
9.
10.
break;
11.
12.
Auxiliar = Auxiliar->pNext;
13.
14.
15. }
9/9