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