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

IMPLEMENTACION DE LISTA SENCILLAMENTE ENCADENADA

Estructura nodo

typedef struct ListaNodo
{
    TipoL info;
    struct ListaNodo *sig;
} *pListaNodo;

Estructura lista

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

Crea y retorna una lista vacía

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

Agrega un elemento después de la ventana

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++;
}

Retorna el nodo anterior a la ventana

pListaNodo 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;
    }
}

Elimina el elemento que se encuentra en la ventana

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--;
}

Elimina todos los elementos de la lista

void destruirLista(Lista lst)
{
    pListaNodo p,q;
    for(p = lst->primero ; p != NULL;)
    {
        q = p;
        p = p->sig;
        free(q);
    }
    free(lst);
}

Coloca la ventana sobre el primer elemento de la lista

void primLista(Lista lst)
{
    lst->ventana = lst->primero; 
}

Coloca la ventana sobre el último elemento de la lista

void ultLista(Lista lst)
{
    lst->ventana = lst->ultimo; 
}

Avanza la ventana una posición

void sigLista(Lista lst)
{
    lst->ventana = lst->ventana->sig; 
}

Coloca la ventana sobre el pos-ésimo elemento de la lista

void posLista(Lista lst,int pos)
{
    int i;
    for(lst->ventana = lst->primero , i = 1; i < pos; i++)
        lst->ventana = lst->ventana->sig; 
}

Retorna el elemento de la ventana

TipoL infoLista(Lista lst)
{
    return lst->ventana->info; 
}

Retorna el número de elementos de la lista

int longLista(Lista lst)
{
    return lst->longitud; 
}

Informa si la ventana está indefinida

int finLista(Lista lst)
{
    return lst->ventana == NULL;
}