Listas Doblemente Enlazadas.
Listas Doblemente Enlazadas.
Listas Doblemente Enlazadas.
LISTAS DOBLES
LISTAS DOBLES
El proceso es el siguiente:
1. nodo->siguiente debe apuntar a Lista.
2. nodo->anterior apuntar a Lista->anterior.
3. Lista->anterior debe apuntar a nodo.
Recuerda que Lista no tiene por qu apuntar a ningn miembro concreto de una
lista doblemente enlazada, cualquier miembro es igualmente vlido como
referencia.
2. Insertar un elemento en la ltima posicin de la lista:
Igual que en el caso anterior, partiremos de una lista no vaca, y de nuevo para
simplificar, que Lista est apuntando al ltimo elemento de la lista:
LISTAS DOBLES
El proceso es el siguiente:
1. nodo->siguiente debe apuntar a Lista->siguiente (NULL).
2. Lista->siguiente debe apuntar a nodo.
3. nodo->anterior apuntar a Lista.
1. Eliminamos el nodo.
2. Hacemos que Lista apunte a NULL.
LISTAS DOBLES
El paso 2 depara el nodo a borrar del resto de la lista, independientemente del nodo
al que apunte Lista.
Eliminar el ltimo nodo de una lista doblemente enlazada:
De nuevo tenemos los dos casos posibles, que el nodo a borrar est apuntado por
Lista o que no. Si lo est, simplemente hacemos que Lista sea Lista->anterior.
El paso 2 depara el nodo a borrar del resto de la lista, independientemente del nodo
al que apunte Lista.
LISTAS DOBLES
EJEMPLO
PROGRAMA QUE REALICE TODAS LAS OPERACIONES BASICAS EN UNA LISTA
DOBLEMENTE ENLAZADA
#include<conio.h>
#include<iostream.h>
struct nodo
{
int nro;
struct nodo* sgte;
struct nodo* ante;
};
typedef struct nodo* Tlista;
void InsertaAlInicio(Tlista&,int);
void InsertaAlFinal(Tlista&,int);
void EliminaAlInicio(Tlista&);
bool Busqueda(Tlista,int,int&);
void EliminarLista(Tlista&);
void Imprimir(Tlista);
void EliminaElemento(Tlista&,int);
void Ordenar(Tlista&);
void main(void)
LISTAS DOBLES
{
Tlista lista=NULL;
int opc,valor,pos;
bool R;
do
{
cout<<"======================================\n";
cout<<"=============== MENU =================\n";
cout<<"======================================\n";
cout<<"| 1.- Inserta al inicio
|\n";
cout<<"| 2.- Inserta al final
|\n";
cout<<"| 3.- Busqueda
|\n";
cout<<"| 4.- Eliminar Lista
|\n";
cout<<"| 5.- Listado [Izquierda - Derecha] |\n";
cout<<"| 6.- Elimina al inicio
|\n";
cout<<"| 7.- Elimina Elemento
|\n";
cout<<"| 8.- Ordenar Lista
|\n";
cout<<"| 9.- Salir
|\n";
cout<<"======================================\n";
cout<<"======================================\n";
cout<<"Ingrese Opcion: ";cin>>opc;
char opc0='s';
switch(opc)
{
case 1:
while(opc0=='s' || opc0=='S')
{
cout<<"=============================\n";
cout<<"Numero : ";cin>>valor;
InsertaAlInicio(lista,valor);
cout<<"Seguir ingresando [s/n]: ";cin>>opc0;
}
break;
case 2:
while(opc0=='s' || opc0=='S')
{
cout<<"=============================\n";
cout<<"Numero : ";cin>>valor;
InsertaAlFinal(lista,valor);
cout<<"Seguir ingresando [s/n]: ";cin>>opc0;
}
break;
case 3:
cout<<"=============================\n";
cout<<"Ingrese el valor a buscar: ";cin>>valor;
cout<<"\nListado\n";
Imprimir(lista);
R=Busqueda(lista,valor,pos);
if(R==true)
{
cout<<"\n\tValor buscado: "<<valor;
cout<<"\n\tEstado
: Existe";
cout<<"\n\tPosicion
: "<<pos;getch();
}
else
{
cout<<"\n\tValor buscado: "<<valor;
cout<<"\n\tEstado
: No Existe";
cout<<"\n\tPosicion
: Ninguna";
}
break;
case 4:
cout<<"=============================\n";
cout<<"\nElementos\n";
EliminarLista(lista);getch();
break;
case 5:
cout<<"=============================\n";
cout<<"\nListado\n";
Imprimir(lista);getch();
break;
LISTAS DOBLES
case 6:
cout<<"=============================\n";
EliminaAlInicio(lista);
getch();
break;
case 7:
cout<<"=============================\n";
cout<<"Ingrese el valor a eliminar: ";cin>>valor;
cout<<"\nEl metodo eliminara todos los elementos que \ncoincidan con el valor ingresado
...\n";
EliminaElemento(lista,valor);
getch();
break;
case 8:
cout<<"=============================\n";
cout<<"\nLista Ordenada\n";
Ordenar(lista);
Imprimir(lista);getch();
break;
} //FIN DEL SWITCH
clrscr();
}while(opc!=9);
}
void InsertaAlInicio(Tlista &lista,int valor)
{
Tlista pos,nu;
nu = new (struct nodo);
nu->nro = valor;
pos = lista;
if(lista == NULL)
{
lista = nu;
lista->sgte = NULL;
lista->ante = NULL;
}
else
{
nu->sgte = lista;
nu->ante = lista->ante;
lista->ante = nu;
lista = nu;
}
}
void InsertaAlFinal(Tlista &lista,int valor)
{
Tlista pos,nu;
nu = new (struct nodo);
nu->nro = valor;
pos = lista;
if(lista == NULL)
{
lista = nu;
lista->sgte = NULL;
lista->ante = NULL;
}
else
{
while (pos->sgte!= NULL) { pos = pos->sgte; }
nu->sgte = pos->sgte;
pos->sgte = nu;
nu->ante = pos;
}
}
LISTAS DOBLES
LISTAS DOBLES
{
lista->sgte->ante = NULL;
lista = lista->sgte;
}
else
{
if(aux->sgte == NULL) //Si el elemento se encuentra al final
{
aux->ante->sgte = NULL;
aux = aux->ante;
}
else
//Si el elemento se encuentra en otra posicin
{
aux->ante->sgte = aux->sgte;
aux->sgte->ante = aux->ante;
aux = aux->ante;
}
}
}
existe = true;
aux = aux->sgte;
}
fin:
if(existe)
{
cout<<"\nELEMENTO ELIMINADO!! ... Press Enter";
}
else
{
cout<<"\nEl Elemento NO EXISTE en la Lista! ... Press Enter";
}
}
void Ordenar(Tlista& lista)
{
Tlista aux1,aux2;
if(lista!=NULL)
{
aux1 = lista, aux2 = lista->sgte;
int cambiar;
while (aux1 != NULL)
{
aux2 = aux1->sgte;
while (aux2 != NULL)
{
if (aux1->nro >= aux2->nro)
{
cambiar = aux1->nro;
aux1->nro = aux2->nro;
aux2->nro = cambiar;
}
aux2 = aux2->sgte;
}
aux1 = aux1->sgte;
}
}
}