Free Web Site - Free Web Space and Site Hosting - Web Hosting - Internet Store and Ecommerce Solution Provider - High Speed Internet
Search the Web

Estructura Lista, Eliminar un nodo

Cuando hablamos de eliminar un nodo, nos referimos a liberar memoria del nodo apuntado por la ventana de la lista y a actualizar el encadenamiento de los nodos.

ELIMINAR EL PRIMER NODO DE LA LISTA

Relativamente es muy fácil, ya que a este campo se llega a través de los campos primero y ventana de la lista.

Primero actualizamos el campo primero, para que apunte a primero->sig. Luego liberamos el nodo ventana y finalmente asignamos a ventana, el nodo primero.

lst->primero = lst->primero->sig;
free(lst->ventana);
lst->ventana = lst->primero;

Si el nodo primero que se elimina es único, debemos actualizar el campo ultimo de la lista a NULL.

if ( lst->primero = lst->ultimo ) lst->ultimo = NULL;


ELIMINAR UN NODO MEDIO

A : anterior
V : ventana
S : siguiente

En general se siguen los siguientes pasos :

  • Obtener el nodo anterior a la ventana --> ant (A)
  • Asignar a ant->sig el nodo ventana->sig
  • Guardar la ventana en una variable auxiliar
  • Actualizar campo ventana.
  • Liberar nodo ventana, a través de la variable auxiliar

    Para obtener el campo anterior a la ventana, implementamos una función que cumpla con lo que queremos. Una alternativa es :

    pNodoLista anterior(Lista lst)
    {
       if ( lst->ventana == NULL ) return NULL;
       else if ( lst->ventana == lst->primero ) return NULL;
       else
       {
          pListaNodo temp = lst->primero;
          while( temp != NULL )
             if ( temp->sig == lst->ventana ) break;
             else temp = temp->sig;
          return temp;
       }
    }
    

    Si la ventana apunta a NULL o si corresponde al primer nodo de la lista, se retorna NULL. En caso contrario, recorremos la lista a través de un ciclo, para buscar el nodo temp , que cumpla que temp->sig == ventana.

    Otra alternativa que existe, para mejorar el rendimiento para encontrar el nodo anterior , está en implementar la estructura nodo en forma doblemente encadenada. Además de declarar la estructura en forma distinta, hay que actualizar el manejo de la mayoría de las funciones.

    Estructura :

    typedef struct NodoLista
    {
       TipoL info;
       struct NodoLista *ant,*sig;
    } *pListaNodo;
    

    El campo ant, almacenara la dirección del nodo anterior.



    ELIMINAR EL ULTIMO NODO

    Se sigue el mismo procedimiento para eliminar un nodo medio, pero además el campo ultimo de la lista, se actualiza, asignando el nodo anterior al ultimo.

    En definitiva, la función quedaría de la siguiente forma :

    void elimLista(Lista lst)
    {
       pListaNodo aux , ant;
       if ( lst->ventana == lst->primero )
       {
          if ( lst->ultimo == lst->primero ) 
             lst->ultimo = NULL;
    
          lst->primero = lst->primero->sig;
          free(lst->ventana);
          lst->ventana = lst->primero;
       }
       else
       {
          if ( lst->ultimo == lst->ventana ) 
             lst->ultimo = anterior(lst);
    
          ant = anterior(lst);
          ant->sig = lst->ventana->sig;
          aux = lst->ventana;
          lst->ventana = lst->ventana->sig;
          free(aux);
       }   
    
       lst->longitud--;
    }