Operaciones en las Listas Enlazadas

 

Una lista enlazada requiere unos controles para la gestión de los elementos contenidos en ellas. Estos controles se manifiestan en forma de operaciones que tendrán las siguientes funciones:

  • Declaración de los tipos nodo y puntero a nodo.
  • Inicialización o creación.
  • Insertar elementos en una lista.
  • Eliminar elementos de una lista.
  • Buscar elementos de una lista (comprobar la existencia de elementos en una lista).
  • Recorrer una lista enlazada (visitar cada nodo de la lista).

A) Inserción de un elemento en la lista

A continuación el algoritmo de inserción y registro de los elementos:

  • declaración del elemento a insertar
  • asignación de la memoria para el nuevo elemento
  • rellenar el contenido del campo de datos
  • actualizar los punteros hacia el primer y último elemento si es necesario.
  • Caso particular: en una lista con un solo elemento, el primero es al mismo tiempo el último.
  • Actualizar el tamaño de la lista

Para añadir un elemento a la lista hay varios casos:

  • 1. Inserción en una lista vacía
  • 2. Inserción al inicio de la lista
  • 3. Inserción al final de la lista
  • 4. Inserción en otra parte de la lista.

1. Inserción en una lista vacía

 

Ejemplo de la función

int ins_en_lista_vacia (Lista *lista, char *dato);
La función devuelve 1 en caso de error, si no devuelve 0.

Etapas:

  • asignación de memoria para el nuevo elemento
  • rellenar el campo de datos del nuevo elemento
  • el punterosiguientedel nuevo elemento apuntará hacia NULL (ya que la inserción es hecha en una lista vacía se utiliza la dirección del punteroinicioque vale NULL)
  • los punterosinicioyfinapuntaran hacia el nuevo elemento
  • el tamaño es actualizado.
 

2.- Inserción al inicio de la Lista

Ejemplo de la función:

int ins_inicio_lista (Lista *lista,char *dato);

La función devuelve -1 en caso de error, si no devuelve 0.

Etapas:

  • asignación de memoria al nuevo elemento
  • rellenar el campo de datos del nuevo elemento
  • el punterosiguientedel nuevo elemento apunta hacia el primer elemento
  • el punteroinicioapunta hacia el nuevo elemento
  • el punterofinno cambia
  • el tamaño es incrementado

3. Inserción al final de la Lista

Ejemplo de la función:

int ins_fin_lista (Lista *lista, Element *actual, char *dato);


La función devuelve -1 en caso de error, si no devuelve 0.

Etapas:

  • asignación de memoria al nuevo elemento
  • rellenar el campo de datos del nuevo elemento
  • el punterosiguientedel último elemento apunta hacia el nuevo elemento
  • el punterofinapunta hacia el nuevo elemento
  • el punteroiniciono cambia
  • el tamaño es incrementado.

4. Inserción en otra parte de la lista

Ejemplo de la función:

int ins_lista (Lista *lista, char *dato,int pos);

La función devuelve -1 en caso de error, si no devuelve 0.

La inserción se efectuará después de haber pasado a la función una posición como argumento.
Si la posición indicada no tiene que ser el último elemento. En ese caso hay que utilizar la función de inserción al final de la lista.

Etapas:

  • asignación de memoria al nuevo elemento
  • rellenar el campo de datos del nuevo elemento
  • Elegir una posición en la lista (la inserción se hará después de haber elegido la posición)
  • el punterosiguientedel nuevo elemento apunta hacia la dirección a la que apunta el punterosiguientedel elemento actual.
  • el punterosiguientedel elemento actual apunta al nuevo elemento
  • los punterosinicioyfinno cambian
  • el tamaño se incrementa en una unidad.
 
 

B) Eliminación de un elemento de la lista

 

A continuación un algoritmo para eliminar un elemento de la lista:

  • uso de un puntero temporal para guardar la dirección de los elementos a eliminar
  • el elemento a eliminar se encuentra después del elemento actual

Apuntar el puntero siguiente del elemento actual hacia la dirección del puntero siguiente del elemento a eliminar

  • liberar la memoria ocupada por el elemento eliminado
  • actualizar el tamaño de la lista


Para eliminar un elemento de la lista hay varios casos:

  • 1. Eliminación al inicio de la lista
  • 2. Eliminación en otra parte de la lista.

1. Eliminación al inicio de la lista

Ejemplo de la función:

int sup_inicio (Lista *lista);

La función devuelve -1 en caso de error, si no devuelve 0.

Etapas:

  • el punterosup_elemcontendrá la dirección del 1er elemento
  • el punteroinicioapuntara hacia el 2do elemento
  • el tamaño de la lista disminuirá un elemento.

2. Eliminación en otra parte de la lista

 

Ejemplo de la función:

int sup_en_lista (Lista *lista, int pos);


La función devuelve -1 en caso de error, si no devuelve 0.

Etapas:

  • el punterosup_elem contendrá la dirección hacia la que apunta el punterosiguientedel elementoactual
  • el punterosiguientedel elemento actual apuntara hacia el elemento al que apunta el punterosiguientedel elemento que sigue al elementoactualen la lista.

Si el elemento actual es el penúltimo elemento, el puntero fin debe ser actualizado.

  • el tamaño de la lista será disminuido en un elemento.