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, insertar un nodo

Creación de la estructura

typedef struct 
{
    pListaNodo primero;
    pListaNodo ultimo;
    pListaNodo ventana;
    int longitud;
} TLista ,*Lista;

Esta estructura nos permite administrar, una secuencia de nodos.

Esta estructura, nos permite manejar los nodos, a través de una variable de tipo Lista.
Cada vez que se crea o eliminada un nodo, los campos longitud, primero , ventana , último se tiene que actualizar.

CAMPOS

longitud : almacena el numero de elementos o nodos de la lista.

primero : guarda la dirección del primer nodo de la lista.

ventana : guarda la dirección del nodo visible o actual en un momento dado.

ultimo : guarda la dirección del último nodo de la lista.



CREAR LISTA ( Reservar memoria e inicializar los campos )


Lista inicLista( void )
{
    Lista aux = NULL;
    aux = (Lista) malloc(sizeof(TLista));
    aux->primero = aux->ventana = aux->ultimo = NULL;
    aux->longitud = 0;
    return aux;
}

INSERTAR UN NODO A LA LISTA (a continuación de la ventana)

void anxLista( Lista lst , TipoL elem);

PASOS :

Crear un nuevo nodo pListaNodo, asignando al campo info, algún elemento de tipo TipoL entregado como parámetro e inicializando el campo sig en NULL.

pListaNodo nuevo = (pListaNodo) malloc( sizeof (struct ListaNodo) );
nuevo->info = elem;
nuevo->sig = NULL;

A continuación actualizar los campos de la lista, para ubicar el nodo en forma correcta.
Por defecto, el nuevo nodo pasa a ser ventana de la lista y la longitud de la misma se incrementa en uno.

lst->ventana = nuevo;
lst->longitud++;    

Existen tres casos, para la inserción de un nodo :

1 ) Lista vacía

El nuevo nodo pasa a ser el primero y último de la lista

lst->primero = lst->ultimo = nuevo;

2 ) La ventana corresponde al ultimo nodo de la lista

Asignamos a ventana->sig el nuevo nodo , y este pasa a ser el útimo nodo de la lista.

lst->ventana->sig = lst->ultimo = nuevo;

3 ) La lista no es vacia y la ventana no corresponde al último nodo

Asignamos a nuevo->sig el nodo siguiente de la ventana y luego al campo a ventana->sig le asignamos el nodo nuevo.

nuevo->sig = lst->ventana->sig;
lst->ventana->sig = nuevo;

V : ventana
S : ventana->sig
N : nuevo

Por lo tanto la función sería :

void anxLista( Lista lst , TipoL elem)
{
   pListaNodo nuevo = (pListaNodo) malloc( sizeof (struct ListaNodo) );
   nuevo->info = elem;
   nuevo->sig = NULL;
    
   if (lst->longitud == 0)
      lst->primero = lst->ultimo = nuevo;
   else if (lst->ventana == lst->ultimo)
   {
      lst->ventana->sig = lst->ultimo = nuevo;
   }
   else
   {
      nuevo->sig = lst->ventana->sig;
      lst->ventana->sig = nuevo;
   }

   lst->ventana = nuevo;
   lst->longitud++;
}