Sunteți pe pagina 1din 9

Informacin general:

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.

struct _nodo * pNext;

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:

Crear lista nueva.

Insertar elemento (Al inicio, al final y posterior al otro elemento).

Buscar elemento.

Eliminar elementos(El primer elemento, un elemento en base a su direccin).

Imprimir contenido de listas (Este uso ya depende del usuario).

Creacin de una lista nueva:


Para crear una nueva lista teniendo en cuenta el prototipo lo que utilizaremos son punteros, por lo cual suele ser
ms cmodo utilizar un typedef para ms comodidad. En cuanto a teora para crear una nueva lista deberamos:

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).

Se establecer un valor inicial para los elementos de la estructura.

El apuntador al siguiente elemento ser NULL, esto identificar la lista como vaca.

La funcin retornar la direccin de la lista creada (valor retornado por malloc).

Cdigo
1. _pNodo CrearLista(int valor)
2. {
3.

_pNodo Lista;

2/9

4.
5.

Lista = (_pNodo) malloc (sizeof(_Nodo));

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:

La funcin requerir el valor del elemento a ingresar y el inicio de la lista.

Crear un nuevo prototipo de estructura, lo llamaremos Nodo.

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.

_pNodo Auxiliar = ListaInicial;

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.

return NuevoNodo; /* Retornamos direccin del elemento insertado */

24. }

Insercin de elementos al principio:

La funcin requerir el valor del elemento a ingresar y el inicio de la lista.

Crear un nuevo Nodo, asignar el valor correspondiente.

El valor del campo siguiente elemento del Nodo creado deber ser correspondiente al valor principal de la
lista.

Retornamos el nuevo inicio de lista, correspondiente al nuevo Nodo.

Cdigo

4/9

1. _pNodo InsertarElementoAlInicio(int valor, _pNodo ListaInicial)


2. {
3.

_pNodo NuevoNodo;

4.

NuevoNodo = malloc(sizeof(_Nodo));

5.

NuevoNodo->valor = valor;

6.

NuevoNodo->pNext = ListaInicial;

7.
8.

return NuevoNodo; /* Retornamos nueva lista inicial */

9. }

Insercin de un elemento posterior a otro:

La funcin requerir el valor del elemento a ingresar y la direccin del elemento anterior a donde
ingresaremos el nuevo.

Creamos el nuevo nodo y asignamos los valores correspondientes.

El nuevo Nodo creado ahora apuntar al elemento que apuntaba el Nodo anterior a este.

El Nodo anterior apuntar al nuevo Nodo insertado.

Retornamos la direccin del nuevo Nodo.

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.

return NuevoNodo; /* Retornamos direccin del elemento insertado */

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:

Para esta funcin nicamente necesitaremos el inicio de lista.

Usaremos una variable auxiliar la cual nos ayudar a almacenar datos temporalmente.

Comprobamos si la lista est vaca, en tal caso dejamos todo igual.

Almacenamos el elemento inicial de lista en la variable auxiliar.

Ahora el inicio de lista apuntar tendr como valor el elemento al cual apuntaba.

Liberamos el espacio de memoria que contiene la variable auxiliar con free().

Cdigo
1. _pNodo EliminarPrimerElemento(_pNodo Lista)
2. {
3.

_pNodo Auxiliar;

4.

Auxiliar = Lista;

5.
6.

if (Auxiliar->pNext == NULL)

7.

8.

return Lista; /* Si no hay ms elementos dejamos todo igual */

9.

10.

Lista = Auxiliar->pNext;

6/9

11.

free(Auxiliar);

12.
13.

return Lista; /* Retornamos la nueva base de la lista */

14. }

Eliminar elemento por su direccin:

Necesitaremos inicio de lista y direccin del elemento a eliminarla.

Utilizamos una variable auxiliar para buscar el elemento anterior al elemento a eliminar recorriendo toda la
lista.

En caso de no encontrar el elemento comparando su direccin retornamos 0 (FALSE)

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.

Liberamos la memoria del elemento a eliminar.

Retornamos 1(TRUE).

Cdigo
1. int EliminarElemento(_pNodo Elemento, _pNodo Lista)
2. {
3.

_pNodo Auxiliar;

4.

Auxiliar = Lista;

5.

while (Auxiliar != NULL)

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:

Necesitaremos el valor a buscar y el inicio de lista.

8/9

Utilizaremos una variable auxiliar para no perder el inicio de la lista.

Recorremos toda la lista y vamos comparando si cada elemento es igual al buscado.

Una vez localizado simplemente retornamos la direccin del elemento.

Si no se lo encuentra se retornar NULL.

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.

return Auxiliar; /* Retornamos direccin del elemento encontrado */

15. }

9/9

S-ar putea să vă placă și