#ifndef LISTA_DOBLE_H_INCLUDED
#define LISTA_DOBLE_H_INCLUDED
#include<windows.h>
#include<stdio.h>
#include<conio.h>
typedef int elemento;
typedef int logico;
typedef int lado;
typedef struct Nodo{
elemento dato;
Nodo* sig;
Nodo* ant;
};
typedef Nodo* tnodo;//apuntador a nodo
typedef Nodo* posicion;//apuntador a nodo
void inicializa(tnodo &L)
{
L=new Nodo;
L->ant=NULL;
L->sig=NULL;
}
logico vacia_d(tnodo L)//vacia segun el lado
{
if(L->sig==NULL)
return 1;
return 0;
}
logico vacia_i(tnodo L)//vacia segun el lado
{
if(L->ant==NULL)
return 1;
return 0;
}
void imprime_d(tnodo L)
{
int bandera =0;
if(vacia_d(L))
printf("\nLista vacia\n");
else
{
tnodo aux = L->sig;//asignamos el inicio
printf("\n\n**Pares**\n");
printf("\nAscendente\n");
while(aux!=NULL && bandera==0)//hasta que llegue al final o encuentre el dato
{
if(aux->sig==NULL)//para imprimir el ultimo dato
{
printf("%i ",aux->dato);
bandera=1;
}
else
{
printf("%i ",aux->dato);//imprime todos los demas datos
aux=aux->sig;
}
}
printf("\nDesendente\n");//de regreso
while(aux!=L)
{
printf("%i ",aux->dato);
aux=aux->ant;
}
}
}
void imprime_i(tnodo L)
{
int bandera=0;
if(vacia_i(L))
printf("\nLista vacia\n");
else
{
tnodo aux= L->ant;//asignamos el inicio
printf("\n\n**Impares**\n");
printf("\nAscendente\n");
while(aux!=NULL && bandera==0)//hasta que llegue al final o encuentre el dato
{
if(aux->ant==NULL)//imprime el ultimo dato de la lista
{
printf("%i ",aux->dato);
bandera=1;
}
else
{
printf("%i ",aux->dato);//imprime todos los demas
aux=aux->ant;
}
}
printf("\nDesendente\n");//imprime de regreso
while(aux!=L)
{
printf("%i ",aux->dato);
aux=aux->sig;
}
}
}
void inserta_d(tnodo &L,elemento x,posicion p)//ingresa adelante de la posicion, caso especial para el ultimo
{
tnodo aux= new Nodo;
if(aux==NULL)
printf("Error. Memoria llena");
else
{
aux->dato=x;//asigna el dato
aux->sig=p->sig;//asigna la liga de sig
p->sig=aux;//asigna la ligadura de pos adelante de p
aux->ant=p;//asigna la ligadura de ant para ligarlo con p
if(aux->sig!=NULL)
aux->sig->ant=aux;//ligadura de ant del siguiente nodo a aux
}
}
void inserta_i(tnodo &L,elemento x,posicion p)
{
tnodo aux= new Nodo;
if(aux==NULL)
printf("Error. Memoria llena");
else
{
aux->dato=x;//asigna el dato
aux->ant=p->ant;//asigna la liga de anterior
p->ant=aux;//asigna la ligadura para insertar aux antes de p
aux->sig=p;//asigna la ligadura sig para ligarlo con p
if(aux->ant!=NULL)
aux->ant->sig=aux;//ligadura sig del anterior nodo a aux
}
}
int elimina_d(tnodo &L, posicion p)//caso especila para el ultimo, eliminamos p
{
if(vacia_d(L) || p == NULL)
return 0;
else
{
p->ant->sig = p->sig;
if(p->sig!=NULL)
p->sig->ant = p->ant;
free(p);
return 1;
}
}
int elimina_i(tnodo &L, posicion p)
{
if(vacia_d(L) || p == NULL)
return 0;
else
{
p->sig->ant = p->ant;
if(p->ant!=NULL)
p->ant->sig = p->sig;
free(p);
return 1;
}
}
posicion localiza_d(tnodo L,elemento x)
{
int bandera=0;
tnodo aux;
tnodo pos=NULL;
if(vacia_d(L))
{
return NULL;
}
else
{
aux = L->sig;//inicio
while(aux!=NULL && bandera == 0)//llega al final, no llega a comparar al ultimo en el while
{
if(aux->dato==x || (aux->sig==NULL && aux->dato==x))//si es igual o si el ultimo dato es igual
{
pos=aux;
bandera =1;
}
aux=aux->sig;
}
return pos;
}
}
posicion localiza_i(tnodo L,elemento x)
{
int bandera=0;
tnodo aux;
tnodo pos=NULL;
if(vacia_i(L))
{
return NULL;
}
else
{
aux = L->ant;//inicio
while(aux!=NULL && bandera == 0)//llega al final, no llega a comparar al ultimo en el while
{
if(aux->dato==x || (aux->ant==NULL && aux->dato==x))//si es igual o si el ultimo dato es igual
{
pos=aux;
bandera =1;
}
aux=aux->ant;
}
return pos;
}
}
elemento recupera(tnodo L, posicion p)
{
if(p!=NULL)//p es valido
return p->dato;
else//p es invalido
{
printf("\nNo se encontro\n");
return -1;
}
}
posicion primero(tnodo L)
{
return L;
}
posicion siguiente (tnodo L, posicion p)
{
return p->sig;
}
posicion anterior (tnodo L, posicion p)
{
return p->ant;
}
#endif // LISTA_DOBLE_H_INCLUDED
Be the first to comment
You can use [html][/html], [css][/css], [php][/php] and more to embed the code. Urls are automatically hyperlinked. Line breaks and paragraphs are automatically generated.